jbrowse-plugin-protein3d 0.8.3 → 0.8.4

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.
@@ -23,19 +23,36 @@ function isSessionWithWorkspaces(session) {
23
23
  // Missing BOTH is an embedded session: it has no workspaces, there is nothing
24
24
  // to ask for, and silence is the right answer.
25
25
  //
26
- // Missing ONE is a host that has workspaces but has changed how a view is
27
- // placed in them — and silence there is how this broke before. jbrowse-web
28
- // folded `setPendingMove` into its layout `init`, this guard went false, and
29
- // the plugin simply stopped asking for the split: no error, no missing
30
- // feature, just two views quietly stacking instead of sitting side by side.
31
- // Nobody noticed for weeks. Feature detection cannot ask the host to announce
32
- // a change, but it can tell "not supported here" from "supported, and gone".
26
+ // Missing ONE is a host that has workspaces but places views some other way —
27
+ // and silence there is how this broke before. jbrowse-web folded
28
+ // `setPendingMove` into its layout `init`, this guard went false, and the
29
+ // plugin simply stopped asking for the split: no error, no missing feature,
30
+ // just two views quietly stacking. Nobody noticed for weeks. Feature
31
+ // detection cannot ask the host to announce a change, but it can tell "not
32
+ // supported here" from "supported, and gone".
33
+ //
34
+ // Two very different hosts produce this one shape, and nothing on the session
35
+ // tells them apart, so the message carries both rather than the guess:
36
+ //
37
+ // - Releases through v4.3.0, where placement is `setPendingMoveToSplitRight`,
38
+ // a module function in @jbrowse/app-core's DockviewContext, not a session
39
+ // action. Nothing is wrong and nothing needs fixing; this plugin targets v5+
40
+ // and does not reach for v4's door. Measured 2026-08-17: v4.3.0 and latest
41
+ // stack, main splits.
42
+ // - A newer host that moved the action out from under us, which is the
43
+ // regression this warning exists to catch.
44
+ //
45
+ // Do not quiet the first case by sniffing the version. The alarm is only worth
46
+ // having if it fires on a shape it cannot explain, and these two shapes are
47
+ // identical.
33
48
  if (canEnable !== canPlace && !warnedPartial) {
34
49
  warnedPartial = true;
35
50
  console.warn(`jbrowse-plugin-protein3d: this session supports workspaces but not ` +
36
51
  `${canPlace ? 'setUseWorkspaces' : 'setPendingMove'}, so the ` +
37
- `side-by-side launch was skipped and the views will stack. The host's ` +
38
- `session API changed; the plugin needs updating to match.`);
52
+ `side-by-side launch was skipped and the views will stack. Expected on ` +
53
+ `releases through v4.3.0, which place views through @jbrowse/app-core ` +
54
+ `instead; on a newer host it means the session API moved and the plugin ` +
55
+ `needs updating to match.`);
39
56
  }
40
57
  return canEnable && canPlace;
41
58
  }
@@ -2,7 +2,7 @@
2
2
  `).slice(1).map(t=>t.trim()).filter(t=>!!t).flatMap((t,n)=>{let[o="",r,i]=t.split(","),s=Id.exec(o);return s&&r!==void 0&&i!==void 0?[{uniqueId:`feat-${n}`,ref:s[1],variant:s[3],start:+s[2]-1,end:+s[2],score:+r,am_class:i}]:[]})}var ko,Ka,Id,Co,Qa=T(()=>{"use strict";ko=p(ie()),Ka=p(vo());Ao();Id=/^([A-Za-z])(\d+)([A-Za-z])$/;Co=class extends Vt{async loadFeatures(){return Ja(await(0,Ka.openLocation)(this.getConf("location")).readFile("utf8"))}featureData(t,n){return{...t,refName:n,source:t.variant}}async getGlobalStats(t){let n=(await this.loadData()).map(o=>o.score);return{scoreMin:(0,ko.min)(n),scoreMax:(0,ko.max)(n)}}async getMultiRegionFeatureDensityStats(t){return{featureDensity:0}}async getSources(){return[...new Set((await this.loadData()).map(n=>n.variant))].map(n=>({name:n,__name:n}))}}});var Xa=z((Fb,Za)=>{Za.exports=JBrowseExports["@mui/material/utils"]});var se,nt=T(()=>{"use client";se=p(Xa(),1)});var ot=z((Db,el)=>{el.exports=JBrowseExports["react/jsx-runtime"]});var _e=z((Gb,ol)=>{ol.exports=JBrowseExports["@jbrowse/core/ui"]});var V=z((Hb,rl)=>{rl.exports=JBrowseExports["@mui/material"]});var ul,cl,ml=T(()=>{"use client";nt();ul=p(ot(),1),cl=(0,se.createSvgIcon)((0,ul.jsx)("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z"}),"OpenInNew")});function be(e){let{children:t,...n}=e;return Vr.default.createElement(dl.Link,{...n,target:"_blank",rel:"noreferrer"},t," ",Vr.default.createElement(cl,{fontSize:"small"}))}var Vr,dl,nn=T(()=>{"use strict";Vr=p(S());ml();dl=p(V())});function jn(e){return`https://rest.uniprot.org/uniprotkb/${e}.gff`}function gl(e){return`https://rest.uniprot.org/uniprotkb/${e}.fasta`}function Tn(e){return`https://www.uniprot.org/uniprotkb/${e}/entry`}function Gr(e,t="v6"){return`https://alphafold.ebi.ac.uk/files/AF-${e}-F1-model_${t}.cif`}function fl(e,t="v6"){return`https://alphafold.ebi.ac.uk/files/AF-${e}-F1-confidence_${t}.json`}function hl(e,t="v6"){return`https://alphafold.ebi.ac.uk/files/msa/AF-${e}-F1-msa_${t}.a3m`}function Io(e){return`https://files.rcsb.org/download/${e}.cif`}function Lo({url:e,data:t,uniprotId:n,pdbId:o}){return e!==void 0||t!==void 0?e:n!==void 0?Gr(n):o===void 0?void 0:Io(o)}function bl(e){let{host:t,file:n}=(()=>{try{let r=new URL(e);return{host:r.hostname,file:r.pathname.split("/").pop()}}catch{return{host:void 0,file:void 0}}})();return t===void 0||!Fd.includes(t)?void 0:/^(?:pdb)?([1-9][a-z0-9]{3})(?:_updated)?\.(?:cif|bcif|pdb|ent)(?:\.gz)?$/i.exec(n??"")?.[1]?.toLowerCase()}function Hr(e){return e.split(" ")[0]}function An(e){return/AF-([A-Z0-9]+)-F\d+/.exec(Hr(e))?.[1]}function yl(e,t){let n=Hr(e);if(n.startsWith("AF-"))return`https://alphafold.ebi.ac.uk/files/${n}.cif`;if(t==="pdb100"){let o=n.split("_")[0];if(o.length===4)return Io(o)}}function Sl(e){let t=Hr(e);if(t.startsWith("AF-"))return`https://alphafold.ebi.ac.uk/files/${t.replace("-model_","-confidence_")}.json`}var Fd,Pe=T(()=>{"use strict";Fd=["files.rcsb.org","www.ebi.ac.uk","ftp.ebi.ac.uk"]});function kl(e){let t=e.next();for(;!t.done&&t.value.trim()==="";)t=e.next();return t.value}var Ml=T(()=>{});function Ll(e){let t=e.trim();return t?t.split(/\s+/).every(o=>/^\d+$/.test(o)):!1}function Vd(e){let t=e.trim();return/^\w+\s+/.test(t)&&!Ll(e)}function Gd(e){return e.length>=3&&/^\d+$/.test(e[1])}function Hd(e,t){let o=e.trim().split(/\s+/),r=o[t],i=e.indexOf(r,e.indexOf(o[0])+o[0].length);return[i,i+r.length]}function Il(e){let t=kl(e),n=[],o="";if(!t)return;for(;t;)Ll(t)||(Vd(t)?n.push(t):o=t),t=e.next().value;if(n.length===0)return;let r=n.map(g=>g.trim().split(/\s+/)),i=r[0];if(!i)return;let s=Gd(i)?2:1,[l,a]=Hd(n[0],s),c=r.map(g=>g[0]),u=r.map(g=>g[s]),m=o.slice(l,a),d=u[0];if(d){let g=d.length-m.length;g>0&&(m+=" ".repeat(g))}return{ids:c,seqs:u,consensus:m}}function El(e){let t,n=Il(e);if(n!==void 0)for(;t=Il(e);){for(let o=0;o<t.seqs.length;o++)n.seqs[o]+=t.seqs[o];n.consensus+=t.consensus}return n}var Fl=T(()=>{Ml()});function Fo(e){let t=e.split(`
3
3
  `).filter(s=>!s.startsWith("#")).join(`
4
4
  `),n=El(t.split(`
5
- `)[Symbol.iterator]());if(n===void 0)throw new Error("No blocks parsed");let o=n.seqs.map((s,l)=>({id:n.ids[l],seq:s})),{consensus:r}=n,i=o[0];if(!i)throw new Error("No alignments found");if(r.length!==i.seq.length)throw new Error(`Consensus length !== sequence length. Con ${r.length} seq ${i.seq.length}`);if(o.length!==2)throw new Error(`Expected exactly 2 sequences in pairwise alignment, got ${o.length}`);return{consensus:r,alns:o}}var jr=T(()=>{Fl()});async function Jn(e,t){let n=await fetch(e,t);if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${e} ${await n.text()}`);return n}async function Ht(e,t){return(await Jn(e,t)).json()}function Do(e){return e.reason instanceof Error?e.reason:new Error("Aborted",{cause:e.reason})}function Ul(e,t){return new Promise((n,o)=>{if(t?.aborted)o(Do(t));else{let r=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(r),o(Do(t))},{once:!0})}})}var on=T(()=>{"use strict"});var Yl=z(Jl=>{"use strict";var Mn=S();function Jd(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Yd=typeof Object.is=="function"?Object.is:Jd,Qd=Mn.useState,$d=Mn.useEffect,Zd=Mn.useLayoutEffect,Xd=Mn.useDebugValue;function eg(e,t){var n=t(),o=Qd({inst:{value:n,getSnapshot:t}}),r=o[0].inst,i=o[1];return Zd(function(){r.value=n,r.getSnapshot=t,ei(r)&&i({inst:r})},[e,n,t]),$d(function(){return ei(r)&&i({inst:r}),e(function(){ei(r)&&i({inst:r})})},[e]),Xd(n),n}function ei(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!Yd(e,n)}catch{return!0}}function tg(e,t){return t()}var ng=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?tg:eg;Jl.useSyncExternalStore=Mn.useSyncExternalStore!==void 0?Mn.useSyncExternalStore:ng});var $l=z((p0,Ql)=>{"use strict";Ql.exports=Yl()});function Ho(e,t){var n,o;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((o=e.length)===t.length)for(;o--&&Ho(e[o],t[o]););return o===-1}if(!n||typeof e=="object"){o=0;for(n in e)if(Zl.call(e,n)&&++o&&!Zl.call(t,n)||!(n in t)||!Ho(e[n],t[n]))return!1;return Object.keys(t).length===o}}return e!==e&&t!==t}var Zl,Xl=T(()=>{Zl=Object.prototype.hasOwnProperty});async function bi(...e){let[t,n,o,r]=e,i=Ye({populateCache:!0,throwOnError:!0},typeof r=="boolean"?{revalidate:r}:r||{}),s=i.populateCache,l=i.rollbackOnError,a=i.optimisticData,c=d=>typeof l=="function"?l(d):l!==!1,u=i.throwOnError;if(Ve(n)){let d=n,g=[],h=t.keys();for(let b of h)!/^\$(inf|sub)\$/.test(b)&&d(t.get(b)._k)&&g.push(b);return Promise.all(g.map(m))}return m(n);async function m(d){let[g]=Zn(d);if(!g)return;let[h,b]=fi(t,g),[x,w,y,f]=Je.get(t),A=()=>{let pe=x[g];return(Ve(i.revalidate)?i.revalidate(h().data,d):i.revalidate!==!1)&&(delete y[g],delete f[g],pe&&pe[0])?pe[0](ci).then(()=>h().data):h().data};if(e.length<3)return A();let P=o,v,D=!1,E=$n();w[g]=[E,0];let I=!k(a),L=h(),oe=L.data,C=L._c,O=k(C)?oe:C;if(I&&(a=Ve(a)?a(O,oe):a,b({data:a,_c:O})),Ve(P))try{P=P(O)}catch(pe){v=pe,D=!0}if(P&&Oo(P))if(P=await P.catch(pe=>{v=pe,D=!0}),E!==w[g][0]){if(D)throw v;return P}else D&&I&&c(v)&&(s=!0,b({data:O,_c:J}));if(s&&!D)if(Ve(s)){let pe=s(P,O);b({data:pe,error:J,_c:J})}else b({data:P,error:J,_c:J});if(w[g][1]=$n(),Promise.resolve(A()).then(()=>{b({_c:J})}),D){if(u)throw v;return}return P}}var ye,pi,ui,ci,mi,di,Je,ut,J,Qn,k,Ve,Ye,Oo,ti,Bo,gi,In,ri,og,rg,fi,ii,ig,si,ai,sg,ag,lg,pg,ug,hi,At,np,Ln,ni,ep,Uo,cg,oi,mg,li,Zn,dg,$n,tp,op,gg,fg,zo,hg,bg,jo,yi,Ro,rp,Si=T(()=>{"use client";ye=p(S(),1);Xl();pi=0,ui=1,ci=2,mi=3,di=4,Je=new WeakMap,ut=()=>{},J=ut(),Qn=Object,k=e=>e===J,Ve=e=>typeof e=="function",Ye=(e,t)=>({...e,...t}),Oo=e=>Ve(e.then),ti={},Bo={},gi="undefined",In=typeof window!=gi,ri=typeof document!=gi,og=In&&"Deno"in window,rg=()=>In&&typeof window.requestAnimationFrame!=gi,fi=(e,t)=>{let n=Je.get(e);return[()=>!k(t)&&e.get(t)||ti,o=>{if(!k(t)){let r=e.get(t);t in Bo||(Bo[t]=r),n[5](t,Ye(r,o),r||ti)}},n[6],()=>!k(t)&&t in Bo?Bo[t]:!k(t)&&e.get(t)||ti]},ii=!0,ig=()=>ii,[si,ai]=In&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[ut,ut],sg=()=>{let e=ri&&document.visibilityState;return k(e)||e!=="hidden"},ag=e=>(ri&&document.addEventListener("visibilitychange",e),si("focus",e),()=>{ri&&document.removeEventListener("visibilitychange",e),ai("focus",e)}),lg=e=>{let t=()=>{ii=!0,e()},n=()=>{ii=!1};return si("online",t),si("offline",n),()=>{ai("online",t),ai("offline",n)}},pg={isOnline:ig,isVisible:sg},ug={initFocus:ag,initReconnect:lg},hi=!ye.default.useId,At=!In||og,np=e=>rg()?window.requestAnimationFrame(e):setTimeout(e,1),Ln=At?ye.useEffect:ye.useLayoutEffect,ni=typeof navigator<"u"&&navigator.connection,ep=!At&&ni&&(["slow-2g","2g"].includes(ni.effectiveType)||ni.saveData),Uo=new WeakMap,cg=e=>Qn.prototype.toString.call(e),oi=(e,t)=>e===`[object ${t}]`,mg=0,li=e=>{let t=typeof e,n=cg(e),o=oi(n,"Date"),r=oi(n,"RegExp"),i=oi(n,"Object"),s,l;if(Qn(e)===e&&!o&&!r){if(s=Uo.get(e),s)return s;if(s=++mg+"~",Uo.set(e,s),Array.isArray(e)){for(s="@",l=0;l<e.length;l++)s+=li(e[l])+",";Uo.set(e,s)}if(i){s="#";let a=Qn.keys(e).sort();for(;!k(l=a.pop());)k(e[l])||(s+=l+":"+li(e[l])+",");Uo.set(e,s)}}else s=o?e.toJSON():t=="symbol"?e.toString():t=="string"?JSON.stringify(e):""+e;return s},Zn=e=>{if(Ve(e))try{e=e()}catch{e=""}let t=e;return e=typeof e=="string"?e:(Array.isArray(e)?e.length:e)?li(e):"",[e,t]},dg=0,$n=()=>++dg;tp=(e,t)=>{for(let n in e)e[n][0]&&e[n][0](t)},op=(e,t)=>{if(!Je.has(e)){let o=Ye(ug,t),r=Object.create(null),i=bi.bind(J,e),s=ut,l=Object.create(null),a=(d,g)=>{let h=l[d]||[];return l[d]=h,h.push(g),()=>{let b=h.indexOf(g);b>=0&&(h[b]=h[h.length-1],h.pop())}},c=(d,g,h)=>{e.set(d,g);let b=l[d];if(b)for(let x of b)x(g,h)},u=d=>{let g=Je.get(e),[,h,b,x]=g,w=$n();g[8]++;for(let A in b)delete b[A];for(let A in x)delete x[A];for(let A in h)h[A]=[w,w];let y={};for(let A of[...e.keys()]){let P=e.get(A);e.delete(A);let v=l[A];if(v)for(let D of v)D(y,P)}let f=!d||d.revalidate!==!1;for(let A in r){let P=r[A];for(let v=0;v<P.length;v++)P[v](di,{revalidate:f&&!v})}},m=()=>{if(!Je.has(e)&&(Je.set(e,[r,Object.create(null),Object.create(null),Object.create(null),i,c,a,u,0]),!At)){let d=o.initFocus(setTimeout.bind(J,tp.bind(J,r,pi))),g=o.initReconnect(setTimeout.bind(J,tp.bind(J,r,ui)));s=()=>{d&&d(),g&&g(),Je.delete(e)}}};return m(),[e,i,m,s,u]}let n=Je.get(e);return[e,n[4],J,J,n[7]]},gg=(e,t,n,o,r)=>{let i=n.errorRetryCount,s=r.retryCount,l=~~((Math.random()+.5)*(1<<(s<8?s:8)))*n.errorRetryInterval;!k(i)&&s>i||setTimeout(o,l,r)},fg=Ho,[zo,hg,,,bg]=op(new Map),jo=Ye({onLoadingSlow:ut,onSuccess:ut,onError:ut,onErrorRetry:gg,onDiscarded:ut,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:ep?1e4:5e3,focusThrottleInterval:5*1e3,dedupingInterval:2*1e3,loadingTimeout:ep?5e3:3e3,compare:fg,isPaused:()=>!1,cache:zo,mutate:hg,unload:bg,fallback:{}},pg),yi=(e,t)=>{let n=Ye(e,t);if(t){let{use:o,fallback:r,cacheData:i}=e,{use:s,fallback:l,cacheData:a}=t;o&&s&&(n.use=o.concat(s)),r&&l&&(n.fallback=Ye(r,l)),i&&a&&(n.cacheData=Ye(i,a))}return n},Ro=(0,ye.createContext)({}),rp=e=>{let{value:t}=e,n=(0,ye.useContext)(Ro),o=Ve(t),r=(0,ye.useMemo)(()=>o?t(n):t,[o,n,t]),i=(0,ye.useMemo)(()=>o?r:yi(n,r),[o,n,r]),s=r&&r.provider,l=(0,ye.useRef)(J);s&&!l.current&&(l.current=op(s(i.cache||zo),r));let a=l.current;return a&&(i.cache=a[0],i.mutate=a[1],i.unload=a[4]),Ln(()=>{if(a)return a[2]&&a[2](),a[3]},[]),(0,ye.createElement)(Ro.Provider,Ye(e,{value:i}))}});var ip,sp=T(()=>{ip="$inf$"});var En,ap,yg,Sg,wg,xg,vg,Tg,lp,pp,up=T(()=>{Si();sp();En=p(S(),1),ap=In&&window.__SWR_DEVTOOLS_USE__,yg=ap?window.__SWR_DEVTOOLS_USE__:[],Sg=()=>{ap&&(window.__SWR_DEVTOOLS_REACT__=En.default)},wg=e=>Ve(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(e[1]===null?e[2]:e[1])||{}],xg=()=>{let e=(0,En.useContext)(Ro);return(0,En.useMemo)(()=>Ye(jo,e),[e])},vg=e=>(t,n,o)=>e(t,n&&((...i)=>{let[s]=Zn(t),[,,,l]=Je.get(zo);if(s.startsWith(ip))return n(...i);let a=l[s];return k(a)?n(...i):(delete l[s],a)}),o),Tg=yg.concat(vg),lp=e=>function(...n){let o=xg(),[r,i,s]=wg(n),l=yi(o,s),a=e,{use:c}=l,u=(c||[]).concat(Tg);for(let m=u.length;m--;)a=u[m](a);return a(r,i||l.fetcher||null,l)},pp=(e,t,n)=>{let o=t[e]||(t[e]=[]);return o.push(n),()=>{let r=o.indexOf(n);r>=0&&(o[r]=o[o.length-1],o.pop())}};Sg()});var ae,xi,_o,wi,Wo,Ag,Pg,S0,Ge,cp=T(()=>{ae=p(S(),1),xi=p($l(),1);up();Si();_o=ae.default.use||(e=>{switch(e.status){case"pending":throw e;case"fulfilled":return e.value;case"rejected":throw e.reason;default:throw e.status="pending",e.then(t=>{e.status="fulfilled",e.value=t},t=>{e.status="rejected",e.reason=t}),e}}),wi={dedupe:!0},Wo=Promise.resolve(J);Wo.status="fulfilled";Wo.value=J;Ag=()=>ut,Pg=(e,t,n)=>{var o;let{cache:r,compare:i,suspense:s,fallbackData:l,revalidateOnMount:a,revalidateIfStale:c,refreshInterval:u,refreshWhenHidden:m,refreshWhenOffline:d,keepPreviousData:g,strictServerPrefetchWarning:h}=n,[b,x,w,y]=Je.get(r),[f,A]=Zn(e),P=(0,ae.useRef)(!1),v=(0,ae.useRef)(!1),D=(0,ae.useRef)(f),E=(0,ae.useRef)(t),I=(0,ae.useRef)(n),L=()=>I.current,oe=()=>L().isVisible()&&L().isOnline(),[C,O,pe,Re]=fi(r,f),ke=(0,ae.useRef)({}).current,Me=k(l)?k(n.fallback)?J:n.fallback[f]:l,Ee=f?(o=n.cacheData)==null?void 0:o[f]:J,Oe=f?y[f]:J,Ie=k(Oe)&&!k(Ee),he=Ie?Ee:Oe,Wt=(N,W)=>{for(let re in ke){let te=re;if(te==="data"){if(!i(N[te],W[te])&&(!k(N[te])||!i(Et,W[te])))return!1}else if(W[te]!==N[te])return!1}return!0},It=!P.current,Kt=(0,ae.useMemo)(()=>{let N=C(),W=Re(),re=ce=>{let yt=Ye(ce);return delete yt._k,(()=>{if(!f||!t||L().isPaused())return!1;if(It&&!k(a))return a;if(s&&Ie)return!1;let Yt=k(Me)?yt.data:Me;return s?k(Yt)||c:k(Yt)||c})()?{isValidating:!0,isLoading:!0,...yt}:yt},te=re(N),et=N===W?te:re(W),qe=te;return[()=>{let ce=re(C());return Wt(ce,qe)?(qe.data=ce.data,qe.isLoading=ce.isLoading,qe.isValidating=ce.isValidating,qe.error=ce.error,qe):(qe=ce,ce)},()=>et]},[r,f]),Xe=(0,xi.useSyncExternalStore)((0,ae.useCallback)(N=>pe(f,(W,re)=>{Wt(re,W)||N()}),[r,f]),Kt[0],Kt[1]),Lt=b[f]&&b[f].length>0,ft=Xe.data,Fe=k(ft)?Me&&Oo(Me)?_o(Me):Me:ft,hn=Xe.error,bn=(0,ae.useRef)(Fe),Gn=(0,ae.useRef)(!1),Hn=(0,ae.useRef)(null),Et=g?k(ft)?k(bn.current)?Fe:bn.current:ft:Fe,ht=f&&k(Fe),Jt=(0,ae.useRef)(null);!At&&(0,xi.useSyncExternalStore)(Ag,()=>(Jt.current=!1,Jt),()=>(Jt.current=!0,Jt));let yr=Jt.current;h&&yr&&!s&&ht&&console.warn(`Missing pre-initiated data for serialized key "${f}" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set "strictServerPrefetchWarning: false" to disable this warning.`);let uo=!f||!t||L().isPaused()||Lt&&!k(hn)?!1:It&&!k(a)?a:s&&Ie?!1:s?k(Fe)?!1:c:k(Fe)||c,Ft=It&&uo,Bn=k(Xe.isValidating)?Ft:Xe.isValidating,Sr=k(Xe.isLoading)?Ft:Xe.isLoading,bt=(0,ae.useCallback)(async N=>{let W=E.current;if(!f||!W||v.current||L().isPaused())return!1;let re,te,et=!0,qe=N||{},ce=!w[f]||!qe.dedupe,yt=Ie&&!Gn.current&&!k(he)&&k(C().data),yn=()=>hi?!v.current&&f===D.current&&P.current:f===D.current,Yt={isValidating:!1,isLoading:!1},Ps=()=>{O(Yt)},Cs=()=>{let ze=w[f];ze&&ze[1]===te&&delete w[f]},ks={isValidating:!0};k(C().data)&&(ks.isLoading=!0);try{if(ce&&(O(ks),n.loadingTimeout&&k(C().data)&&setTimeout(()=>{et&&yn()&&L().onLoadingSlow(f,n)},n.loadingTimeout),yt&&(Gn.current=!0),w[f]=[yt?he:W(A),$n()],yt&&y[f]&&delete y[f]),[re,te]=w[f],re=await re,ce&&setTimeout(Cs,n.dedupingInterval),!w[f]||w[f][1]!==te)return ce&&yn()&&L().onDiscarded(f),!1;Yt.error=J;let ze=x[f];if(!k(ze)&&(te<=ze[0]||te<=ze[1]||ze[1]===0))return Ps(),ce&&yn()&&L().onDiscarded(f),!1;let St=C().data;Yt.data=i(St,re)?St:re,ce&&yn()&&L().onSuccess(re,f,n)}catch(ze){Cs();let St=L(),{shouldRetryOnError:wr}=St;St.isPaused()||(Yt.error=ze,ce&&yn()&&(St.onError(ze,f,St),(wr===!0||Ve(wr)&&wr(ze))&&(!L().revalidateOnFocus||!L().revalidateOnReconnect||oe())&&St.onErrorRetry(ze,f,St,ld=>{let xr=b[f];xr&&xr[0]&&xr[0](mi,ld)},{retryCount:(qe.retryCount||0)+1,dedupe:!0})))}return et=!1,Ps(),!0},[f,r]),Un=(0,ae.useCallback)((...N)=>bi(r,D.current,...N),[]);if(Ln(()=>{let N=Hn.current;N&&(Hn.current=null,k(C().data)&&O({data:N.data,error:J,_k:N._k}),y[N.key]&&delete y[N.key])}),Ln(()=>{E.current=t,I.current=n,k(ft)||(bn.current=ft)}),Ln(()=>{if(!f)return;let N=bt.bind(J,wi),W=0;L().revalidateOnFocus&&(W=Date.now()+L().focusThrottleInterval);let te=pp(f,b,(et,qe={})=>{if(et==pi){let ce=Date.now();L().revalidateOnFocus&&ce>W&&oe()&&(W=ce+L().focusThrottleInterval,N())}else if(et==ui)L().revalidateOnReconnect&&oe()&&N();else{if(et==ci)return bt();if(et==mi)return bt(qe);if(et==di&&(bn.current=J,qe.revalidate))return bt()}});return v.current=!1,D.current=f,P.current=!0,O({_k:A}),uo&&(w[f]||(k(Fe)||At?N():np(N))),()=>{v.current=!0,te()}},[f]),Ln(()=>{let N;function W(){let te=Ve(u)?u(C().data):u;te&&N!==-1&&(N=setTimeout(re,te))}function re(){!C().error&&(m||L().isVisible())&&(d||L().isOnline())?bt(wi).then(W):W()}return W(),()=>{N&&(clearTimeout(N),N=-1)}},[u,m,d,f]),(0,ae.useDebugValue)(Et),s){if(!hi&&At&&ht&&k(he))throw new Error("Fallback data is required when using Suspense in SSR.");ht&&(E.current=t,I.current=n,v.current=!1);let N=!k(he)&&ht,W=J;if(N&&Ie)W=he&&Oo(he)?_o(he):he,Fe=W,Et=W,At||(Gn.current=!0,Hn.current={data:W,_k:A,key:f});else{let te=N?Un(he):Wo;_o(te)}if(!k(hn)&&ht)throw hn;let re=ht&&k(W)?bt(wi):Wo;!k(Et)&&ht&&(re.status="fulfilled",re.value=!0),_o(re)}return{mutate:Un,get data(){return ke.data=!0,Et},get error(){return ke.error=!0,hn},get isValidating(){return ke.isValidating=!0,Bn},get isLoading(){return ke.isLoading=!0,Sr}}},S0=Qn.defineProperty(rp,"defaultValue",{value:jo}),Ge=lp(Pg)});var an=T(()=>{cp()});var Qe,ln=T(()=>{"use strict";Qe={revalidateOnFocus:!1,revalidateOnReconnect:!1,revalidateIfStale:!1}});function He(){return Qo||(Qo=import(Mg+"molstar-chunk-UJIWPKE3.js").catch(function(e){throw Qo=void 0,e})),Qo}var Sp,Mg,Qo,Fn=T(()=>{"use strict";Sp=typeof document<"u"?document.currentScript?.src:void 0,Mg=Sp?Sp.replace(/\/[^/]*$/,"/"):""});var $p,or,Ui=T(()=>{"use client";nt();$p=p(ot(),1),or=(0,se.createSvgIcon)((0,$p.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25"}),"Help")});var tu={};Qt(tu,{default:()=>eu});function Zp({children:e}){return Ce.default.createElement(dt.Typography,{style:{margin:4}},e)}function eu({handleClose:e}){return Ce.default.createElement(Xp.Dialog,{open:!0,maxWidth:"lg",onClose:e,title:"Help"},Ce.default.createElement(dt.DialogContent,null,Ce.default.createElement(Zp,null,"The procedure for the protein lookup is as follows:",Ce.default.createElement("ul",null,Ce.default.createElement("li",null,"(Automatic lookup) Searches UniProt for the transcript ID or gene name to retrieve the UniProt ID, which is then used to lookup the structure in AlphaFoldDB"),Ce.default.createElement("li",null,"(Manual) Allows you to choose your own structure file from your local machine (e.g. a PDB file predicted by e.g. ColabFold) or supply a specific URL"),Ce.default.createElement("li",null,"The residues from the structure are downloaded, and then you can choose the transcript isoform from the selected gene that best represents the structure. Asterisks are displayed if there is an exact sequence match"),Ce.default.createElement("li",null,"The residues from the structure are finally aligned to the to the selected transcript's protein sequence representation, and this creates a mapping from the reference genome coordinates to positions in the 3-D structure"),Ce.default.createElement("li",null,"Finally the molstar panel is opened, and this contains many specialized features features, plus additional mouseover and selection features supplied by the plugin to connect mouse click actions and mouse hover with coordinates on the linear genome view"))),Ce.default.createElement(Zp,null,"If you run into challenges with this workflow e.g. your transcripts are not being found in UniProt then you can use the Manual import form, or contact colin.diesh@gmail.com for troubleshooting")),Ce.default.createElement(dt.Divider,null),Ce.default.createElement(dt.DialogActions,null,Ce.default.createElement(dt.Button,{onClick:e,color:"primary"},"Close")))}var Ce,Xp,dt,nu=T(()=>{"use strict";Ce=p(S()),Xp=p(_e()),dt=p(V())});var Wi=z((ex,du)=>{du.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var fu=z((tx,gu)=>{gu.exports=JBrowseExports["@jbrowse/core/util/types/mst"]});var Dn=z((nx,hu)=>{hu.exports=JBrowseExports["mobx-state-tree"]});async function Su({plugin:e,colorScheme:t}){let{structures:n}=e.managers.structure.hierarchy.current;for(let o of n)await e.managers.structure.component.updateRepresentationsTheme(o.components,{color:t})}var Nn,yu,Ji=T(()=>{"use strict";Nn=[{value:"default",label:"Default (element/chain)"},{value:"plddt-confidence",label:"pLDDT confidence (AlphaFold)"},{value:"chain-id",label:"Chain"},{value:"secondary-structure",label:"Secondary structure"},{value:"hydrophobicity",label:"Hydrophobicity (Kyte-Doolittle)"},{value:"residue-name",label:"Residue type"},{value:"uncertainty",label:"B-factor / uncertainty"},{value:"molecule-type",label:"Molecule type"}],yu=Nn.map(e=>e.value)});var Bu,Uu,Ru,es,st=T(()=>{"use strict";Bu="rgba(255, 105, 180, 0.5)",Uu="2px solid #333",Ru="1px solid black",es="#999"});function pr({model:e,structureSeqPos:t}){let{genomeToTranscriptSeqMapping:n,pairwiseAlignment:o,structureSeqToTranscriptSeqPosition:r}=e;if(!n||!o)return;let{p2gCodon:i}=n,s=r?.[t];return s===void 0?void 0:fo(i,s)}function ns({model:e,structureSeqPos:t,structureSeqEndPos:n}){let o,r;for(let i=t;i<n;i++){let s=pr({structureSeqPos:i,model:e});if(s){let[l,a]=s;(o===void 0||l<o)&&(o=l),(r===void 0||a>r)&&(r=a)}}if(o!==void 0&&r!==void 0)return[o,r]}async function Mf({model:e,structureSeqPos:t,structureSeqEndPos:n,zoomToBaseLevel:o}){let r=(0,_u.getSession)(e),{connectedView:i,genomeToTranscriptSeqMapping:s}=e;if(!s||!i)return;let{strand:l,refName:a}=s,c=i.assemblyNames[0];if(!c)return;let u=n!==void 0?ns({structureSeqPos:t,structureSeqEndPos:n,model:e}):pr({structureSeqPos:t,model:e});if(!u)return;let[m,d]=u;if(o)await i.navToLocString(`${a}:${m+1}-${d}${l===-1?"[rev]":""}`,void 0,.2);else{let{assemblyManager:g}=r,b=g.get(c)?.getCanonicalRefName(a)??a;i.centerAt(m,b)}}async function ro({model:e,structureSeqPos:t,structureSeqEndPos:n}){e.setClickedStructureRange({start:t,end:n??t+1}),await Mf({model:e,structureSeqPos:t,structureSeqEndPos:n,zoomToBaseLevel:e.zoomToBaseLevel})}var _u,os=T(()=>{"use strict";_u=p(ie());lt()});function Ku(e){return Array.from(e,t=>If[t])}function Ju(e){return e<0?"#cccccc":e<=50?"#ff7d45":e<=70?"#ffdb13":e<=90?"#65cbf3":"#0053d6"}function Yu(e){let t=Math.max(0,Math.min(1,(e-Wu)/(Lf-Wu))),n=Math.round(51+179*t),o=Math.round(102+38*t),r=Math.round(204+-164*t);return`rgb(${n}, ${o}, ${r})`}function rs(e,t){return t?e.flatMap((n,o)=>{let r=t[o];return n!==void 0&&r!==void 0?[{col:r,value:n}]:[]}):[]}var If,Wu,Lf,is=T(()=>{"use strict";If={I:4.5,V:4.2,L:3.8,F:2.8,C:2.5,M:1.9,A:1.8,G:-.4,T:-.7,S:-.8,W:-.9,Y:-1.3,P:-1.6,H:-3.2,E:-3.5,Q:-3.5,D:-3.5,N:-3.5,K:-3.9,R:-4.5},Wu=-4.5,Lf=4.5});var Ue,Ae,nc,Rf,oc,rc=T(()=>{"use strict";Ue=p(S()),Ae=p(V());jr();nc=p($());lt();Rf=(0,nc.observer)(function({model:t}){let[n,o]=(0,Ue.useState)(""),[r,i]=(0,Ue.useState)(),{showManualAlignmentDialog:s,primaryStructure:l}=t,a=()=>{o(""),i(void 0),t.setShowManualAlignmentDialog(!1)},c=()=>{if(n.trim())try{let u=Fo(n.trim()),m=Tr(u);l?m?i(m):(l.setAlignment(u),a()):i("No structure loaded to apply alignment to")}catch(u){i(`Failed to parse alignment: ${u}`)}};return s?Ue.default.createElement(Ae.Dialog,{open:!0,onClose:a,maxWidth:"md",fullWidth:!0},Ue.default.createElement(Ae.DialogTitle,null,"Import manual alignment"),Ue.default.createElement(Ae.DialogContent,null,Ue.default.createElement(Ae.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Paste a pre-computed alignment in Clustal format. The first sequence should be the transcript and the second should be the structure."),Ue.default.createElement(Ae.TextField,{multiline:!0,rows:12,fullWidth:!0,placeholder:`Example:
5
+ `)[Symbol.iterator]());if(n===void 0)throw new Error("No blocks parsed");let o=n.seqs.map((s,l)=>({id:n.ids[l],seq:s})),{consensus:r}=n,i=o[0];if(!i)throw new Error("No alignments found");if(r.length!==i.seq.length)throw new Error(`Consensus length !== sequence length. Con ${r.length} seq ${i.seq.length}`);if(o.length!==2)throw new Error(`Expected exactly 2 sequences in pairwise alignment, got ${o.length}`);return{consensus:r,alns:o}}var jr=T(()=>{Fl()});async function Jn(e,t){let n=await fetch(e,t);if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${e} ${await n.text()}`);return n}async function Ht(e,t){return(await Jn(e,t)).json()}function Do(e){return e.reason instanceof Error?e.reason:new Error("Aborted",{cause:e.reason})}function Ul(e,t){return new Promise((n,o)=>{if(t?.aborted)o(Do(t));else{let r=setTimeout(n,e);t?.addEventListener("abort",()=>{clearTimeout(r),o(Do(t))},{once:!0})}})}var on=T(()=>{"use strict"});var Yl=z(Jl=>{"use strict";var Mn=S();function Jd(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Yd=typeof Object.is=="function"?Object.is:Jd,Qd=Mn.useState,$d=Mn.useEffect,Zd=Mn.useLayoutEffect,Xd=Mn.useDebugValue;function eg(e,t){var n=t(),o=Qd({inst:{value:n,getSnapshot:t}}),r=o[0].inst,i=o[1];return Zd(function(){r.value=n,r.getSnapshot=t,ei(r)&&i({inst:r})},[e,n,t]),$d(function(){return ei(r)&&i({inst:r}),e(function(){ei(r)&&i({inst:r})})},[e]),Xd(n),n}function ei(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!Yd(e,n)}catch{return!0}}function tg(e,t){return t()}var ng=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?tg:eg;Jl.useSyncExternalStore=Mn.useSyncExternalStore!==void 0?Mn.useSyncExternalStore:ng});var $l=z((p0,Ql)=>{"use strict";Ql.exports=Yl()});function Ho(e,t){var n,o;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((o=e.length)===t.length)for(;o--&&Ho(e[o],t[o]););return o===-1}if(!n||typeof e=="object"){o=0;for(n in e)if(Zl.call(e,n)&&++o&&!Zl.call(t,n)||!(n in t)||!Ho(e[n],t[n]))return!1;return Object.keys(t).length===o}}return e!==e&&t!==t}var Zl,Xl=T(()=>{Zl=Object.prototype.hasOwnProperty});async function bi(...e){let[t,n,o,r]=e,i=Ye({populateCache:!0,throwOnError:!0},typeof r=="boolean"?{revalidate:r}:r||{}),s=i.populateCache,l=i.rollbackOnError,a=i.optimisticData,c=d=>typeof l=="function"?l(d):l!==!1,u=i.throwOnError;if(Ve(n)){let d=n,g=[],h=t.keys();for(let b of h)!/^\$(inf|sub)\$/.test(b)&&d(t.get(b)._k)&&g.push(b);return Promise.all(g.map(m))}return m(n);async function m(d){let[g]=Zn(d);if(!g)return;let[h,b]=fi(t,g),[x,w,y,f]=Je.get(t),A=()=>{let pe=x[g];return(Ve(i.revalidate)?i.revalidate(h().data,d):i.revalidate!==!1)&&(delete y[g],delete f[g],pe&&pe[0])?pe[0](ci).then(()=>h().data):h().data};if(e.length<3)return A();let P=o,v,D=!1,E=$n();w[g]=[E,0];let I=!k(a),L=h(),oe=L.data,C=L._c,O=k(C)?oe:C;if(I&&(a=Ve(a)?a(O,oe):a,b({data:a,_c:O})),Ve(P))try{P=P(O)}catch(pe){v=pe,D=!0}if(P&&Oo(P))if(P=await P.catch(pe=>{v=pe,D=!0}),E!==w[g][0]){if(D)throw v;return P}else D&&I&&c(v)&&(s=!0,b({data:O,_c:J}));if(s&&!D)if(Ve(s)){let pe=s(P,O);b({data:pe,error:J,_c:J})}else b({data:P,error:J,_c:J});if(w[g][1]=$n(),Promise.resolve(A()).then(()=>{b({_c:J})}),D){if(u)throw v;return}return P}}var ye,pi,ui,ci,mi,di,Je,ut,J,Qn,k,Ve,Ye,Oo,ti,Bo,gi,In,ri,og,rg,fi,ii,ig,si,ai,sg,ag,lg,pg,ug,hi,At,np,Ln,ni,ep,Uo,cg,oi,mg,li,Zn,dg,$n,tp,op,gg,fg,zo,hg,bg,jo,yi,Ro,rp,Si=T(()=>{"use client";ye=p(S(),1);Xl();pi=0,ui=1,ci=2,mi=3,di=4,Je=new WeakMap,ut=()=>{},J=ut(),Qn=Object,k=e=>e===J,Ve=e=>typeof e=="function",Ye=(e,t)=>({...e,...t}),Oo=e=>Ve(e.then),ti={},Bo={},gi="undefined",In=typeof window!=gi,ri=typeof document!=gi,og=In&&"Deno"in window,rg=()=>In&&typeof window.requestAnimationFrame!=gi,fi=(e,t)=>{let n=Je.get(e);return[()=>!k(t)&&e.get(t)||ti,o=>{if(!k(t)){let r=e.get(t);t in Bo||(Bo[t]=r),n[5](t,Ye(r,o),r||ti)}},n[6],()=>!k(t)&&t in Bo?Bo[t]:!k(t)&&e.get(t)||ti]},ii=!0,ig=()=>ii,[si,ai]=In&&window.addEventListener?[window.addEventListener.bind(window),window.removeEventListener.bind(window)]:[ut,ut],sg=()=>{let e=ri&&document.visibilityState;return k(e)||e!=="hidden"},ag=e=>(ri&&document.addEventListener("visibilitychange",e),si("focus",e),()=>{ri&&document.removeEventListener("visibilitychange",e),ai("focus",e)}),lg=e=>{let t=()=>{ii=!0,e()},n=()=>{ii=!1};return si("online",t),si("offline",n),()=>{ai("online",t),ai("offline",n)}},pg={isOnline:ig,isVisible:sg},ug={initFocus:ag,initReconnect:lg},hi=!ye.default.useId,At=!In||og,np=e=>rg()?window.requestAnimationFrame(e):setTimeout(e,1),Ln=At?ye.useEffect:ye.useLayoutEffect,ni=typeof navigator<"u"&&navigator.connection,ep=!At&&ni&&(["slow-2g","2g"].includes(ni.effectiveType)||ni.saveData),Uo=new WeakMap,cg=e=>Qn.prototype.toString.call(e),oi=(e,t)=>e===`[object ${t}]`,mg=0,li=e=>{let t=typeof e,n=cg(e),o=oi(n,"Date"),r=oi(n,"RegExp"),i=oi(n,"Object"),s,l;if(Qn(e)===e&&!o&&!r){if(s=Uo.get(e),s)return s;if(s=++mg+"~",Uo.set(e,s),Array.isArray(e)){for(s="@",l=0;l<e.length;l++)s+=li(e[l])+",";Uo.set(e,s)}if(i){s="#";let a=Qn.keys(e).sort();for(;!k(l=a.pop());)k(e[l])||(s+=l+":"+li(e[l])+",");Uo.set(e,s)}}else s=o?e.toJSON():t=="symbol"?e.toString():t=="string"?JSON.stringify(e):""+e;return s},Zn=e=>{if(Ve(e))try{e=e()}catch{e=""}let t=e;return e=typeof e=="string"?e:(Array.isArray(e)?e.length:e)?li(e):"",[e,t]},dg=0,$n=()=>++dg;tp=(e,t)=>{for(let n in e)e[n][0]&&e[n][0](t)},op=(e,t)=>{if(!Je.has(e)){let o=Ye(ug,t),r=Object.create(null),i=bi.bind(J,e),s=ut,l=Object.create(null),a=(d,g)=>{let h=l[d]||[];return l[d]=h,h.push(g),()=>{let b=h.indexOf(g);b>=0&&(h[b]=h[h.length-1],h.pop())}},c=(d,g,h)=>{e.set(d,g);let b=l[d];if(b)for(let x of b)x(g,h)},u=d=>{let g=Je.get(e),[,h,b,x]=g,w=$n();g[8]++;for(let A in b)delete b[A];for(let A in x)delete x[A];for(let A in h)h[A]=[w,w];let y={};for(let A of[...e.keys()]){let P=e.get(A);e.delete(A);let v=l[A];if(v)for(let D of v)D(y,P)}let f=!d||d.revalidate!==!1;for(let A in r){let P=r[A];for(let v=0;v<P.length;v++)P[v](di,{revalidate:f&&!v})}},m=()=>{if(!Je.has(e)&&(Je.set(e,[r,Object.create(null),Object.create(null),Object.create(null),i,c,a,u,0]),!At)){let d=o.initFocus(setTimeout.bind(J,tp.bind(J,r,pi))),g=o.initReconnect(setTimeout.bind(J,tp.bind(J,r,ui)));s=()=>{d&&d(),g&&g(),Je.delete(e)}}};return m(),[e,i,m,s,u]}let n=Je.get(e);return[e,n[4],J,J,n[7]]},gg=(e,t,n,o,r)=>{let i=n.errorRetryCount,s=r.retryCount,l=~~((Math.random()+.5)*(1<<(s<8?s:8)))*n.errorRetryInterval;!k(i)&&s>i||setTimeout(o,l,r)},fg=Ho,[zo,hg,,,bg]=op(new Map),jo=Ye({onLoadingSlow:ut,onSuccess:ut,onError:ut,onErrorRetry:gg,onDiscarded:ut,revalidateOnFocus:!0,revalidateOnReconnect:!0,revalidateIfStale:!0,shouldRetryOnError:!0,errorRetryInterval:ep?1e4:5e3,focusThrottleInterval:5*1e3,dedupingInterval:2*1e3,loadingTimeout:ep?5e3:3e3,compare:fg,isPaused:()=>!1,cache:zo,mutate:hg,unload:bg,fallback:{}},pg),yi=(e,t)=>{let n=Ye(e,t);if(t){let{use:o,fallback:r,cacheData:i}=e,{use:s,fallback:l,cacheData:a}=t;o&&s&&(n.use=o.concat(s)),r&&l&&(n.fallback=Ye(r,l)),i&&a&&(n.cacheData=Ye(i,a))}return n},Ro=(0,ye.createContext)({}),rp=e=>{let{value:t}=e,n=(0,ye.useContext)(Ro),o=Ve(t),r=(0,ye.useMemo)(()=>o?t(n):t,[o,n,t]),i=(0,ye.useMemo)(()=>o?r:yi(n,r),[o,n,r]),s=r&&r.provider,l=(0,ye.useRef)(J);s&&!l.current&&(l.current=op(s(i.cache||zo),r));let a=l.current;return a&&(i.cache=a[0],i.mutate=a[1],i.unload=a[4]),Ln(()=>{if(a)return a[2]&&a[2](),a[3]},[]),(0,ye.createElement)(Ro.Provider,Ye(e,{value:i}))}});var ip,sp=T(()=>{ip="$inf$"});var En,ap,yg,Sg,wg,xg,vg,Tg,lp,pp,up=T(()=>{Si();sp();En=p(S(),1),ap=In&&window.__SWR_DEVTOOLS_USE__,yg=ap?window.__SWR_DEVTOOLS_USE__:[],Sg=()=>{ap&&(window.__SWR_DEVTOOLS_REACT__=En.default)},wg=e=>Ve(e[1])?[e[0],e[1],e[2]||{}]:[e[0],null,(e[1]===null?e[2]:e[1])||{}],xg=()=>{let e=(0,En.useContext)(Ro);return(0,En.useMemo)(()=>Ye(jo,e),[e])},vg=e=>(t,n,o)=>e(t,n&&((...i)=>{let[s]=Zn(t),[,,,l]=Je.get(zo);if(s.startsWith(ip))return n(...i);let a=l[s];return k(a)?n(...i):(delete l[s],a)}),o),Tg=yg.concat(vg),lp=e=>function(...n){let o=xg(),[r,i,s]=wg(n),l=yi(o,s),a=e,{use:c}=l,u=(c||[]).concat(Tg);for(let m=u.length;m--;)a=u[m](a);return a(r,i||l.fetcher||null,l)},pp=(e,t,n)=>{let o=t[e]||(t[e]=[]);return o.push(n),()=>{let r=o.indexOf(n);r>=0&&(o[r]=o[o.length-1],o.pop())}};Sg()});var ae,xi,_o,wi,Wo,Ag,Pg,S0,Ge,cp=T(()=>{ae=p(S(),1),xi=p($l(),1);up();Si();_o=ae.default.use||(e=>{switch(e.status){case"pending":throw e;case"fulfilled":return e.value;case"rejected":throw e.reason;default:throw e.status="pending",e.then(t=>{e.status="fulfilled",e.value=t},t=>{e.status="rejected",e.reason=t}),e}}),wi={dedupe:!0},Wo=Promise.resolve(J);Wo.status="fulfilled";Wo.value=J;Ag=()=>ut,Pg=(e,t,n)=>{var o;let{cache:r,compare:i,suspense:s,fallbackData:l,revalidateOnMount:a,revalidateIfStale:c,refreshInterval:u,refreshWhenHidden:m,refreshWhenOffline:d,keepPreviousData:g,strictServerPrefetchWarning:h}=n,[b,x,w,y]=Je.get(r),[f,A]=Zn(e),P=(0,ae.useRef)(!1),v=(0,ae.useRef)(!1),D=(0,ae.useRef)(f),E=(0,ae.useRef)(t),I=(0,ae.useRef)(n),L=()=>I.current,oe=()=>L().isVisible()&&L().isOnline(),[C,O,pe,Re]=fi(r,f),ke=(0,ae.useRef)({}).current,Me=k(l)?k(n.fallback)?J:n.fallback[f]:l,Ee=f?(o=n.cacheData)==null?void 0:o[f]:J,Oe=f?y[f]:J,Ie=k(Oe)&&!k(Ee),he=Ie?Ee:Oe,Wt=(N,W)=>{for(let re in ke){let te=re;if(te==="data"){if(!i(N[te],W[te])&&(!k(N[te])||!i(Et,W[te])))return!1}else if(W[te]!==N[te])return!1}return!0},It=!P.current,Kt=(0,ae.useMemo)(()=>{let N=C(),W=Re(),re=ce=>{let yt=Ye(ce);return delete yt._k,(()=>{if(!f||!t||L().isPaused())return!1;if(It&&!k(a))return a;if(s&&Ie)return!1;let Yt=k(Me)?yt.data:Me;return s?k(Yt)||c:k(Yt)||c})()?{isValidating:!0,isLoading:!0,...yt}:yt},te=re(N),et=N===W?te:re(W),qe=te;return[()=>{let ce=re(C());return Wt(ce,qe)?(qe.data=ce.data,qe.isLoading=ce.isLoading,qe.isValidating=ce.isValidating,qe.error=ce.error,qe):(qe=ce,ce)},()=>et]},[r,f]),Xe=(0,xi.useSyncExternalStore)((0,ae.useCallback)(N=>pe(f,(W,re)=>{Wt(re,W)||N()}),[r,f]),Kt[0],Kt[1]),Lt=b[f]&&b[f].length>0,ft=Xe.data,Fe=k(ft)?Me&&Oo(Me)?_o(Me):Me:ft,hn=Xe.error,bn=(0,ae.useRef)(Fe),Gn=(0,ae.useRef)(!1),Hn=(0,ae.useRef)(null),Et=g?k(ft)?k(bn.current)?Fe:bn.current:ft:Fe,ht=f&&k(Fe),Jt=(0,ae.useRef)(null);!At&&(0,xi.useSyncExternalStore)(Ag,()=>(Jt.current=!1,Jt),()=>(Jt.current=!0,Jt));let yr=Jt.current;h&&yr&&!s&&ht&&console.warn(`Missing pre-initiated data for serialized key "${f}" during server-side rendering. Data fetching should be initiated on the server and provided to SWR via fallback data. You can set "strictServerPrefetchWarning: false" to disable this warning.`);let uo=!f||!t||L().isPaused()||Lt&&!k(hn)?!1:It&&!k(a)?a:s&&Ie?!1:s?k(Fe)?!1:c:k(Fe)||c,Ft=It&&uo,Bn=k(Xe.isValidating)?Ft:Xe.isValidating,Sr=k(Xe.isLoading)?Ft:Xe.isLoading,bt=(0,ae.useCallback)(async N=>{let W=E.current;if(!f||!W||v.current||L().isPaused())return!1;let re,te,et=!0,qe=N||{},ce=!w[f]||!qe.dedupe,yt=Ie&&!Gn.current&&!k(he)&&k(C().data),yn=()=>hi?!v.current&&f===D.current&&P.current:f===D.current,Yt={isValidating:!1,isLoading:!1},Ps=()=>{O(Yt)},Cs=()=>{let ze=w[f];ze&&ze[1]===te&&delete w[f]},ks={isValidating:!0};k(C().data)&&(ks.isLoading=!0);try{if(ce&&(O(ks),n.loadingTimeout&&k(C().data)&&setTimeout(()=>{et&&yn()&&L().onLoadingSlow(f,n)},n.loadingTimeout),yt&&(Gn.current=!0),w[f]=[yt?he:W(A),$n()],yt&&y[f]&&delete y[f]),[re,te]=w[f],re=await re,ce&&setTimeout(Cs,n.dedupingInterval),!w[f]||w[f][1]!==te)return ce&&yn()&&L().onDiscarded(f),!1;Yt.error=J;let ze=x[f];if(!k(ze)&&(te<=ze[0]||te<=ze[1]||ze[1]===0))return Ps(),ce&&yn()&&L().onDiscarded(f),!1;let St=C().data;Yt.data=i(St,re)?St:re,ce&&yn()&&L().onSuccess(re,f,n)}catch(ze){Cs();let St=L(),{shouldRetryOnError:wr}=St;St.isPaused()||(Yt.error=ze,ce&&yn()&&(St.onError(ze,f,St),(wr===!0||Ve(wr)&&wr(ze))&&(!L().revalidateOnFocus||!L().revalidateOnReconnect||oe())&&St.onErrorRetry(ze,f,St,ld=>{let xr=b[f];xr&&xr[0]&&xr[0](mi,ld)},{retryCount:(qe.retryCount||0)+1,dedupe:!0})))}return et=!1,Ps(),!0},[f,r]),Un=(0,ae.useCallback)((...N)=>bi(r,D.current,...N),[]);if(Ln(()=>{let N=Hn.current;N&&(Hn.current=null,k(C().data)&&O({data:N.data,error:J,_k:N._k}),y[N.key]&&delete y[N.key])}),Ln(()=>{E.current=t,I.current=n,k(ft)||(bn.current=ft)}),Ln(()=>{if(!f)return;let N=bt.bind(J,wi),W=0;L().revalidateOnFocus&&(W=Date.now()+L().focusThrottleInterval);let te=pp(f,b,(et,qe={})=>{if(et==pi){let ce=Date.now();L().revalidateOnFocus&&ce>W&&oe()&&(W=ce+L().focusThrottleInterval,N())}else if(et==ui)L().revalidateOnReconnect&&oe()&&N();else{if(et==ci)return bt();if(et==mi)return bt(qe);if(et==di&&(bn.current=J,qe.revalidate))return bt()}});return v.current=!1,D.current=f,P.current=!0,O({_k:A}),uo&&(w[f]||(k(Fe)||At?N():np(N))),()=>{v.current=!0,te()}},[f]),Ln(()=>{let N;function W(){let te=Ve(u)?u(C().data):u;te&&N!==-1&&(N=setTimeout(re,te))}function re(){!C().error&&(m||L().isVisible())&&(d||L().isOnline())?bt(wi).then(W):W()}return W(),()=>{N&&(clearTimeout(N),N=-1)}},[u,m,d,f]),(0,ae.useDebugValue)(Et),s){if(!hi&&At&&ht&&k(he))throw new Error("Fallback data is required when using Suspense in SSR.");ht&&(E.current=t,I.current=n,v.current=!1);let N=!k(he)&&ht,W=J;if(N&&Ie)W=he&&Oo(he)?_o(he):he,Fe=W,Et=W,At||(Gn.current=!0,Hn.current={data:W,_k:A,key:f});else{let te=N?Un(he):Wo;_o(te)}if(!k(hn)&&ht)throw hn;let re=ht&&k(W)?bt(wi):Wo;!k(Et)&&ht&&(re.status="fulfilled",re.value=!0),_o(re)}return{mutate:Un,get data(){return ke.data=!0,Et},get error(){return ke.error=!0,hn},get isValidating(){return ke.isValidating=!0,Bn},get isLoading(){return ke.isLoading=!0,Sr}}},S0=Qn.defineProperty(rp,"defaultValue",{value:jo}),Ge=lp(Pg)});var an=T(()=>{cp()});var Qe,ln=T(()=>{"use strict";Qe={revalidateOnFocus:!1,revalidateOnReconnect:!1,revalidateIfStale:!1}});function He(){return Qo||(Qo=import(Mg+"molstar-chunk-JDIZPSL3.js").catch(function(e){throw Qo=void 0,e})),Qo}var Sp,Mg,Qo,Fn=T(()=>{"use strict";Sp=typeof document<"u"?document.currentScript?.src:void 0,Mg=Sp?Sp.replace(/\/[^/]*$/,"/"):""});var $p,or,Ui=T(()=>{"use client";nt();$p=p(ot(),1),or=(0,se.createSvgIcon)((0,$p.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 17h-2v-2h2zm2.07-7.75-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25"}),"Help")});var tu={};Qt(tu,{default:()=>eu});function Zp({children:e}){return Ce.default.createElement(dt.Typography,{style:{margin:4}},e)}function eu({handleClose:e}){return Ce.default.createElement(Xp.Dialog,{open:!0,maxWidth:"lg",onClose:e,title:"Help"},Ce.default.createElement(dt.DialogContent,null,Ce.default.createElement(Zp,null,"The procedure for the protein lookup is as follows:",Ce.default.createElement("ul",null,Ce.default.createElement("li",null,"(Automatic lookup) Searches UniProt for the transcript ID or gene name to retrieve the UniProt ID, which is then used to lookup the structure in AlphaFoldDB"),Ce.default.createElement("li",null,"(Manual) Allows you to choose your own structure file from your local machine (e.g. a PDB file predicted by e.g. ColabFold) or supply a specific URL"),Ce.default.createElement("li",null,"The residues from the structure are downloaded, and then you can choose the transcript isoform from the selected gene that best represents the structure. Asterisks are displayed if there is an exact sequence match"),Ce.default.createElement("li",null,"The residues from the structure are finally aligned to the to the selected transcript's protein sequence representation, and this creates a mapping from the reference genome coordinates to positions in the 3-D structure"),Ce.default.createElement("li",null,"Finally the molstar panel is opened, and this contains many specialized features features, plus additional mouseover and selection features supplied by the plugin to connect mouse click actions and mouse hover with coordinates on the linear genome view"))),Ce.default.createElement(Zp,null,"If you run into challenges with this workflow e.g. your transcripts are not being found in UniProt then you can use the Manual import form, or contact colin.diesh@gmail.com for troubleshooting")),Ce.default.createElement(dt.Divider,null),Ce.default.createElement(dt.DialogActions,null,Ce.default.createElement(dt.Button,{onClick:e,color:"primary"},"Close")))}var Ce,Xp,dt,nu=T(()=>{"use strict";Ce=p(S()),Xp=p(_e()),dt=p(V())});var Wi=z((ex,du)=>{du.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var fu=z((tx,gu)=>{gu.exports=JBrowseExports["@jbrowse/core/util/types/mst"]});var Dn=z((nx,hu)=>{hu.exports=JBrowseExports["mobx-state-tree"]});async function Su({plugin:e,colorScheme:t}){let{structures:n}=e.managers.structure.hierarchy.current;for(let o of n)await e.managers.structure.component.updateRepresentationsTheme(o.components,{color:t})}var Nn,yu,Ji=T(()=>{"use strict";Nn=[{value:"default",label:"Default (element/chain)"},{value:"plddt-confidence",label:"pLDDT confidence (AlphaFold)"},{value:"chain-id",label:"Chain"},{value:"secondary-structure",label:"Secondary structure"},{value:"hydrophobicity",label:"Hydrophobicity (Kyte-Doolittle)"},{value:"residue-name",label:"Residue type"},{value:"uncertainty",label:"B-factor / uncertainty"},{value:"molecule-type",label:"Molecule type"}],yu=Nn.map(e=>e.value)});var Bu,Uu,Ru,es,st=T(()=>{"use strict";Bu="rgba(255, 105, 180, 0.5)",Uu="2px solid #333",Ru="1px solid black",es="#999"});function pr({model:e,structureSeqPos:t}){let{genomeToTranscriptSeqMapping:n,pairwiseAlignment:o,structureSeqToTranscriptSeqPosition:r}=e;if(!n||!o)return;let{p2gCodon:i}=n,s=r?.[t];return s===void 0?void 0:fo(i,s)}function ns({model:e,structureSeqPos:t,structureSeqEndPos:n}){let o,r;for(let i=t;i<n;i++){let s=pr({structureSeqPos:i,model:e});if(s){let[l,a]=s;(o===void 0||l<o)&&(o=l),(r===void 0||a>r)&&(r=a)}}if(o!==void 0&&r!==void 0)return[o,r]}async function Mf({model:e,structureSeqPos:t,structureSeqEndPos:n,zoomToBaseLevel:o}){let r=(0,_u.getSession)(e),{connectedView:i,genomeToTranscriptSeqMapping:s}=e;if(!s||!i)return;let{strand:l,refName:a}=s,c=i.assemblyNames[0];if(!c)return;let u=n!==void 0?ns({structureSeqPos:t,structureSeqEndPos:n,model:e}):pr({structureSeqPos:t,model:e});if(!u)return;let[m,d]=u;if(o)await i.navToLocString(`${a}:${m+1}-${d}${l===-1?"[rev]":""}`,void 0,.2);else{let{assemblyManager:g}=r,b=g.get(c)?.getCanonicalRefName(a)??a;i.centerAt(m,b)}}async function ro({model:e,structureSeqPos:t,structureSeqEndPos:n}){e.setClickedStructureRange({start:t,end:n??t+1}),await Mf({model:e,structureSeqPos:t,structureSeqEndPos:n,zoomToBaseLevel:e.zoomToBaseLevel})}var _u,os=T(()=>{"use strict";_u=p(ie());lt()});function Ku(e){return Array.from(e,t=>If[t])}function Ju(e){return e<0?"#cccccc":e<=50?"#ff7d45":e<=70?"#ffdb13":e<=90?"#65cbf3":"#0053d6"}function Yu(e){let t=Math.max(0,Math.min(1,(e-Wu)/(Lf-Wu))),n=Math.round(51+179*t),o=Math.round(102+38*t),r=Math.round(204+-164*t);return`rgb(${n}, ${o}, ${r})`}function rs(e,t){return t?e.flatMap((n,o)=>{let r=t[o];return n!==void 0&&r!==void 0?[{col:r,value:n}]:[]}):[]}var If,Wu,Lf,is=T(()=>{"use strict";If={I:4.5,V:4.2,L:3.8,F:2.8,C:2.5,M:1.9,A:1.8,G:-.4,T:-.7,S:-.8,W:-.9,Y:-1.3,P:-1.6,H:-3.2,E:-3.5,Q:-3.5,D:-3.5,N:-3.5,K:-3.9,R:-4.5},Wu=-4.5,Lf=4.5});var Ue,Ae,nc,Rf,oc,rc=T(()=>{"use strict";Ue=p(S()),Ae=p(V());jr();nc=p($());lt();Rf=(0,nc.observer)(function({model:t}){let[n,o]=(0,Ue.useState)(""),[r,i]=(0,Ue.useState)(),{showManualAlignmentDialog:s,primaryStructure:l}=t,a=()=>{o(""),i(void 0),t.setShowManualAlignmentDialog(!1)},c=()=>{if(n.trim())try{let u=Fo(n.trim()),m=Tr(u);l?m?i(m):(l.setAlignment(u),a()):i("No structure loaded to apply alignment to")}catch(u){i(`Failed to parse alignment: ${u}`)}};return s?Ue.default.createElement(Ae.Dialog,{open:!0,onClose:a,maxWidth:"md",fullWidth:!0},Ue.default.createElement(Ae.DialogTitle,null,"Import manual alignment"),Ue.default.createElement(Ae.DialogContent,null,Ue.default.createElement(Ae.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Paste a pre-computed alignment in Clustal format. The first sequence should be the transcript and the second should be the structure."),Ue.default.createElement(Ae.TextField,{multiline:!0,rows:12,fullWidth:!0,placeholder:`Example:
6
6
  transcript MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG
7
7
  |||||||||||||||||||||||||||||||||||||
8
8
  structure MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG`,value:n,onChange:u=>{o(u.target.value),i(void 0)},slotProps:{htmlInput:{style:{fontFamily:"monospace",fontSize:12}}}}),r?Ue.default.createElement(Ae.Typography,{color:"error",variant:"body2",sx:{mt:1}},r):null),Ue.default.createElement(Ae.DialogActions,null,Ue.default.createElement(Ae.Button,{onClick:()=>{a()}},"Cancel"),Ue.default.createElement(Ae.Button,{onClick:()=>{c()},variant:"contained",color:"primary",disabled:!n.trim()},"Apply alignment"))):null}),oc=Rf});var ic,sc,ac=T(()=>{"use client";nt();ic=p(ot(),1),sc=(0,se.createSvgIcon)((0,ic.jsx)("path",{d:"M3 17v2h6v-2zM3 5v2h10V5zm10 16v-2h8v-2h-8v-2h-2v6zM7 9v2H3v2h4v2h2V9zm14 4v-2H11v2zm-6-4h2V7h4V5h-4V3h-2z"}),"Tune")});var pc=z((u1,lc)=>{lc.exports=JBrowseExports["@mui/material/Checkbox"]});var cc=z((c1,uc)=>{uc.exports=JBrowseExports["@mui/material/IconButton"]});var dc=z((m1,mc)=>{mc.exports=JBrowseExports["@mui/material/ListItemIcon"]});var fc=z((d1,gc)=>{gc.exports=JBrowseExports["@mui/material/ListItemText"]});var bc=z((g1,hc)=>{hc.exports=JBrowseExports["@mui/material/Menu"]});var Sc=z((f1,yc)=>{yc.exports=JBrowseExports["@mui/material/MenuItem"]});var xc=z((h1,wc)=>{wc.exports=JBrowseExports["@mui/material/TextField"]});var Tc=z((b1,vc)=>{vc.exports=JBrowseExports["@mui/material/Tooltip"]});var H,Ac,B,Pc,Of,Cc,kc=T(()=>{"use strict";H=p(S()),Ac=p(_e()),B=p(V()),Pc=p($()),Of=(0,Pc.observer)(function({model:t}){let[n,o]=(0,H.useState)(),[r,i]=(0,H.useState)(""),[s,l]=(0,H.useState)(""),[a,c]=(0,H.useState)("pdb"),[u,m]=(0,H.useState)(""),[d,g]=(0,H.useState)(),{showAddStructureDialog:h}=t,b=()=>{o(void 0),i(""),l(""),m(""),g(void 0),t.setShowAddStructureDialog(!1)},x=async()=>{try{let y=a==="pdb"&&r?{pdbId:r}:a==="uniprot"&&s?{uniprotId:s}:a==="url"&&u?{url:u}:a==="file"&&n?{data:await n.text()}:void 0;y&&(t.addStructure(y),b())}catch(y){console.error(y),g(y)}};if(!h)return null;let w=a==="url"&&u!==""||a==="file"&&n!==void 0||a==="pdb"&&r!==""||a==="uniprot"&&s!=="";return H.default.createElement(B.Dialog,{open:!0,onClose:b,maxWidth:"sm",fullWidth:!0},H.default.createElement(B.DialogTitle,null,"Add structure"),H.default.createElement(B.DialogContent,null,d?H.default.createElement(Ac.ErrorMessage,{error:d}):null,H.default.createElement(B.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Add another structure to superpose on the existing structure(s)."),H.default.createElement(B.FormControl,{component:"fieldset",sx:{mb:2}},H.default.createElement(B.RadioGroup,{value:a,onChange:y=>{c(y.target.value)}},H.default.createElement(B.FormControlLabel,{value:"pdb",control:H.default.createElement(B.Radio,null),label:"PDB ID"}),H.default.createElement(B.FormControlLabel,{value:"uniprot",control:H.default.createElement(B.Radio,null),label:"UniProt ID (AlphaFold)"}),H.default.createElement(B.FormControlLabel,{value:"url",control:H.default.createElement(B.Radio,null),label:"URL"}),H.default.createElement(B.FormControlLabel,{value:"file",control:H.default.createElement(B.Radio,null),label:"File"}))),a==="pdb"?H.default.createElement(B.TextField,{fullWidth:!0,value:r,onChange:y=>{i(y.target.value.toUpperCase())},label:"PDB ID (e.g. 1CRN)",placeholder:"Enter PDB ID",sx:{mb:2}}):null,a==="uniprot"?H.default.createElement(B.TextField,{fullWidth:!0,value:s,onChange:y=>{l(y.target.value.toUpperCase())},label:"UniProt ID (e.g. P04637)",placeholder:"Enter UniProt ID",helperText:"Will fetch the AlphaFold v6 predicted structure",sx:{mb:2}}):null,a==="url"?H.default.createElement(B.TextField,{fullWidth:!0,label:"Structure URL",value:u,onChange:y=>{m(y.target.value)},placeholder:"https://files.rcsb.org/download/1CRN.cif",sx:{mb:2}}):null,a==="file"?H.default.createElement("div",{style:{marginBottom:16}},H.default.createElement(B.Button,{variant:"outlined",component:"label"},n?n.name:"Choose file",H.default.createElement("input",{type:"file",hidden:!0,accept:".pdb,.cif,.mmcif,.ent",onChange:({target:y})=>{let f=y.files?.[0];f&&o(f)}})),n?H.default.createElement(B.Typography,{variant:"body2",sx:{mt:1}},"Selected: ",n.name):null):null,H.default.createElement(B.Typography,{variant:"body2",color:"text.secondary",sx:{mt:1}},"Tip: Structures will be automatically superposed using TM-align. For manual control, use the Mol* controls (\u{1F527} wrench icon).")),H.default.createElement(B.DialogActions,null,H.default.createElement(B.Button,{onClick:()=>{b()}},"Cancel"),H.default.createElement(B.Button,{onClick:()=>{x()},variant:"contained",color:"primary",disabled:!w},"Add structure")))}),Cc=Of});var Mc,Ic,zf,Lc,Ec=T(()=>{"use strict";Mc=p(S()),Ic=p($()),zf=(0,Ic.observer)(function({model:t}){let{structures:n}=t,o=n.map(r=>r.hoverString).filter(Boolean).join(" ");return Mc.default.createElement("div",{style:{flex:1,minWidth:0,whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis",fontSize:12},title:o},o?`Hover: ${o}`:"\xA0")}),Lc=zf});var Fc,qc,jf,Dc,Nc=T(()=>{"use strict";Fc=p(S()),qc=p($());st();jf=(0,qc.observer)(function({model:t}){let{alignmentHoverPos:n}=t;return n===void 0?null:Fc.default.createElement("div",{style:{position:"absolute",left:n*6,top:0,bottom:0,width:6,backgroundColor:Bu,pointerEvents:"none",zIndex:10}})}),Dc=jf});var Hc={};Qt(Hc,{default:()=>Gc});function ps({children:e}){return Pt.default.createElement(Ot.Typography,{style:{margin:4,marginBottom:12}},e)}function Gc({handleClose:e}){return Pt.default.createElement(Vc.Dialog,{open:!0,maxWidth:"lg",onClose:e,title:"Protein alignment"},Pt.default.createElement(Ot.DialogContent,null,Pt.default.createElement(ps,null,"This panel shows the computed pairwise alignment of the reference genome sequence to the structure sequence. The structure file (PDB file, mmCIF file, etc) has a stored representation of the e.g. amino acid sequence but the sequence in the structure file can differ from the sequence from the gene on the genome browser"),Pt.default.createElement(ps,null,"In order to resolve this, we align the two sequences together (using EMBOSS needle) to get pairwise alignment of the genome's representation of the protein and the structure file's representation of the protein."),Pt.default.createElement(ps,null,"If you need a 100% fidelity protein, you can do a folding with e.g. AlphaFold to make sure the structure you are using matches exactly the sequence of the transcript")),Pt.default.createElement(Ot.DialogActions,null,Pt.default.createElement(Ot.Button,{onClick:()=>{e()},variant:"contained",color:"primary"},"Close")))}var Pt,Vc,Ot,Bc=T(()=>{"use strict";Pt=p(S()),Vc=p(_e()),Ot=p(V())});function us({model:e}){return ao.default.createElement(Rc.IconButton,{style:{float:"right"},onClick:()=>{(0,Uc.getSession)(e).queueDialog(t=>[_f,{handleClose:t}])}},ao.default.createElement(or,null))}var ao,Uc,Rc,_f,Oc=T(()=>{"use strict";ao=p(S()),Uc=p(ie());Ui();Rc=p(V()),_f=(0,ao.lazy)(()=>Promise.resolve().then(()=>(Bc(),Hc)))});function zc(e){return Wf[e]??"#999999"}async function Kf(e){let t=await(await Jn(e)).text(),n=[];for(let o of t.split(`
@@ -14,7 +14,7 @@ structure MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG`,value:n,onChange:u=>{o(u.targ
14
14
  ${t}`,...Object.values(s).map(({feature:u,seq:m})=>`>${je(u)}
15
15
  ${m}`)].join(`
16
16
  `):[`${a.padEnd(c)}${l?"*":" "} ${t}`,l?`${je(l[1].feature).padEnd(c)}* ${l[1].seq}`:void 0,...Object.entries(s).filter(([u])=>u!==l?.[0]).map(([u,m])=>`${je(m.feature).padEnd(c)} ${m.seq}`)].filter(u=>!!u).join(`
17
- `),slotProps:{input:{readOnly:!0,classes:{input:o.textAreaFont}}}}))}function zn({structureSequence:e,structureName:t,isoformSequences:n}){let[o,r]=(0,vn.useState)(!1);return vn.default.createElement("div",{style:{margin:10}},vn.default.createElement(pl.Button,{variant:"contained",color:"primary",onClick:()=>{r(!o)}},o?"Hide all isoform protein sequences":"Show all isoform protein sequences"),o?vn.default.createElement(Nr,{structureSequence:e,structureName:t,isoformSequences:n}):null)}nn();Pe();function qd({uniprotId:e}){return De.default.createElement(_n.Typography,null,"No structure found for this UniProtID in AlphaFoldDB"," ",De.default.createElement(be,{href:`https://alphafold.ebi.ac.uk/search/text/${e}`},"(search for results)"))}function Br({uniprotId:e,selectedTranscript:t,structureSequence:n,isoformSequences:o,url:r}){return e?De.default.createElement(De.default.Fragment,null,De.default.createElement("div",null,De.default.createElement(_n.Typography,null,"UniProt link:"," ",De.default.createElement(be,{href:Tn(e)},e)),De.default.createElement(_n.Typography,null,"AlphaFoldDB link: ",De.default.createElement(be,{href:r},r))),n?De.default.createElement(zn,{structureSequence:n,structureName:e,isoformSequences:o}):De.default.createElement(qd,{uniprotId:e})):De.default.createElement(_n.Typography,null,"Searching"," ",t?je(t):"transcript"," ","for UniProt ID")}var Gt=p(S()),pt=p(V());function Ur({recognizedIds:e,geneName:t,selectedId:n,onSelectedIdChange:o}){let[r,i]=(0,Gt.useState)(!1),s=[{value:"auto",label:"Auto (try all)"},...e.map(l=>({value:l,label:ba(l)}))];return t&&s.push({value:`gene:${t}`,label:`${t} (gene name)`}),e.length===0&&!t?null:r?Gt.default.createElement(pt.FormControl,{size:"small"},Gt.default.createElement(pt.InputLabel,null,"Query UniProt by"),Gt.default.createElement(pt.Select,{value:n,label:"Query UniProt by",onChange:l=>{o(l.target.value)}},s.map(l=>Gt.default.createElement(pt.MenuItem,{key:l.value,value:l.value},l.label)))):Gt.default.createElement(pt.Button,{size:"small",variant:"text",onClick:()=>{i(!0)}},"Choose identifier to query...")}var me=p(S()),Wl=p(_e());nt();var wl=p(ot(),1),xl=(0,se.createSvgIcon)((0,wl.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");nt();var vl=p(ot(),1),Pn=(0,se.createSvgIcon)((0,vl.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings");var Ke=p(V());var vt=p(S()),Ne=p(V());function Rr({open:e,onClose:t,options:n}){return vt.default.createElement(Ne.Dialog,{open:e,onClose:t,"data-testid":"protein-launch-options-dialog"},vt.default.createElement(Ne.DialogTitle,null,"Launch options"),vt.default.createElement(Ne.DialogContent,null,vt.default.createElement(Ne.MenuList,null,n.map(o=>vt.default.createElement(Ne.MenuItem,{key:o.key,"data-testid":`protein-launch-option-${o.key}`,onClick:o.onClick},vt.default.createElement("div",null,vt.default.createElement(Ne.Typography,{variant:"body1"},o.title),vt.default.createElement(Ne.Typography,{variant:"body2",color:"text.secondary"},o.description)))))))}var We=p(S()),ge=p(V());var Pl="proteinView-launchSideBySide";function Or(){let e=localStorage.getItem(Pl);return e===null?!0:e==="true"}function Cl(e){localStorage.setItem(Pl,e?"true":"false")}var Tl=(e,t)=>t in e&&typeof e[t]=="function",Al=!1;function Dd(e){let t=Tl(e,"setUseWorkspaces"),n=Tl(e,"setPendingMove");return t!==n&&!Al&&(Al=!0,console.warn(`jbrowse-plugin-protein3d: this session supports workspaces but not ${n?"setUseWorkspaces":"setPendingMove"}, so the side-by-side launch was skipped and the views will stack. The host's session API changed; the plugin needs updating to match.`)),t&&n}function Nd(e,t){Dd(e)&&(e.setPendingMove({type:"splitRight",viewId:t}),e.setUseWorkspaces(!0))}function Eo(e,t,n){(n??Or())&&Nd(e,t)}function zr({open:e,onClose:t}){let[n,o]=(0,We.useState)(()=>Or());return We.default.createElement(ge.Dialog,{open:e,onClose:()=>{t()}},We.default.createElement(ge.DialogTitle,null,"Launch settings"),We.default.createElement(ge.DialogContent,null,We.default.createElement(ge.FormGroup,null,We.default.createElement(ge.FormControlLabel,{control:We.default.createElement(ge.Checkbox,{checked:n}),label:"Open protein view side-by-side with the genome view",onChange:(r,i)=>{o(i),Cl(i)}})),We.default.createElement(ge.Typography,{variant:"body2",color:"text.secondary"},"When enabled, launching a protein view places it to the right of the connected genome view in a split layout instead of stacking it below.")),We.default.createElement(ge.DialogActions,null,We.default.createElement(ge.Button,{variant:"contained",onClick:()=>{t()}},"Close")))}var Jr=p(S()),Nl=p(V());var q=p(S());var F=p(V());jr();var _r={NEEDLEMAN_WUNSCH:"needleman_wunsch",SMITH_WATERMAN:"smith_waterman"},Wn="smith_waterman",Wr=["needleman_wunsch","smith_waterman"];function ql(e){return Wr.find(t=>t===e)??Wn}var Dl={needleman_wunsch:"Needleman-Wunsch",smith_waterman:"Smith-Waterman"};function Kr({value:e,onChange:t,onManualAlignment:n}){let[o,r]=(0,q.useState)(!1),[i,s]=(0,q.useState)(0),[l,a]=(0,q.useState)(e),[c,u]=(0,q.useState)(""),[m,d]=(0,q.useState)(),g=()=>{a(e),u(""),d(void 0),s(0),r(!0)},h=()=>{if(i===0)t(l);else if(i===1&&c.trim()&&n)try{let x=Fo(c.trim());n(x)}catch(x){d(`Failed to parse alignment: ${x}`);return}r(!1)},b=()=>{a(e),u(""),d(void 0),r(!1)};return q.default.createElement(q.default.Fragment,null,q.default.createElement(F.IconButton,{onClick:g,size:"small",title:"Alignment settings"},q.default.createElement(Pn,null)),q.default.createElement(F.Dialog,{open:o,onClose:b,maxWidth:"sm",fullWidth:!0},q.default.createElement(F.DialogTitle,null,"Alignment settings"),q.default.createElement(F.DialogContent,null,q.default.createElement(F.Tabs,{value:i,onChange:(x,w)=>{s(w)},sx:{mb:2}},q.default.createElement(F.Tab,{label:"Automatic"}),q.default.createElement(F.Tab,{label:"Manual",disabled:!n})),i===0?q.default.createElement(q.default.Fragment,null,q.default.createElement(F.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Choose the algorithm for aligning transcript sequences to protein structures."),q.default.createElement(F.FormControl,{component:"fieldset"},q.default.createElement(F.FormLabel,{component:"legend"},"Algorithm"),q.default.createElement(F.RadioGroup,{value:l,onChange:x=>{a(x.target.value)}},q.default.createElement(F.FormControlLabel,{value:_r.SMITH_WATERMAN,control:q.default.createElement(F.Radio,null),label:"Smith-Waterman (local alignment)"}),q.default.createElement(F.Typography,{variant:"caption",color:"text.secondary",sx:{ml:4,mt:-1,mb:1}},"Finds best matching region. Recommended for most use cases."),q.default.createElement(F.FormControlLabel,{value:_r.NEEDLEMAN_WUNSCH,control:q.default.createElement(F.Radio,null),label:"Needleman-Wunsch (global alignment)"}),q.default.createElement(F.Typography,{variant:"caption",color:"text.secondary",sx:{ml:4,mt:-1,mb:1}},"End-to-end alignment. Use when sequences should align completely.")))):q.default.createElement(q.default.Fragment,null,q.default.createElement(F.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Paste a pre-computed alignment in Clustal format. The first sequence should be the transcript and the second should be the structure."),q.default.createElement(F.TextField,{multiline:!0,rows:10,fullWidth:!0,placeholder:`Example:
17
+ `),slotProps:{input:{readOnly:!0,classes:{input:o.textAreaFont}}}}))}function zn({structureSequence:e,structureName:t,isoformSequences:n}){let[o,r]=(0,vn.useState)(!1);return vn.default.createElement("div",{style:{margin:10}},vn.default.createElement(pl.Button,{variant:"contained",color:"primary",onClick:()=>{r(!o)}},o?"Hide all isoform protein sequences":"Show all isoform protein sequences"),o?vn.default.createElement(Nr,{structureSequence:e,structureName:t,isoformSequences:n}):null)}nn();Pe();function qd({uniprotId:e}){return De.default.createElement(_n.Typography,null,"No structure found for this UniProtID in AlphaFoldDB"," ",De.default.createElement(be,{href:`https://alphafold.ebi.ac.uk/search/text/${e}`},"(search for results)"))}function Br({uniprotId:e,selectedTranscript:t,structureSequence:n,isoformSequences:o,url:r}){return e?De.default.createElement(De.default.Fragment,null,De.default.createElement("div",null,De.default.createElement(_n.Typography,null,"UniProt link:"," ",De.default.createElement(be,{href:Tn(e)},e)),De.default.createElement(_n.Typography,null,"AlphaFoldDB link: ",De.default.createElement(be,{href:r},r))),n?De.default.createElement(zn,{structureSequence:n,structureName:e,isoformSequences:o}):De.default.createElement(qd,{uniprotId:e})):De.default.createElement(_n.Typography,null,"Searching"," ",t?je(t):"transcript"," ","for UniProt ID")}var Gt=p(S()),pt=p(V());function Ur({recognizedIds:e,geneName:t,selectedId:n,onSelectedIdChange:o}){let[r,i]=(0,Gt.useState)(!1),s=[{value:"auto",label:"Auto (try all)"},...e.map(l=>({value:l,label:ba(l)}))];return t&&s.push({value:`gene:${t}`,label:`${t} (gene name)`}),e.length===0&&!t?null:r?Gt.default.createElement(pt.FormControl,{size:"small"},Gt.default.createElement(pt.InputLabel,null,"Query UniProt by"),Gt.default.createElement(pt.Select,{value:n,label:"Query UniProt by",onChange:l=>{o(l.target.value)}},s.map(l=>Gt.default.createElement(pt.MenuItem,{key:l.value,value:l.value},l.label)))):Gt.default.createElement(pt.Button,{size:"small",variant:"text",onClick:()=>{i(!0)}},"Choose identifier to query...")}var me=p(S()),Wl=p(_e());nt();var wl=p(ot(),1),xl=(0,se.createSvgIcon)((0,wl.jsx)("path",{d:"m7 10 5 5 5-5z"}),"ArrowDropDown");nt();var vl=p(ot(),1),Pn=(0,se.createSvgIcon)((0,vl.jsx)("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings");var Ke=p(V());var vt=p(S()),Ne=p(V());function Rr({open:e,onClose:t,options:n}){return vt.default.createElement(Ne.Dialog,{open:e,onClose:t,"data-testid":"protein-launch-options-dialog"},vt.default.createElement(Ne.DialogTitle,null,"Launch options"),vt.default.createElement(Ne.DialogContent,null,vt.default.createElement(Ne.MenuList,null,n.map(o=>vt.default.createElement(Ne.MenuItem,{key:o.key,"data-testid":`protein-launch-option-${o.key}`,onClick:o.onClick},vt.default.createElement("div",null,vt.default.createElement(Ne.Typography,{variant:"body1"},o.title),vt.default.createElement(Ne.Typography,{variant:"body2",color:"text.secondary"},o.description)))))))}var We=p(S()),ge=p(V());var Pl="proteinView-launchSideBySide";function Or(){let e=localStorage.getItem(Pl);return e===null?!0:e==="true"}function Cl(e){localStorage.setItem(Pl,e?"true":"false")}var Tl=(e,t)=>t in e&&typeof e[t]=="function",Al=!1;function Dd(e){let t=Tl(e,"setUseWorkspaces"),n=Tl(e,"setPendingMove");return t!==n&&!Al&&(Al=!0,console.warn(`jbrowse-plugin-protein3d: this session supports workspaces but not ${n?"setUseWorkspaces":"setPendingMove"}, so the side-by-side launch was skipped and the views will stack. Expected on releases through v4.3.0, which place views through @jbrowse/app-core instead; on a newer host it means the session API moved and the plugin needs updating to match.`)),t&&n}function Nd(e,t){Dd(e)&&(e.setPendingMove({type:"splitRight",viewId:t}),e.setUseWorkspaces(!0))}function Eo(e,t,n){(n??Or())&&Nd(e,t)}function zr({open:e,onClose:t}){let[n,o]=(0,We.useState)(()=>Or());return We.default.createElement(ge.Dialog,{open:e,onClose:()=>{t()}},We.default.createElement(ge.DialogTitle,null,"Launch settings"),We.default.createElement(ge.DialogContent,null,We.default.createElement(ge.FormGroup,null,We.default.createElement(ge.FormControlLabel,{control:We.default.createElement(ge.Checkbox,{checked:n}),label:"Open protein view side-by-side with the genome view",onChange:(r,i)=>{o(i),Cl(i)}})),We.default.createElement(ge.Typography,{variant:"body2",color:"text.secondary"},"When enabled, launching a protein view places it to the right of the connected genome view in a split layout instead of stacking it below.")),We.default.createElement(ge.DialogActions,null,We.default.createElement(ge.Button,{variant:"contained",onClick:()=>{t()}},"Close")))}var Jr=p(S()),Nl=p(V());var q=p(S());var F=p(V());jr();var _r={NEEDLEMAN_WUNSCH:"needleman_wunsch",SMITH_WATERMAN:"smith_waterman"},Wn="smith_waterman",Wr=["needleman_wunsch","smith_waterman"];function ql(e){return Wr.find(t=>t===e)??Wn}var Dl={needleman_wunsch:"Needleman-Wunsch",smith_waterman:"Smith-Waterman"};function Kr({value:e,onChange:t,onManualAlignment:n}){let[o,r]=(0,q.useState)(!1),[i,s]=(0,q.useState)(0),[l,a]=(0,q.useState)(e),[c,u]=(0,q.useState)(""),[m,d]=(0,q.useState)(),g=()=>{a(e),u(""),d(void 0),s(0),r(!0)},h=()=>{if(i===0)t(l);else if(i===1&&c.trim()&&n)try{let x=Fo(c.trim());n(x)}catch(x){d(`Failed to parse alignment: ${x}`);return}r(!1)},b=()=>{a(e),u(""),d(void 0),r(!1)};return q.default.createElement(q.default.Fragment,null,q.default.createElement(F.IconButton,{onClick:g,size:"small",title:"Alignment settings"},q.default.createElement(Pn,null)),q.default.createElement(F.Dialog,{open:o,onClose:b,maxWidth:"sm",fullWidth:!0},q.default.createElement(F.DialogTitle,null,"Alignment settings"),q.default.createElement(F.DialogContent,null,q.default.createElement(F.Tabs,{value:i,onChange:(x,w)=>{s(w)},sx:{mb:2}},q.default.createElement(F.Tab,{label:"Automatic"}),q.default.createElement(F.Tab,{label:"Manual",disabled:!n})),i===0?q.default.createElement(q.default.Fragment,null,q.default.createElement(F.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Choose the algorithm for aligning transcript sequences to protein structures."),q.default.createElement(F.FormControl,{component:"fieldset"},q.default.createElement(F.FormLabel,{component:"legend"},"Algorithm"),q.default.createElement(F.RadioGroup,{value:l,onChange:x=>{a(x.target.value)}},q.default.createElement(F.FormControlLabel,{value:_r.SMITH_WATERMAN,control:q.default.createElement(F.Radio,null),label:"Smith-Waterman (local alignment)"}),q.default.createElement(F.Typography,{variant:"caption",color:"text.secondary",sx:{ml:4,mt:-1,mb:1}},"Finds best matching region. Recommended for most use cases."),q.default.createElement(F.FormControlLabel,{value:_r.NEEDLEMAN_WUNSCH,control:q.default.createElement(F.Radio,null),label:"Needleman-Wunsch (global alignment)"}),q.default.createElement(F.Typography,{variant:"caption",color:"text.secondary",sx:{ml:4,mt:-1,mb:1}},"End-to-end alignment. Use when sequences should align completely.")))):q.default.createElement(q.default.Fragment,null,q.default.createElement(F.Typography,{variant:"body2",color:"text.secondary",sx:{mb:2}},"Paste a pre-computed alignment in Clustal format. The first sequence should be the transcript and the second should be the structure."),q.default.createElement(F.TextField,{multiline:!0,rows:10,fullWidth:!0,placeholder:`Example:
18
18
  a MKAAYLSMFGKEDHKPFGD
19
19
  |||||||||||||||||||
20
20
  b MKAAYLSMFGKEDHKPFGD`,value:c,onChange:x=>{u(x.target.value),d(void 0)},sx:{fontFamily:"monospace",fontSize:12}}),m?q.default.createElement(F.Typography,{color:"error",variant:"body2",sx:{mt:1}},m):null)),q.default.createElement(F.DialogActions,null,q.default.createElement(F.Button,{onClick:b},"Cancel"),q.default.createElement(F.Button,{onClick:h,variant:"contained",color:"primary",disabled:i===1&&!c.trim()},i===0?"Save":"Apply alignment"))))}function Kn({alignmentAlgorithm:e,onAlignmentAlgorithmChange:t}){return Jr.default.createElement(Nl.Typography,{variant:"body2",sx:{mr:2,display:"flex",alignItems:"center"}},"Transcript and structure sequences differ, will run"," ",Dl[e]," alignment",Jr.default.createElement(Kr,{value:e,onChange:t}))}var Hl=p(S());async function Vl(e,t,n){try{await e(),t?.()}catch(o){console.error(o),n?.(o)}}function Gl({uniprotId:e,userSelectedProteinSequence:t,selectedTranscript:n}){return[!e&&"No UniProt ID found",!t?.seq&&"Could not compute protein sequence (feature may be missing CDS subfeatures)",!n&&"No transcript selected"].filter(o=>typeof o=="string")}function Cn(e,t){let[n,o]=(0,Hl.useState)();return{runLaunch:i=>()=>{t?.(),Vl(i,e,o)},launchError:n}}var zl=p(ie());Pe();function qo(e){let{structures:t,...n}=e;return{type:"ProteinView",...n,structures:t.map(o=>({...o,userProvidedTranscriptSequence:o.userProvidedTranscriptSequence??""}))}}Pe();function Bl(e,t){e.addTemporaryAssembly?.({name:t,sequence:{type:"ReferenceSequenceTrack",trackId:`${t}-ReferenceSequenceTrack`,sequenceType:"pep",adapter:{type:"UnindexedFastaAdapter",rewriteRefNames:"jexl:split(refName,'|')[1]",fastaLocation:{uri:gl(t)}}}})}on();Pe();async function Bd(e){let t=await(await Jn(jn(e))).text();return[...new Set(t.split(`
@@ -25,7 +25,7 @@ ${e}
25
25
  >3DI
26
26
  ${t}
27
27
  `,i=new URLSearchParams;i.append("q",r),i.append("mode","3diaa"),i.append("email","");for(let a of n)i.append("database[]",a);let s=await fetch("https://search.foldseek.com/api/ticket",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:i,signal:o}),l=await s.text();if(!s.ok)throw new Error(`Foldseek submission failed: ${s.status} ${l}`);return JSON.parse(l)}async function Qg({ticketId:e,signal:t}){let n=new URLSearchParams;n.append("tickets[]",e);let o=await fetch("https://search.foldseek.com/api/tickets",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:n,signal:t});if(!o.ok)throw new Error(`Failed to poll ticket status: ${o.status}`);let i=(await o.json())[0];if(!i)throw new Error("No ticket status returned");return i}async function $g({ticketId:e,signal:t}){return Ht(`https://search.foldseek.com/api/result/${e}/0`,{signal:t})}async function Op({ticketId:e,onStatusChange:t,signal:n}){let r=Date.now(),i=()=>Math.round((Date.now()-r)/1e3);for(;Date.now()-r<18e4;){if(n?.aborted)throw Do(n);let s=await Qg({ticketId:e,signal:n});if(s.status==="ERROR")throw console.error("[Foldseek] Search error:",s),new Error(`Foldseek search failed: ${s.error??"Unknown error"}`);if(s.status==="COMPLETE"){t?.("Fetching results...");let l=await $g({ticketId:e,signal:n});return{query:l.queries[0]??{header:"",sequence:""},results:l.results.map(c=>({db:c.db,alignments:c.alignments}))}}t?.(`Search ${s.status.toLowerCase()}... (${i()}s)`),await Ul(1e3,n)}throw new Error(`Foldseek search timed out after ${Math.round(18e4/1e3)}s`)}var Zg=(0,zp.makeStyles)()({root:{display:"flex",flexDirection:"column",gap:8},header:{display:"flex",alignItems:"center",gap:8},buttons:{display:"flex",gap:4},checkboxGroup:{display:"grid",gridTemplateColumns:"repeat(2, 1fr)",gap:0}});function Di({selected:e,onChange:t,disabled:n}){let{classes:o}=Zg();return mt.default.createElement("div",{className:o.root},mt.default.createElement("div",{className:o.header},mt.default.createElement(rt.Typography,{variant:"subtitle2"},"Databases to search:"),mt.default.createElement("div",{className:o.buttons},mt.default.createElement(rt.Button,{size:"small",onClick:()=>{t(qi.map(r=>r.id))},disabled:n},"Select all"),mt.default.createElement(rt.Button,{size:"small",onClick:()=>{t([])},disabled:n},"Clear"))),mt.default.createElement(rt.FormGroup,{className:o.checkboxGroup},qi.map(r=>mt.default.createElement(rt.FormControlLabel,{key:r.id,control:mt.default.createElement(rt.Checkbox,{size:"small",checked:e.includes(r.id),onChange:()=>{e.includes(r.id)?t(e.filter(i=>i!==r.id)):t([...e,r.id])},disabled:n}),label:r.label}))))}var j=p(S()),G=p(V()),Kp=p(tt());var $e=p(S()),Wp=p(_e()),Ut=p(V());var Xg={A:"ALA",C:"CYS",D:"ASP",E:"GLU",F:"PHE",G:"GLY",H:"HIS",I:"ILE",K:"LYS",L:"LEU",M:"MET",N:"ASN",P:"PRO",Q:"GLN",R:"ARG",S:"SER",T:"THR",V:"VAL",W:"TRP",Y:"TYR",X:"UNK"};function jp(e,t){return e.padStart(t," ")}function ef(e,t){return e.padEnd(t," ")}function Ni(e){return e.toFixed(3).padStart(8," ")}function _p(e,t,n="A",o){let r=e.split(",").map(Number),i=[];o&&i.push(`TITLE ${o}`),i.push("REMARK 1 Generated from Foldseek C\u03B1 coordinates");let s=1,l=1;for(let a=0;a<r.length-2;a+=3){let c=r[a],u=r[a+1],m=r[a+2],d=t[l-1]??"X",g=Xg[d]??"UNK";if(c===void 0||u===void 0||m===void 0)break;let h="ATOM "+jp(String(s),5)+" CA "+ef(g,3)+" "+n+jp(String(l),4)+" "+Ni(c)+Ni(u)+Ni(m)+" 1.00 0.00 C";i.push(h),s++,l++}return i.push("END"),i.join(`
28
- `)}function Vi(e){let{tCa:t,tSeq:n}=e;return!!t&&!!n&&t.split(",").length>=3}Pe();function Gi({hit:e,session:t,view:n,feature:o,selectedTranscript:r,userProvidedTranscriptSequence:i,onClose:s}){let[l,a]=(0,$e.useState)(null),c=!!l,u=An(e.target),m=A=>{a(A.currentTarget)},d=()=>{a(null)},{runLaunch:g,launchError:h}=Cn(s,d),b={session:t,view:n,feature:o,selectedTranscript:r,uniprotId:u},x=g(()=>{let A=!e.structureUrl&&Vi(e)?_p(e.tCa,e.tSeq,"A",e.target):void 0;rn({...b,url:e.structureUrl,data:A,userProvidedTranscriptSequence:i})}),{launch1D:w,launchMsa:y}=Vo({...b,confidenceUrl:Sl(e.target)});return!!e.structureUrl||Vi(e)?$e.default.createElement($e.default.Fragment,null,h?$e.default.createElement(Wp.ErrorMessage,{error:h}):null,$e.default.createElement(Ut.Button,{size:"small",variant:"outlined",onClick:m},"Load"),$e.default.createElement(Ut.Menu,{anchorEl:l,open:c,onClose:d},$e.default.createElement(Ut.MenuItem,{"data-testid":"protein-launch-option-3d",onClick:x},Tt["3d"]),w?$e.default.createElement(Ut.MenuItem,{"data-testid":"protein-launch-option-1d",onClick:g(w)},Tt["1d"]):null,y?$e.default.createElement(Ut.MenuItem,{"data-testid":"protein-launch-option-msa",onClick:g(y)},Tt.msa):null)):$e.default.createElement("span",null,"-")}Pe();var tf=(0,Kp.makeStyles)()(e=>({root:{display:"flex",flexDirection:"column",gap:16},tableContainer:{maxHeight:400},headerCell:{fontWeight:"bold",backgroundColor:e.palette.mode==="dark"?e.palette.grey[900]:e.palette.grey[100]},noResults:{padding:16,textAlign:"center"}})),nf=100;function of(e){let t=e.results.flatMap(n=>(n.alignments??[]).flat().map(o=>({...o,db:n.db,structureUrl:yl(o.target,n.db)})));return t.sort((n,o)=>(n.eval??1/0)-(o.eval??1/0)),t}function Hi({results:e,session:t,view:n,feature:o,selectedTranscript:r,userProvidedTranscriptSequence:i,onClose:s}){let{classes:l}=tf(),a=of(e),c=a.slice(0,nf);return c.length===0?j.default.createElement(G.Paper,{className:l.noResults},j.default.createElement(G.Typography,null,"No similar structures found")):j.default.createElement("div",{className:l.root},j.default.createElement(G.Typography,{variant:"subtitle2"},"Found ",a.length," similar structures",a.length>c.length?` (showing top ${c.length})`:""),j.default.createElement(G.TableContainer,{component:G.Paper,className:l.tableContainer},j.default.createElement(G.Table,{size:"small",stickyHeader:!0},j.default.createElement(G.TableHead,null,j.default.createElement(G.TableRow,null,j.default.createElement(G.TableCell,{className:l.headerCell},"Database"),j.default.createElement(G.TableCell,{className:l.headerCell},"Target"),j.default.createElement(G.TableCell,{className:l.headerCell},"Organism"),j.default.createElement(G.TableCell,{className:l.headerCell},"Prob"),j.default.createElement(G.TableCell,{className:l.headerCell},"Seq. Id."),j.default.createElement(G.TableCell,{className:l.headerCell},"Coverage"),j.default.createElement(G.TableCell,{className:l.headerCell},"E-value"),j.default.createElement(G.TableCell,{className:l.headerCell},"Actions"))),j.default.createElement(G.TableBody,null,c.map((u,m)=>j.default.createElement(G.TableRow,{key:`${u.db}-${u.target}-${m}`},j.default.createElement(G.TableCell,null,u.db),j.default.createElement(G.TableCell,null,u.target),j.default.createElement(G.TableCell,null,u.taxName??"-"),j.default.createElement(G.TableCell,null,u.prob!=null?`${(u.prob*100).toFixed(1)}%`:"-"),j.default.createElement(G.TableCell,null,u.seqId!=null?`${u.seqId.toFixed(1)}%`:"-"),j.default.createElement(G.TableCell,null,u.alnLength!=null&&u.qLen!=null?`${(u.alnLength/u.qLen*100).toFixed(1)}%`:"-"),j.default.createElement(G.TableCell,null,u.eval!=null?u.eval.toExponential(2):"-"),j.default.createElement(G.TableCell,null,j.default.createElement(Gi,{hit:u,session:t,view:n,feature:o,selectedTranscript:r,userProvidedTranscriptSequence:i,onClose:s}))))))))}var it=p(S());function Bi(){let[e,t]=(0,it.useState)(),[n,o]=(0,it.useState)(),[r,i]=(0,it.useState)(!1),[s,l]=(0,it.useState)(!1),[a,c]=(0,it.useState)(),[u,m]=(0,it.useState)(""),d=(0,it.useRef)(null);(0,it.useEffect)(()=>()=>{d.current?.abort()},[]);let g=()=>{d.current?.abort();let w=new AbortController;return d.current=w,w.signal},h=async w=>{let y=g();l(!0),c(void 0),m("Predicting 3Di structure...");try{let f=await Up({aaSequence:w,signal:y});return o(f),f}catch(f){y.aborted||(console.error(f),c(f));return}finally{y.aborted||(l(!1),m(""))}},b=async(w,y,f=nr)=>{let A=g();i(!0),c(void 0),m("Submitting search...");try{let P=await Rp({aaSequence:w,di3Sequence:y,databases:f,signal:A}),v=await Op({ticketId:P.id,onStatusChange:m,signal:A});return t(v),v}catch(P){A.aborted||(console.error(P),c(P));return}finally{A.aborted||(i(!1),m(""))}},x=()=>{d.current?.abort(),t(void 0),o(void 0),c(void 0),m("")};return{results:e,cleanedAaSequence:n?.aaSequence,di3Sequence:n?.di3Sequence,isLoading:r,isPredicting:s,error:a,statusMessage:u,predictStructure:h,search:b,reset:x}}var rf=(0,Yp.makeStyles)()({dialogContent:{width:"80em",display:"flex",flexDirection:"column",gap:20},sequenceInput:{fontFamily:"monospace"},di3Section:{display:"flex",flexDirection:"column",gap:8}}),sf=(0,Jp.observer)(function({feature:t,session:n,view:o,handleClose:r}){let{classes:i}=rf(),[s,l]=(0,X.useState)(),[a,c]=(0,X.useState)(nr),{results:u,cleanedAaSequence:m,di3Sequence:d,isLoading:g,isPredicting:h,error:b,statusMessage:x,predictStructure:w,search:y,reset:f}=Bi(),{transcripts:A,isoformSequences:P,isLoading:v,error:D,selectedTranscriptId:E,setSelectedTranscriptId:I,selectedTranscript:L,selectedIsoform:oe}=pn({feature:t,view:o}),C=oe?yo(oe.seq):"",O=s??C,pe=()=>{(d!==void 0||u!==void 0)&&f()},Re=Ie=>{I(Ie),l(void 0),pe()},ke=O.trim().length>0&&!h&&!g,Me=!!m&&!!d&&a.length>0&&!g,Ee=b??D,Oe=g||h;return X.default.createElement(X.default.Fragment,null,X.default.createElement(Le.DialogContent,{className:i.dialogContent},Ee&&!v?X.default.createElement(eo.ErrorMessage,{error:Ee}):null,v?X.default.createElement(eo.LoadingEllipses,{variant:"subtitle2",message:"Loading transcript sequences"}):null,P?X.default.createElement(X.default.Fragment,null,X.default.createElement(sn,{val:E,setVal:Re,isoforms:A,isoformSequences:P,feature:t,disabled:Oe}),X.default.createElement(Le.TextField,{label:"Protein sequence (amino acids)",multiline:!0,rows:4,value:O,onChange:Ie=>{l(Ie.target.value),pe()},placeholder:"MKTVRQERLKSIVRILERSKEPVSGAQLAEEL...",disabled:Oe,InputProps:{className:i.sequenceInput}})):null,d?X.default.createElement("div",{className:i.di3Section},X.default.createElement(Le.Typography,{variant:"subtitle2"},"3Di structural alphabet (used for searching):"),X.default.createElement(Le.TextField,{multiline:!0,rows:4,value:d,InputProps:{className:i.sequenceInput,readOnly:!0}})):null,X.default.createElement(Di,{selected:a,onChange:c,disabled:Oe}),x?X.default.createElement(eo.LoadingEllipses,{variant:"subtitle2",message:x}):null,u?X.default.createElement(Hi,{results:u,session:n,view:o,feature:t,selectedTranscript:L,userProvidedTranscriptSequence:O,onClose:r}):null),X.default.createElement(Le.DialogActions,null,X.default.createElement(Le.Button,{variant:"contained",color:"secondary",onClick:()=>{r()}},"Cancel"),u?X.default.createElement(Le.Button,{variant:"outlined",onClick:()=>{f()}},"New search"):null,d?X.default.createElement(Le.Button,{variant:"contained",color:"primary",disabled:!Me,onClick:()=>{y(m,d,a)}},g?"Searching...":"Search Foldseek"):X.default.createElement(Le.Button,{variant:"contained",color:"primary",disabled:!ke,onClick:()=>{w(O.trim())}},h?"Predicting...":"Predict 3Di structure")))}),Qp=sf;var Be=p(S());Ui();var ou=p(V()),af=(0,Be.lazy)(()=>Promise.resolve().then(()=>(nu(),tu)));function to(){let[e,t]=(0,Be.useState)(!1);return Be.default.createElement(Be.default.Fragment,null,Be.default.createElement(ou.IconButton,{onClick:()=>{t(!0)}},Be.default.createElement(or,null)),e?Be.default.createElement(Be.Suspense,{fallback:null},Be.default.createElement(af,{handleClose:()=>{t(!1)}})):null)}var ru=p(S());function no({children:e,value:t,index:n,...o}){return ru.default.createElement("div",{role:"tabpanel",hidden:t!==n,...o},e)}var ee=p(S()),rr=p(_e()),cn=p(V()),iu=p($()),su=p(tt());var ue=p(S()),le=p(V());Pe();function Ri({choice:e,setChoice:t,structureURL:n,setStructureURL:o,setFile:r,pdbId:i,setPdbId:s}){return ue.default.createElement("div",{style:{display:"flex",margin:30}},ue.default.createElement(le.Typography,null,"Open your structure file ",ue.default.createElement(to,null)),ue.default.createElement(le.FormControl,{component:"fieldset"},ue.default.createElement(le.RadioGroup,{value:e,onChange:l=>{t(l.target.value)}},ue.default.createElement(le.FormControlLabel,{value:"url",control:ue.default.createElement(le.Radio,null),label:"URL"}),ue.default.createElement(le.FormControlLabel,{value:"file",control:ue.default.createElement(le.Radio,null),label:"File"}),ue.default.createElement(le.FormControlLabel,{value:"pdb",control:ue.default.createElement(le.Radio,null),label:"PDB ID"}))),e==="url"?ue.default.createElement("div",null,ue.default.createElement(le.Typography,null,"Open a PDB/mmCIF/etc. file from remote URL"),ue.default.createElement(le.TextField,{label:"URL",value:n,onChange:l=>{o(l.target.value)}})):null,e==="file"?ue.default.createElement("div",{style:{paddingTop:20}},ue.default.createElement(le.Typography,null,"Open a PDB/mmCIF/etc. file from your local drive"),ue.default.createElement(le.Button,{variant:"outlined",component:"label"},"Choose file",ue.default.createElement("input",{type:"file",hidden:!0,onChange:({target:l})=>{let a=l.files?.[0];a&&r(a)}}))):null,e==="pdb"?ue.default.createElement(le.TextField,{value:i,onChange:l=>{let a=l.target.value;s(a),o(Io(a))},label:"PDB ID"}):null)}nn();var lf=(0,su.makeStyles)()(e=>({dialogContent:{marginTop:e.spacing(6),width:"80em"},textAreaFont:{fontFamily:"Courier New"}}));function pf(){return ee.default.createElement("div",{style:{marginBottom:20}},"Manually supply a protein structure (PDB, mmCIF, etc) for a given transcript. You can open the file from the result of running, for example,"," ",ee.default.createElement(be,{href:"https://github.com/sokrypton/ColabFold"},"ColabFold"),". This plugin will align the protein sequence calculated from the genome to the protein sequence embedded in the structure file which allows for slight differences in these two representations.")}var uf=(0,iu.observer)(function({feature:t,session:n,view:o,handleClose:r,alignmentAlgorithm:i,onAlignmentAlgorithmChange:s}){let{classes:l}=lf(),[a,c]=(0,ee.useState)(),[u,m]=(0,ee.useState)(""),[d,g]=(0,ee.useState)("file"),[h,b]=(0,ee.useState)(""),{runLaunch:x,launchError:w}=Cn(r),y=d==="file"?a:void 0,f=d==="file"?"":h,{sequences:A,error:P}=Xn({file:y,url:f}),v=y?.name??f.slice(f.lastIndexOf("/")+1),{transcripts:D,isoformSequences:E,structureSequence:I,selectedTranscriptId:L,setSelectedTranscriptId:oe,selectedTranscript:C,selectedIsoform:O,error:pe}=pn({feature:t,view:o,structureSequences:A}),Re=pe??w??P,ke=!!(f||y)&&!!O&&!!C,Me=!!O?.seq&&!!I&&de(O.seq)!==I,Ee=x(async()=>{if(O&&C){let Oe=y?await y.text():void 0;rn({session:n,view:o,feature:t,selectedTranscript:C,url:f||void 0,data:Oe,userProvidedTranscriptSequence:O.seq,alignmentAlgorithm:i})}});return ee.default.createElement(ee.default.Fragment,null,ee.default.createElement(cn.DialogContent,{className:l.dialogContent},Re?ee.default.createElement(rr.ErrorMessage,{error:Re}):null,ee.default.createElement(pf,null),ee.default.createElement(Ri,{choice:d,setChoice:g,structureURL:h,setStructureURL:b,setFile:c,pdbId:u,setPdbId:m}),ee.default.createElement("div",{style:{margin:20}},E?I?ee.default.createElement(ee.default.Fragment,null,ee.default.createElement(sn,{val:L,setVal:oe,structureSequence:I,isoforms:D,feature:t,isoformSequences:E}),ee.default.createElement(zn,{structureSequence:I,structureName:v,isoformSequences:E})):null:ee.default.createElement(rr.LoadingEllipses,{title:"Loading protein sequences",variant:"h6"}))),ee.default.createElement(cn.DialogActions,null,Me?ee.default.createElement(Kn,{alignmentAlgorithm:i,onAlignmentAlgorithmChange:s}):null,ee.default.createElement(cn.Button,{variant:"contained",color:"secondary",onClick:()=>{r()}},"Cancel"),ee.default.createElement(cn.Button,{variant:"contained",color:"primary",disabled:!ke,onClick:()=>{Ee()}},"Launch 3D protein structure view")))}),au=uf;var lu=p(S());function pu(e,t){let[n,o]=(0,lu.useState)(()=>{let i=localStorage.getItem(e);if(i)try{return JSON.parse(i)}catch{return t}return t});function r(i){o(i),localStorage.setItem(e,JSON.stringify(i))}return[n,r]}function Oi({handleClose:e,feature:t,model:n}){let[o,r]=(0,Se.useState)(0),[i,s]=pu("jbrowse-protein3d-alignment-algorithm",Wn),l=(0,ir.getSession)(n),a=(0,ir.getContainingView)(n);return Se.default.createElement(uu.Dialog,{"data-testid":"launch-protein-view-dialog",maxWidth:"xl",title:"Launch protein view",titleNode:Se.default.createElement(Se.default.Fragment,null,"Launch protein view ",Se.default.createElement(to,null)),open:!0,onClose:e},Se.default.createElement(qn.Tabs,{value:o,onChange:(c,u)=>{r(u)}},Se.default.createElement(qn.Tab,{value:0,label:"AlphaFoldDB search"}),Se.default.createElement(qn.Tab,{value:1,label:"Foldseek search"}),Se.default.createElement(qn.Tab,{value:2,label:"Open file manually"})),Se.default.createElement(no,{value:o,index:0},Se.default.createElement(Bp,{session:l,view:a,feature:t,handleClose:e,alignmentAlgorithm:i,onAlignmentAlgorithmChange:s})),Se.default.createElement(no,{value:o,index:1},Se.default.createElement(Qp,{session:l,view:a,feature:t,handleClose:e})),Se.default.createElement(no,{value:o,index:2},Se.default.createElement(au,{session:l,view:a,feature:t,handleClose:e,alignmentAlgorithm:i,onAlignmentAlgorithmChange:s})))}function cf(e){return e.name==="LinearBasicDisplay"}var mf=["gene","mRNA","transcript"];function df(e,t){let{item:n,subfeature:o,displayedRegionIndex:r}=e,i=o?o.type:n.type,s=o?o.parentFeatureId:n.featureId;return i===void 0?void 0:{type:i,fetchFeature:()=>t(s,r)}}function gf(e){let t=e.get("type");return t===void 0?void 0:{type:t,feature:e}}function ff(e){let{contextMenuFeature:t,contextMenuInfo:n,fetchFullFeature:o}=e;return n&&o?df(n,o):t?gf(t):void 0}function hf(e,t){let n=(0,sr.getContainingTrack)(e),o=(0,sr.getSession)(n),r=i=>{o.queueDialog(s=>[Oi,{model:n,handleClose:s,feature:i}])};"feature"in t?r(t.feature):t.fetchFeature().then(i=>{i?r(i):o.notify("Could not load feature for protein view","warning")}).catch(i=>{console.error(i),o.notifyError(`${i}`,i)})}function bf(e){return e.views(t=>{let n=t.contextMenuItems;return{contextMenuItems(){let o=ff(t);return[...n.call(t),...o&&mf.includes(o.type)?[{label:"Launch protein view",icon:nl,onClick:()=>{hf(t,o)}}]:[]]}}})}function zi(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(cf(t)&&(t.stateModel=bf(t.stateModel)),t))}var ji=p(en()),cu=p(ie());function yf(e){if(typeof e=="string")return e;let{trackId:t}=e;return typeof t=="string"?t:void 0}function Sf(e,t){let n=e;return n.getTrackById?.(t)??n.getTracksById?.()[t]??n.tracks?.find(o=>(0,ji.readConfObject)(o,"trackId")===t)}function wf(e,t){let n=On(t);return[e.get("name"),e.get("id"),e.id()].some(o=>typeof o=="string"&&(o===t||On(o)===n))}async function mu({session:e,structureUrl:t,transcriptId:n,connectedView:o}){if(!n)throw new Error("transcriptId is required to launch from a uniprotId or pdbId");let r=o?.assembly,i=o?.loc,s=o?.tracks??[];if(!r||!i)throw new Error("connectedView with assembly + loc is required to launch from a uniprotId");let l=await e.assemblyManager.waitForAssembly(r);if(!l)throw new Error(`assembly "${r}" not found`);let a=(0,cu.parseLocString)(i,x=>l.isValidRefName(x));if(a.start===void 0||a.end===void 0)throw new Error(`could not parse a start-end region from loc "${i}"`);let c={assemblyName:r,refName:l.getCanonicalRefName(a.refName)??a.refName,start:a.start,end:a.end},u=s.map(yf).filter(x=>x!==void 0),m="getFeatures",d=[];for(let x of u){let w=Sf(e,x);if(!w)continue;let y=await e.rpcManager.call(m,"CoreGetFeatures",{adapterConfig:(0,ji.readConfObject)(w,"adapter"),sessionId:m,regions:[c]});for(let f of y)d.push(...Xt(f))}let g=d.find(x=>wf(x,n));if(!g)throw new Error(`transcript "${n}" not found at ${i} in tracks [${u.join(", ")}]`);if(!(g.get("subfeatures")??[]).some(x=>x.get("type")==="CDS"))throw new Error(`transcript "${n}" has no CDS subfeatures`);let b=await Xo({session:e,assemblyName:r,feature:g});if(!b)throw new Error(`could not translate a protein sequence for "${n}"`);return{url:t,feature:g.toJSON(),userProvidedTranscriptSequence:b}}Pe();function _i(e){e.addToExtensionPoint("LaunchView-ProteinView",async t=>{let{session:n,url:o,uniprotId:r,pdbId:i,transcriptId:s,userProvidedTranscriptSequence:l,feature:a,connectedViewId:c,connectedView:u,alignmentAlgorithm:m,displayName:d,height:g,showControls:h,showHighlight:b,zoomToBaseLevel:x,sideBySide:w,initialSelection:y}=t,f=Lo({url:o,uniprotId:r,pdbId:i}),A;if(!o&&f)try{A=await mu({session:n,structureUrl:f,transcriptId:s,connectedView:u})}catch(I){return console.error(I),n.notify(`Could not launch protein view: ${I}`,"error"),t}let P=o??A?.url;if(!P){let I="No url, uniprotId or pdbId provided when launching protein view";return console.error(I),n.notify(`Could not launch protein view: ${I}`,"error"),t}let v=!c&&!!u,D=c??(u?n.addView("LinearGenomeView",{type:"LinearGenomeView",init:u}).id:void 0),E=n.addView("ProteinView",qo({alignmentAlgorithm:m===void 0?void 0:ql(m),displayName:d,height:g,showControls:h,showHighlight:b,zoomToBaseLevel:x,structures:[{url:P,userProvidedTranscriptSequence:A?.userProvidedTranscriptSequence??l,feature:A?.feature??a,connectedViewId:D,initialSelection:y}]}));return v&&Eo(n,E.id,w),t})}var Qm=p(S()),$m=p(Wi());var Xu=p(Wi()),ec=p(fu()),fe=p(Dn());nt();var bu=p(ot(),1),Ki=(0,se.createSvgIcon)((0,bu.jsx)("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"}),"Visibility");var Vn=p(Sn());Ji();var Yi=p(Dn());function wu(e,t){let n=e.obj?.data;if(!n)return;let{B_iso_or_equiv:o}=n.atomicConformation,{offsets:r,count:i}=n.atomicHierarchy.residueAtomSegments,s=t===void 0?i:Math.min(i,t),l=[];for(let a=0;a<s;a++)l.push(o.value(r[a]));return l}function xu(e){return!!e&&e.length>1&&e.every(t=>t>=0&&t<=100)&&new Set(e).size>1}async function vu({structure:e,plugin:t}){let{model:n,structure:o}=e.data?await Jo({data:e.data,plugin:t}):e.url?await Yo({url:e.url,plugin:t}):{model:void 0,structure:void 0},r=n?vi(n):void 0,i=r?.[0],s=n?wu(n,i?.seq.length):void 0;return{entities:r,confidence:i&&s?{entityId:i.entityId,values:s}:void 0,molstarStructure:o}}function Tu(e){let t=new Set;function n(o,r){t.add(o),vu({structure:o,plugin:r}).then(i=>{let s=(0,Yi.isAlive)(o)?e.molstarPluginContext:void 0;s===r&&(o.setStructureData(i),o.setLoadedToMolstar(!0)),t.delete(o),s&&s!==r&&!o.loadedToMolstar&&n(o,s)}).catch(i=>{t.delete(o),(0,Yi.isAlive)(e)&&(e.setError(i),console.error(i))})}return function(){let{structures:r,molstarPluginContext:i}=e;if(i)for(let s of r)!s.loadedToMolstar&&!t.has(s)&&n(s,i)}}var so=p(ie()),ne=p(Dn()),io=p(Sn());Fn();async function Au({structure:e,plugin:t,channel:n,labelSeqIds:o,entityId:r}){let{lociHighlights:i,lociSelects:s}=t.managers.interactivity;if(n==="highlight"?i.clearHighlights():s.deselectAll(),o?.length){let{StructureSelection:l,Script:a}=await He(),c=a.getStructureSelection(m=>m.struct.generator.atomGroups({...r?{"chain-test":m.core.rel.eq([m.struct.atomProperty.macromolecular.label_entity_id(),r])}:{},"residue-test":m.core.set.has([m.core.type.set([...new Set(o)]),m.struct.atomProperty.macromolecular.label_seq_id()]),"group-by":m.struct.atomProperty.macromolecular.residueKey()}),e),u=l.toLociWithSourceUnits(c);n==="highlight"?i.highlight({loci:u}):s.select({loci:u})}}var Pu=["A","R","N","D","C","Q","E","G","H","I","L","K","M","F","P","S","T","W","Y","V","B","Z","X","*"],xf=[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0,-4],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1,-4],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1,-4],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1,-4],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2,-4],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1,-4],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-4],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1,-4],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1,-4],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1,-4],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1,-4],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1,-4],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1,-4],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2,-4],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0,-4],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0,-4],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2,-4],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1,-4],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1,-4],[-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1,-4],[-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1,-4],[-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1]],Cu=-4,Rt=Pu.length,$i=new Int8Array(128).fill(-1);for(let e=0;e<Rt;e++){let t=Pu[e];$i[t.charCodeAt(0)]=e,$i[t.toLowerCase().charCodeAt(0)]=e}var Zi=new Int8Array(Rt*Rt);for(let e=0;e<Rt;e++)for(let t=0;t<Rt;t++)Zi[e*Rt+t]=xf[e][t];var lr=e=>{let t=e.charCodeAt(0);return t<128?$i[t]:-1};function vf(e,t){let n=lr(e),o=lr(t);return n<0||o<0?Cu:Zi[n*Rt+o]}var ku=-10,Mu=-.5,Iu=4e7;function Xi(e,t){return(e+1)*(t+1)>Iu}function Tf(e,t){if(Xi(e,t))throw new Error(`Sequences too long to align (${e} x ${t} residues exceeds the ${Iu} cell limit)`)}var mn=0,oo=1,ar=2,Lu=3,Eu=0,Fu=2,qu=4,Qi=(e,t,n)=>e[t]>>n&3;function Du(e,t,n,o,r){let i=e.length,s=t.length;Tf(i,s);let l=s+1,a=new Uint8Array((i+1)*l),c=new Float32Array(l),u=new Float32Array(l).fill(-1/0),m=new Float32Array(l).fill(-1/0),d=new Float32Array(l),g=new Float32Array(l),h=new Float32Array(l);if(!r){c.fill(-1/0),c[0]=0;for(let E=1;E<=s;E++)m[E]=n+(E-1)*o}let b=r?0:-1/0,x=0,w=0,y=mn,f=new Int8Array(s);for(let E=0;E<s;E++)f[E]=lr(t[E]);for(let E=1;E<=i;E++){d[0]=r?0:-1/0,g[0]=r?-1/0:n+(E-1)*o,h[0]=-1/0;let I=E*l,L=lr(e[E-1]),oe=L*Rt;for(let C=1;C<=s;C++){let O=f[C-1],pe=L<0||O<0?Cu:Zi[oe+O],Re=c[C-1],ke=u[C-1],Me=m[C-1],Ee=Math.max(Re,ke,Me),Oe=Ee===Re?mn:Ee===ke?oo:ar,Ie=Ee+pe,he=r&&Ie<=0;d[C]=he?0:Ie;let Wt=c[C]+n,It=u[C]+o;g[C]=Math.max(Wt,It);let Kt=d[C-1]+n,Xe=h[C-1]+o;if(h[C]=Math.max(Kt,Xe),a[I+C]=(he?Lu:Oe)<<Eu|(Wt>=It?mn:oo)<<Fu|(Kt>=Xe?mn:ar)<<qu,r){let Lt=Math.max(d[C],g[C],h[C]);Lt>b&&(b=Lt,x=E,w=C,y=Lt===d[C]?mn:Lt===g[C]?oo:ar)}}[c,d]=[d,c],[u,g]=[g,u],[m,h]=[h,m]}if(r)return{trace:a,width:l,score:b,startI:x,startJ:w,startMatrix:y};let A=c[s],P=u[s],v=m[s],D=Math.max(A,P,v);return{trace:a,width:l,score:D,startI:i,startJ:s,startMatrix:D===A?mn:D===P?oo:ar}}function Nu(e,t,n){let{trace:o,width:r,startI:i,startJ:s,score:l}=n,a=[],c=[];for(let g=e.length;g>i;g--)a.push(e[g-1]),c.push("-");for(let g=t.length;g>s;g--)a.push("-"),c.push(t[g-1]);let u=i,m=s,d=n.startMatrix;for(;u>0&&m>0;){let g=u*r+m;if(d===mn){let h=Qi(o,g,Eu);if(h===Lu)break;a.push(e[u-1]),c.push(t[m-1]),d=h,u--,m--}else d===oo?(a.push(e[u-1]),c.push("-"),d=Qi(o,g,Fu),u--):(a.push("-"),c.push(t[m-1]),d=Qi(o,g,qu),m--)}for(;u>0;)a.push(e[u-1]),c.push("-"),u--;for(;m>0;)a.push("-"),c.push(t[m-1]),m--;return{alignedSeq1:a.reverse().join(""),alignedSeq2:c.reverse().join(""),score:l}}function Af(e,t,n=ku,o=Mu){return Nu(e,t,Du(e,t,n,o,!1))}function Pf(e,t,n=ku,o=Mu){return Nu(e,t,Du(e,t,n,o,!0))}function Cf(e,t){let n=[];for(let o=0;o<e.length;o++){let r=e[o],i=t[o];r!=="-"&&i!=="-"&&r.toUpperCase()===i.toUpperCase()?n.push("|"):r!=="-"&&i!=="-"&&vf(r,i)>0?n.push(":"):n.push(" ")}return n.join("")}function Vu(e,t,n){let{alignedSeq1:o,alignedSeq2:r}=n==="smith_waterman"?Pf(e,t):Af(e,t);return{consensus:Cf(o,r),alns:[{id:"a",seq:o},{id:"b",seq:r}]}}lt();function Gu(e,t){return t===void 0||e===t}function kf(e){let t=Dt(e),n=$t(e),o=0;for(let r=0;r<t.length;r++){let i=t[r],s=n[r];i!=="-"&&s!=="-"&&i?.toUpperCase()===s?.toUpperCase()&&o++}return o}function Hu(e,t,n){let o=de(e);if(!o||t.length===0)return;let r=t.map(de),i=r.findIndex(a=>a.length>0&&a===o);if(i!==-1)return{index:i,alignment:{consensus:"|".repeat(o.length),alns:[{id:"seq1",seq:o},{id:"seq2",seq:r[i]}]},matches:o.length};let s=new Map,l;for(let a=0;a<r.length;a++){let c=r[a];if(c.length>0&&!Xi(o.length,c.length)){let u=s.get(c);if(!u){let m=Vu(o,c,n);u={alignment:m,matches:kf(m)},s.set(c,u)}(!l||u.matches>l.matches)&&(l={index:a,...u})}}return l}st();lt();var Ou=e=>e;var ts=e=>e;function zu(e){let{structureSeqToTranscriptSeqPosition:t,transcriptSeqToStructureSeqPosition:n}=Ys(e),o=$s(e),r=Zs(e),i=vr(o),s=vr(r);return{structureToTranscript:l=>t[l],transcriptToStructure:l=>n[l],structureToAlignment:l=>o[l],alignmentToStructure:l=>i[l],transcriptToAlignment:l=>r[l],alignmentToTranscript:l=>s[l],maps:{structureSeqToTranscriptSeqPosition:t,transcriptSeqToStructureSeqPosition:n,structurePositionToAlignmentMap:o,transcriptPositionToAlignmentMap:r,alignmentToStructurePosition:i,alignmentToTranscriptPosition:s}}}var ju=Object.fromEntries([{name:"alanine",abbreviation:"Ala",singleLetterCode:"A"},{name:"arginine",abbreviation:"Arg",singleLetterCode:"R"},{name:"asparagine",abbreviation:"Asn",singleLetterCode:"N"},{name:"aspartic acid",abbreviation:"Asp",singleLetterCode:"D"},{name:"cysteine",abbreviation:"Cys",singleLetterCode:"C"},{name:"glutamic acid",abbreviation:"Glu",singleLetterCode:"E"},{name:"glutamine",abbreviation:"Gln",singleLetterCode:"Q"},{name:"glycine",abbreviation:"Gly",singleLetterCode:"G"},{name:"histidine",abbreviation:"His",singleLetterCode:"H"},{name:"isoleucine",abbreviation:"Ile",singleLetterCode:"I"},{name:"leucine",abbreviation:"Leu",singleLetterCode:"L"},{name:"lysine",abbreviation:"Lys",singleLetterCode:"K"},{name:"methionine",abbreviation:"Met",singleLetterCode:"M"},{name:"phenylalanine",abbreviation:"Phe",singleLetterCode:"F"},{name:"proline",abbreviation:"Pro",singleLetterCode:"P"},{name:"serine",abbreviation:"Ser",singleLetterCode:"S"},{name:"threonine",abbreviation:"Thr",singleLetterCode:"T"},{name:"tryptophan",abbreviation:"Trp",singleLetterCode:"W"},{name:"tyrosine",abbreviation:"Tyr",singleLetterCode:"Y"},{name:"valine",abbreviation:"Val",singleLetterCode:"V"}].map(e=>[e.abbreviation.toUpperCase(),e]));os();is();Fn();function Ef(e,t){return{labelSeqId:e.StructureProperties.residue.label_seq_id(t),code:e.StructureProperties.atom.label_comp_id(t),chain:e.StructureProperties.chain.auth_asym_id(t),entityId:e.StructureProperties.entity.id(t)}}async function ss({plugin:e,kind:t,onUpdate:n}){let o=await He(),r=e.behaviors.interaction[t].subscribe(i=>{if(o.StructureElement.Loci.is(i.current.loci)){let s=o.StructureElement.Loci.getFirstLocation(i.current.loci);n(s?Ef(o,s):void 0)}else n(void 0)});return()=>{r.unsubscribe()}}Pe();lt();var Vf=ne.types.model({url:ne.types.maybe(ne.types.string),data:ne.types.maybe(ne.types.string),connectedViewId:ne.types.maybe(ne.types.string),pairwiseAlignment:ne.types.frozen(),feature:ne.types.frozen(),userProvidedTranscriptSequence:ne.types.optional(ne.types.string,""),initialSelection:ne.types.frozen()}).preProcessSnapshot(({uniprotId:e,pdbId:t,...n})=>({...n,url:Lo({...n,uniprotId:e,pdbId:t})})).volatile(()=>({clickedStructureRange:void 0,hoverPosition:void 0,entities:void 0,mappedEntityIndex:0,structureConfidence:void 0,isMouseInAlignment:!1,loadedToMolstar:!1,molstarStructure:void 0,alignmentHoverRange:void 0,selectedFeatureId:void 0,hiddenFeatureTypes:new Set,expandedFeatureTypes:new Set})).actions(e=>({setStructureData(t){e.entities=t.entities,e.structureConfidence=t.confidence,e.molstarStructure=t.molstarStructure},hideFeatureType(t){e.hiddenFeatureTypes=new Set([...e.hiddenFeatureTypes,t])},showFeatureType(t){let n=new Set(e.hiddenFeatureTypes);n.delete(t),e.hiddenFeatureTypes=n},showAllFeatureTypes(){e.hiddenFeatureTypes=new Set},toggleFeatureTypeExpanded(t){let n=new Set(e.expandedFeatureTypes);n.has(t)?n.delete(t):n.add(t),e.expandedFeatureTypes=n},setLoadedToMolstar(t){e.loadedToMolstar=t,t||(e.molstarStructure=void 0)}})).views(e=>({get connectedView(){let{views:t}=(0,so.getSession)(e);return t.find(n=>n.id===e.connectedViewId)}})).actions(e=>({setClickedStructureRange(t){e.clickedStructureRange=t},setAlignmentHoverRange(t){e.alignmentHoverRange=t},setSelectedFeatureId(t){e.selectedFeatureId=t},setHoveredPosition(t){e.hoverPosition=t?{...t,source:"structure"}:void 0},setGenomeHoveredPosition(t){e.hoverPosition=t===void 0?void 0:{structureSeqPos:t,source:"genome"}},setAlignment(t){e.pairwiseAlignment=t},setMappedEntityIndex(t){e.mappedEntityIndex=t},setIsMouseInAlignment(t){e.isMouseInAlignment=t}})).views(e=>({get structureSequences(){return e.entities?.map(t=>t.seq)},get mappedEntity(){return e.entities?.[e.mappedEntityIndex]},get mappedStructureSeq(){return this.mappedEntity?.seq},get mappedEntityId(){return this.mappedEntity?.entityId},get uniprotId(){let{url:t}=e;if(t)return An(t)},get coordinateMapper(){return e.pairwiseAlignment?zu(e.pairwiseAlignment):void 0},get structureSeqToTranscriptSeqPosition(){return this.coordinateMapper?.maps.structureSeqToTranscriptSeqPosition},get transcriptSeqToStructureSeqPosition(){return this.coordinateMapper?.maps.transcriptSeqToStructureSeqPosition},get structurePositionToAlignmentMap(){return this.coordinateMapper?.maps.structurePositionToAlignmentMap},get transcriptPositionToAlignmentMap(){return this.coordinateMapper?.maps.transcriptPositionToAlignmentMap},get confidenceCells(){let t=e.structureConfidence;return t&&t.entityId===this.mappedEntityId&&xu(t.values)?rs(t.values,this.structurePositionToAlignmentMap):[]},get hydrophobicityCells(){let t=this.mappedStructureSeq;return t?rs(Ku(de(t)),this.structurePositionToAlignmentMap):[]},get pairwiseAlignmentToTranscriptPosition(){return this.coordinateMapper?.maps.alignmentToTranscriptPosition},get pairwiseAlignmentToStructurePosition(){return this.coordinateMapper?.maps.alignmentToStructurePosition},get hoverString(){let t=e.hoverPosition;if(t===void 0)return"";let n=this.hoverStructureLetter,o=this.hoverGenomeLetter,r=[];return t.structureSeqPos!==void 0&&r.push(`${t.structureSeqPos+1}`),n&&r.push(`Structure: ${n}`),o&&n&&o!==n&&r.push(`Genome: ${o}`),t.chain&&r.push(`Chain: ${t.chain}`),r.join(", ")},get genomeToTranscriptSeqMapping(){return e.feature?wn(new so.SimpleFeature(e.feature)):void 0},get structureSeqHoverPos(){return e.hoverPosition?.structureSeqPos},get alignmentHoverPos(){let t=this.structureSeqHoverPos;return t===void 0?void 0:this.coordinateMapper?.structureToAlignment(Ou(t))},get hoverStructureRange(){let{alignmentHoverRange:t}=e,n=this.pairwiseAlignmentToStructurePosition;if(!t||!n)return;let o=n[t.start],r=n[t.end];return o===void 0||r===void 0?void 0:{start:o,end:r+1}},get hoverHighlightRange(){let t=this.structureSeqHoverPos;return this.hoverStructureRange??(t===void 0?void 0:{start:t,end:t+1})},get labelSeqIdIndex(){return yp(this.mappedEntity)},get selectLabelSeqIds(){let t=this.mappedEntity,n=e.clickedStructureRange;if(n)return Ti(t,n);let o=this.structureSeqToTranscriptSeqPosition;return this.showHighlight&&o?bp(t,Object.keys(o).map(Number)):[]},get hoverLabelSeqIds(){return Ti(this.mappedEntity,this.hoverHighlightRange)},get clickAlignmentRange(){let t=e.clickedStructureRange,n=this.structurePositionToAlignmentMap;if(!t||!n)return;let o=n[t.start],r=n[t.end-1];return o===void 0||r===void 0?void 0:{start:o,end:r}},structureRangeToGenomeHighlight(t){let n=e.connectedView?.assemblyNames[0],o=this.genomeToTranscriptSeqMapping;if(!t||!n||!o)return[];let r={genomeToTranscriptSeqMapping:o,pairwiseAlignment:e.pairwiseAlignment,structureSeqToTranscriptSeqPosition:this.structureSeqToTranscriptSeqPosition},i=t.end>t.start+1?ns({model:r,structureSeqPos:t.start,structureSeqEndPos:t.end}):pr({model:r,structureSeqPos:t.start});if(!i)return[];let[s,l]=i;return[{assemblyName:n,refName:o.refName,start:s,end:l}]},get hoverGenomeHighlights(){return e.hoverPosition?.source==="genome"?[]:this.structureRangeToGenomeHighlight(this.hoverHighlightRange)},get clickGenomeHighlights(){return this.structureRangeToGenomeHighlight(e.clickedStructureRange)},get hoverStructureLetter(){let t=e.hoverPosition?.code;if(t)return ju[t]?.singleLetterCode;let n=this.structureSeqHoverPos,o=this.mappedStructureSeq;if(n!==void 0&&o)return o[n]},get hoverGenomeLetter(){let t=this.structureSeqHoverPos;if(t===void 0)return;let n=this.structureSeqToTranscriptSeqPosition?.[t];if(n!==void 0)return e.userProvidedTranscriptSequence[n]},get alignmentMatchSet(){let t=e.pairwiseAlignment?.consensus;if(!t)return;let n=new Set;for(let o=0;o<t.length;o++)(t[o]==="|"||t[o]===":")&&n.add(o);return n},get alignmentPending(){return!e.pairwiseAlignment&&!!e.userProvidedTranscriptSequence&&!!this.structureSequences?.length},get exactMatch(){let t=de(e.userProvidedTranscriptSequence),n=this.mappedStructureSeq?de(this.mappedStructureSeq):void 0;return t===n},get parentView(){return(0,ne.getParent)(e,2)},get zoomToBaseLevel(){return this.parentView.zoomToBaseLevel},get autoScrollAlignment(){return this.parentView.autoScrollAlignment},get showHighlight(){return this.parentView.showHighlight},get showProteinTracks(){return this.parentView.showProteinTracks},get trackHeight(){return this.parentView.compactTracks?8:12},get trackGap(){return this.parentView.compactTracks?1:2},get alignmentAlgorithm(){return this.parentView.alignmentAlgorithm},get molstarPluginContext(){return this.parentView.molstarPluginContext}})).actions(e=>({setError(t){e.parentView.setError(t)},hoverAlignmentPosition(t){if(!e.alignmentHoverRange){let n=e.coordinateMapper?.alignmentToStructure(ts(t));e.setHoveredPosition(n!==void 0?{structureSeqPos:n}:void 0)}},clickAlignmentPosition(t){let n=e.coordinateMapper?.alignmentToStructure(ts(t));e.setSelectedFeatureId(void 0),n!==void 0?ro({model:e,structureSeqPos:n}).catch(o=>{console.error(o),e.parentView.setError(o)}):e.setClickedStructureRange(void 0)}})).actions(e=>({afterAttach(){e.initialSelection&&e.setClickedStructureRange(e.initialSelection);let t=(r,i)=>{let s;(0,ne.addDisposer)(e,()=>{s?.()}),(0,ne.addDisposer)(e,(0,io.autorun)(async()=>{let{molstarPluginContext:l}=e;if(s?.(),s=void 0,l){let a=await ss({plugin:l,kind:r,onUpdate:i});(0,ne.isAlive)(e)&&e.molstarPluginContext===l?s=a:a()}}))};(0,ne.addDisposer)(e,(0,io.autorun)(async()=>{try{let{userProvidedTranscriptSequence:r,structureSequences:i,alignmentAlgorithm:s}=e;if(e.pairwiseAlignment||!r||!i?.length)return;let l=Hu(r,i,s);if(!l)return;e.setMappedEntityIndex(l.index),e.setAlignment(l.alignment),l.matches<go(l.alignment)&&e.parentView.setShowAlignment(!0)}catch(r){console.error(r),e.parentView.setError(r)}})),(0,ne.addDisposer)(e,(0,io.autorun)(()=>{let{hovered:r}=(0,so.getSession)(e),{transcriptSeqToStructureSeqPosition:i,genomeToTranscriptSeqMapping:s,connectedView:l}=e,a=l?.initialized?mo(r,s):void 0;a!==void 0?e.setGenomeHoveredPosition(i?.[a]):e.hoverPosition?.source==="genome"&&e.setGenomeHoveredPosition(void 0)}));let n=r=>{if(!r||!Gu(r.entityId,e.coordinateMapper?e.mappedEntityId:void 0))return;let i=e.labelSeqIdIndex.get(r.labelSeqId);return i===void 0?void 0:{...r,structureSeqPos:i}};t("click",r=>{let i=n(r);i&&(e.setHoveredPosition(i),e.setSelectedFeatureId(void 0),ro({model:e,structureSeqPos:i.structureSeqPos}).catch(s=>{console.error(s),e.parentView.setError(s)}))}),t("hover",r=>{e.setHoveredPosition(n(r))});let o=(r,i)=>{(0,ne.addDisposer)(e,(0,io.autorun)(async()=>{let{molstarStructure:s,molstarPluginContext:l}=e,a=i();s&&l&&await Au({structure:s,plugin:l,channel:r,entityId:e.mappedEntityId,labelSeqIds:a})}))};o("select",()=>e.selectLabelSeqIds),o("highlight",()=>e.hoverLabelSeqIds)}})),as=Vf;var Qu=p(Dn());Fn();var Gf="SuperpositionTransform";async function ur(e){let{QueryContext:t,StructureElement:n,StructureSelection:o,StructureSelectionQueries:r,PluginCommands:i,PluginStateObject:s,tmAlign:l}=await He(),a=e.managers.structure.hierarchy.current.structures;if(a.length<2)return;let{query:c}=r.trace,m=a.map(h=>{let b=h.cell.obj?.data;if(!b)return;let x=e.helpers.substructureParent.get(b);if(!x)return;let w=e.state.data.selectQ(f=>f.byValue(x).rootOfType(s.Molecule.Structure))[0]?.obj?.data;if(!w)return;let y=o.toLociWithSourceUnits(c(new t(b)));return n.Loci.remap(y,w)}).filter(h=>h!==void 0);if(m.length<2)return;let g=e.managers.structure.hierarchy.findStructure(m[0]?.structure)?.transform?.cell.obj?.data.coordinateSystem;for(let h=1;h<m.length;h++){let b=l(m[0],m[h]),{bTransform:x,tmScoreA:w,tmScoreB:y,rmsd:f,alignedLength:A}=b;await Hf(e,a[h].cell,x,g),e.log.info(`TM-align: TM-score=${w.toFixed(4)}/${y.toFixed(4)}, RMSD=${f.toFixed(2)} \xC5, aligned ${A} residues.`)}await new Promise(h=>requestAnimationFrame(h)),await i.Camera.Reset(e)}async function Hf(e,t,n,o){let{Mat4:r,StateObjectRef:i,StateTransforms:s}=await He(),l=i.resolveAndCheck(e.state.data,t);if(!l)return;let a=e.state.data.selectQ(d=>d.byRef(l.transform.ref).subtree().withTransformer(s.Model.TransformStructureConformation))[0],u={transform:{name:"matrix",params:{data:o&&!r.isIdentity(o.matrix)?r.mul(r(),o.matrix,n):n,transpose:!1}}},m=a?e.state.data.build().to(a).update(u):e.state.data.build().to(t).insert(s.Model.TransformStructureConformation,u,{tags:Gf});await e.runTask(e.state.data.updateTree(m))}function $u(e){let t=!1,n=0,o;function r(){let{molstarPluginContext:i,structures:s}=e,l=s.filter(a=>a.loadedToMolstar).length;i!==o&&(n=0),i&&!t&&l>=2&&l!==n&&(t=!0,ur(i).catch(a=>{(0,Qu.isAlive)(e)&&(e.setError(a),console.error(a))}).finally(()=>{t=!1,n=l,o=i,r()}))}return r}var Zu="proteinView-settings",ls=["showAlignment","showProteinTracks","showHighlight","zoomToBaseLevel","autoScrollAlignment","compactTracks"],Bf={showAlignment:!0,showProteinTracks:!0,showHighlight:!1,zoomToBaseLevel:!0,autoScrollAlignment:!1,compactTracks:!0};function Uf(){return fe.types.compose("ProteinView",Xu.BaseViewModel,fe.types.model({id:ec.ElementId,type:fe.types.literal("ProteinView"),structures:fe.types.array(as),showControls:!1,height:fe.types.optional(fe.types.number,650),showHighlight:!1,zoomToBaseLevel:!0,autoScrollAlignment:!1,colorScheme:fe.types.optional(fe.types.enumeration("ColorScheme",yu),"default"),showAlignment:!0,showProteinTracks:!0,compactTracks:!0,alignmentAlgorithm:fe.types.optional(fe.types.enumeration("AlignmentAlgorithm",Wr),Wn),connectedMsaViewId:fe.types.maybe(fe.types.string)})).volatile(()=>({error:void 0,molstarPluginContext:void 0,showManualAlignmentDialog:!1,showAddStructureDialog:!1})).actions(e=>({setHeight(t){return e.height=t,t},setShowAlignment(t){e.showAlignment=t},setShowControls(t){e.showControls=t},setError(t){e.error=t},setShowHighlight(t){e.showHighlight=t},setShowProteinTracks(t){e.showProteinTracks=t},setCompactTracks(t){e.compactTracks=t},setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setAutoScrollAlignment(t){e.autoScrollAlignment=t},setAlignmentAlgorithm(t){e.alignmentAlgorithm=t},setColorScheme(t){e.colorScheme=t},setMolstarPluginContext(t){if(t!==e.molstarPluginContext)for(let n of e.structures)n.setLoadedToMolstar(!1);e.molstarPluginContext=t},setShowManualAlignmentDialog(t){e.showManualAlignmentDialog=t},setShowAddStructureDialog(t){e.showAddStructureDialog=t},setConnectedMsaViewId(t){e.connectedMsaViewId=t},addStructure(t){e.structures.push(as.create(t))}})).actions(e=>({afterAttach(){try{let t=localStorage.getItem(Zu);if(t){let n=JSON.parse(t);for(let o of ls)n[o]!==void 0&&e[o]===Bf[o]&&(e[o]=n[o])}}catch(t){console.error("Failed to restore protein view settings",t)}(0,fe.addDisposer)(e,(0,Vn.reaction)(()=>ls.map(t=>e[t]),()=>{try{let t={};for(let n of ls)t[n]=e[n];localStorage.setItem(Zu,JSON.stringify(t))}catch(t){console.error("Failed to save protein view settings",t)}})),(0,fe.addDisposer)(e,(0,Vn.autorun)(()=>{let{molstarPluginContext:t,colorScheme:n}=e,o=e.structures.filter(r=>r.structureSequences!==void 0).length;t&&o>0&&Su({plugin:t,colorScheme:n}).catch(r=>{console.error(r),e.setError(r)})})),(0,fe.addDisposer)(e,(0,Vn.autorun)(Tu(e))),(0,fe.addDisposer)(e,(0,Vn.autorun)($u(e)))}})).views(e=>({get primaryStructure(){return e.structures[0]},menuItems(){return[{label:"Pairwise alignment",icon:Ki,type:"checkbox",checked:e.showAlignment,onClick:()=>{e.setShowAlignment(!e.showAlignment)}},{label:"Protein feature tracks",icon:Ki,type:"checkbox",checked:e.showProteinTracks,onClick:()=>{e.setShowProteinTracks(!e.showProteinTracks)}},{label:"Color scheme...",subMenu:Nn.map(t=>({label:t.label,type:"radio",checked:e.colorScheme===t.value,onClick:()=>{e.setColorScheme(t.value)}}))},{label:"Add structure...",onClick:()=>{e.setShowAddStructureDialog(!0)}},{label:"Advanced...",icon:Pn,subMenu:[{label:"Pairwise alignment as green highlight",type:"checkbox",checked:e.showHighlight,onClick:()=>{e.setShowHighlight(!e.showHighlight)}},{label:"Show all protein feature tracks",onClick:()=>{for(let t of e.structures)t.showAllFeatureTypes()}},{label:"Import manual alignment...",onClick:()=>{e.setShowManualAlignmentDialog(!0)}},{label:"Re-align structures (TM-align)",onClick:()=>{e.molstarPluginContext&&ur(e.molstarPluginContext).catch(t=>{console.error(t),e.setError(t)})}},{label:"Zoom to base level on click",type:"checkbox",checked:e.zoomToBaseLevel,onClick:()=>{e.setZoomToBaseLevel(!e.zoomToBaseLevel)}},{label:"Auto-scroll alignment to hovered position",type:"checkbox",checked:e.autoScrollAlignment,onClick:()=>{e.setAutoScrollAlignment(!e.autoScrollAlignment)}}]}]}}))}var tc=Uf;var Sh=(0,Qm.lazy)(()=>Promise.resolve().then(()=>(Ym(),Jm)));function Ts(e){e.addViewType(()=>new $m.ViewType({name:"ProteinView",displayName:"Protein view",stateModel:tc(),ReactComponent:Sh}))}var rd=p(xo());var Zm=p(en());var wh=(0,Zm.ConfigurationSchema)("UniProtVariationAdapter",{location:{type:"fileLocation",defaultValue:{uri:"/path/to/my.bed.gz",locationType:"UriLocation"}},scoreField:{type:"string",defaultValue:""}},{explicitlyTyped:!0}),Xm=wh;function As(e){e.addAdapterType(()=>new rd.default({name:"UniProtVariationAdapter",displayName:"UniProtVariation adapter",configSchema:Xm,getAdapterClass:()=>Promise.resolve().then(()=>(od(),nd)).then(t=>t.default)}))}var id="0.8.3";var br=class extends sd.default{name="ProteinViewer";version=id;install(t){Ts(t),zi(t),_i(t),Lr(t),Er(t),Fr(t),As(t)}configure(t){}};return gd(xh);})();
28
+ `)}function Vi(e){let{tCa:t,tSeq:n}=e;return!!t&&!!n&&t.split(",").length>=3}Pe();function Gi({hit:e,session:t,view:n,feature:o,selectedTranscript:r,userProvidedTranscriptSequence:i,onClose:s}){let[l,a]=(0,$e.useState)(null),c=!!l,u=An(e.target),m=A=>{a(A.currentTarget)},d=()=>{a(null)},{runLaunch:g,launchError:h}=Cn(s,d),b={session:t,view:n,feature:o,selectedTranscript:r,uniprotId:u},x=g(()=>{let A=!e.structureUrl&&Vi(e)?_p(e.tCa,e.tSeq,"A",e.target):void 0;rn({...b,url:e.structureUrl,data:A,userProvidedTranscriptSequence:i})}),{launch1D:w,launchMsa:y}=Vo({...b,confidenceUrl:Sl(e.target)});return!!e.structureUrl||Vi(e)?$e.default.createElement($e.default.Fragment,null,h?$e.default.createElement(Wp.ErrorMessage,{error:h}):null,$e.default.createElement(Ut.Button,{size:"small",variant:"outlined",onClick:m},"Load"),$e.default.createElement(Ut.Menu,{anchorEl:l,open:c,onClose:d},$e.default.createElement(Ut.MenuItem,{"data-testid":"protein-launch-option-3d",onClick:x},Tt["3d"]),w?$e.default.createElement(Ut.MenuItem,{"data-testid":"protein-launch-option-1d",onClick:g(w)},Tt["1d"]):null,y?$e.default.createElement(Ut.MenuItem,{"data-testid":"protein-launch-option-msa",onClick:g(y)},Tt.msa):null)):$e.default.createElement("span",null,"-")}Pe();var tf=(0,Kp.makeStyles)()(e=>({root:{display:"flex",flexDirection:"column",gap:16},tableContainer:{maxHeight:400},headerCell:{fontWeight:"bold",backgroundColor:e.palette.mode==="dark"?e.palette.grey[900]:e.palette.grey[100]},noResults:{padding:16,textAlign:"center"}})),nf=100;function of(e){let t=e.results.flatMap(n=>(n.alignments??[]).flat().map(o=>({...o,db:n.db,structureUrl:yl(o.target,n.db)})));return t.sort((n,o)=>(n.eval??1/0)-(o.eval??1/0)),t}function Hi({results:e,session:t,view:n,feature:o,selectedTranscript:r,userProvidedTranscriptSequence:i,onClose:s}){let{classes:l}=tf(),a=of(e),c=a.slice(0,nf);return c.length===0?j.default.createElement(G.Paper,{className:l.noResults},j.default.createElement(G.Typography,null,"No similar structures found")):j.default.createElement("div",{className:l.root},j.default.createElement(G.Typography,{variant:"subtitle2"},"Found ",a.length," similar structures",a.length>c.length?` (showing top ${c.length})`:""),j.default.createElement(G.TableContainer,{component:G.Paper,className:l.tableContainer},j.default.createElement(G.Table,{size:"small",stickyHeader:!0},j.default.createElement(G.TableHead,null,j.default.createElement(G.TableRow,null,j.default.createElement(G.TableCell,{className:l.headerCell},"Database"),j.default.createElement(G.TableCell,{className:l.headerCell},"Target"),j.default.createElement(G.TableCell,{className:l.headerCell},"Organism"),j.default.createElement(G.TableCell,{className:l.headerCell},"Prob"),j.default.createElement(G.TableCell,{className:l.headerCell},"Seq. Id."),j.default.createElement(G.TableCell,{className:l.headerCell},"Coverage"),j.default.createElement(G.TableCell,{className:l.headerCell},"E-value"),j.default.createElement(G.TableCell,{className:l.headerCell},"Actions"))),j.default.createElement(G.TableBody,null,c.map((u,m)=>j.default.createElement(G.TableRow,{key:`${u.db}-${u.target}-${m}`},j.default.createElement(G.TableCell,null,u.db),j.default.createElement(G.TableCell,null,u.target),j.default.createElement(G.TableCell,null,u.taxName??"-"),j.default.createElement(G.TableCell,null,u.prob!=null?`${(u.prob*100).toFixed(1)}%`:"-"),j.default.createElement(G.TableCell,null,u.seqId!=null?`${u.seqId.toFixed(1)}%`:"-"),j.default.createElement(G.TableCell,null,u.alnLength!=null&&u.qLen!=null?`${(u.alnLength/u.qLen*100).toFixed(1)}%`:"-"),j.default.createElement(G.TableCell,null,u.eval!=null?u.eval.toExponential(2):"-"),j.default.createElement(G.TableCell,null,j.default.createElement(Gi,{hit:u,session:t,view:n,feature:o,selectedTranscript:r,userProvidedTranscriptSequence:i,onClose:s}))))))))}var it=p(S());function Bi(){let[e,t]=(0,it.useState)(),[n,o]=(0,it.useState)(),[r,i]=(0,it.useState)(!1),[s,l]=(0,it.useState)(!1),[a,c]=(0,it.useState)(),[u,m]=(0,it.useState)(""),d=(0,it.useRef)(null);(0,it.useEffect)(()=>()=>{d.current?.abort()},[]);let g=()=>{d.current?.abort();let w=new AbortController;return d.current=w,w.signal},h=async w=>{let y=g();l(!0),c(void 0),m("Predicting 3Di structure...");try{let f=await Up({aaSequence:w,signal:y});return o(f),f}catch(f){y.aborted||(console.error(f),c(f));return}finally{y.aborted||(l(!1),m(""))}},b=async(w,y,f=nr)=>{let A=g();i(!0),c(void 0),m("Submitting search...");try{let P=await Rp({aaSequence:w,di3Sequence:y,databases:f,signal:A}),v=await Op({ticketId:P.id,onStatusChange:m,signal:A});return t(v),v}catch(P){A.aborted||(console.error(P),c(P));return}finally{A.aborted||(i(!1),m(""))}},x=()=>{d.current?.abort(),t(void 0),o(void 0),c(void 0),m("")};return{results:e,cleanedAaSequence:n?.aaSequence,di3Sequence:n?.di3Sequence,isLoading:r,isPredicting:s,error:a,statusMessage:u,predictStructure:h,search:b,reset:x}}var rf=(0,Yp.makeStyles)()({dialogContent:{width:"80em",display:"flex",flexDirection:"column",gap:20},sequenceInput:{fontFamily:"monospace"},di3Section:{display:"flex",flexDirection:"column",gap:8}}),sf=(0,Jp.observer)(function({feature:t,session:n,view:o,handleClose:r}){let{classes:i}=rf(),[s,l]=(0,X.useState)(),[a,c]=(0,X.useState)(nr),{results:u,cleanedAaSequence:m,di3Sequence:d,isLoading:g,isPredicting:h,error:b,statusMessage:x,predictStructure:w,search:y,reset:f}=Bi(),{transcripts:A,isoformSequences:P,isLoading:v,error:D,selectedTranscriptId:E,setSelectedTranscriptId:I,selectedTranscript:L,selectedIsoform:oe}=pn({feature:t,view:o}),C=oe?yo(oe.seq):"",O=s??C,pe=()=>{(d!==void 0||u!==void 0)&&f()},Re=Ie=>{I(Ie),l(void 0),pe()},ke=O.trim().length>0&&!h&&!g,Me=!!m&&!!d&&a.length>0&&!g,Ee=b??D,Oe=g||h;return X.default.createElement(X.default.Fragment,null,X.default.createElement(Le.DialogContent,{className:i.dialogContent},Ee&&!v?X.default.createElement(eo.ErrorMessage,{error:Ee}):null,v?X.default.createElement(eo.LoadingEllipses,{variant:"subtitle2",message:"Loading transcript sequences"}):null,P?X.default.createElement(X.default.Fragment,null,X.default.createElement(sn,{val:E,setVal:Re,isoforms:A,isoformSequences:P,feature:t,disabled:Oe}),X.default.createElement(Le.TextField,{label:"Protein sequence (amino acids)",multiline:!0,rows:4,value:O,onChange:Ie=>{l(Ie.target.value),pe()},placeholder:"MKTVRQERLKSIVRILERSKEPVSGAQLAEEL...",disabled:Oe,InputProps:{className:i.sequenceInput}})):null,d?X.default.createElement("div",{className:i.di3Section},X.default.createElement(Le.Typography,{variant:"subtitle2"},"3Di structural alphabet (used for searching):"),X.default.createElement(Le.TextField,{multiline:!0,rows:4,value:d,InputProps:{className:i.sequenceInput,readOnly:!0}})):null,X.default.createElement(Di,{selected:a,onChange:c,disabled:Oe}),x?X.default.createElement(eo.LoadingEllipses,{variant:"subtitle2",message:x}):null,u?X.default.createElement(Hi,{results:u,session:n,view:o,feature:t,selectedTranscript:L,userProvidedTranscriptSequence:O,onClose:r}):null),X.default.createElement(Le.DialogActions,null,X.default.createElement(Le.Button,{variant:"contained",color:"secondary",onClick:()=>{r()}},"Cancel"),u?X.default.createElement(Le.Button,{variant:"outlined",onClick:()=>{f()}},"New search"):null,d?X.default.createElement(Le.Button,{variant:"contained",color:"primary",disabled:!Me,onClick:()=>{y(m,d,a)}},g?"Searching...":"Search Foldseek"):X.default.createElement(Le.Button,{variant:"contained",color:"primary",disabled:!ke,onClick:()=>{w(O.trim())}},h?"Predicting...":"Predict 3Di structure")))}),Qp=sf;var Be=p(S());Ui();var ou=p(V()),af=(0,Be.lazy)(()=>Promise.resolve().then(()=>(nu(),tu)));function to(){let[e,t]=(0,Be.useState)(!1);return Be.default.createElement(Be.default.Fragment,null,Be.default.createElement(ou.IconButton,{onClick:()=>{t(!0)}},Be.default.createElement(or,null)),e?Be.default.createElement(Be.Suspense,{fallback:null},Be.default.createElement(af,{handleClose:()=>{t(!1)}})):null)}var ru=p(S());function no({children:e,value:t,index:n,...o}){return ru.default.createElement("div",{role:"tabpanel",hidden:t!==n,...o},e)}var ee=p(S()),rr=p(_e()),cn=p(V()),iu=p($()),su=p(tt());var ue=p(S()),le=p(V());Pe();function Ri({choice:e,setChoice:t,structureURL:n,setStructureURL:o,setFile:r,pdbId:i,setPdbId:s}){return ue.default.createElement("div",{style:{display:"flex",margin:30}},ue.default.createElement(le.Typography,null,"Open your structure file ",ue.default.createElement(to,null)),ue.default.createElement(le.FormControl,{component:"fieldset"},ue.default.createElement(le.RadioGroup,{value:e,onChange:l=>{t(l.target.value)}},ue.default.createElement(le.FormControlLabel,{value:"url",control:ue.default.createElement(le.Radio,null),label:"URL"}),ue.default.createElement(le.FormControlLabel,{value:"file",control:ue.default.createElement(le.Radio,null),label:"File"}),ue.default.createElement(le.FormControlLabel,{value:"pdb",control:ue.default.createElement(le.Radio,null),label:"PDB ID"}))),e==="url"?ue.default.createElement("div",null,ue.default.createElement(le.Typography,null,"Open a PDB/mmCIF/etc. file from remote URL"),ue.default.createElement(le.TextField,{label:"URL",value:n,onChange:l=>{o(l.target.value)}})):null,e==="file"?ue.default.createElement("div",{style:{paddingTop:20}},ue.default.createElement(le.Typography,null,"Open a PDB/mmCIF/etc. file from your local drive"),ue.default.createElement(le.Button,{variant:"outlined",component:"label"},"Choose file",ue.default.createElement("input",{type:"file",hidden:!0,onChange:({target:l})=>{let a=l.files?.[0];a&&r(a)}}))):null,e==="pdb"?ue.default.createElement(le.TextField,{value:i,onChange:l=>{let a=l.target.value;s(a),o(Io(a))},label:"PDB ID"}):null)}nn();var lf=(0,su.makeStyles)()(e=>({dialogContent:{marginTop:e.spacing(6),width:"80em"},textAreaFont:{fontFamily:"Courier New"}}));function pf(){return ee.default.createElement("div",{style:{marginBottom:20}},"Manually supply a protein structure (PDB, mmCIF, etc) for a given transcript. You can open the file from the result of running, for example,"," ",ee.default.createElement(be,{href:"https://github.com/sokrypton/ColabFold"},"ColabFold"),". This plugin will align the protein sequence calculated from the genome to the protein sequence embedded in the structure file which allows for slight differences in these two representations.")}var uf=(0,iu.observer)(function({feature:t,session:n,view:o,handleClose:r,alignmentAlgorithm:i,onAlignmentAlgorithmChange:s}){let{classes:l}=lf(),[a,c]=(0,ee.useState)(),[u,m]=(0,ee.useState)(""),[d,g]=(0,ee.useState)("file"),[h,b]=(0,ee.useState)(""),{runLaunch:x,launchError:w}=Cn(r),y=d==="file"?a:void 0,f=d==="file"?"":h,{sequences:A,error:P}=Xn({file:y,url:f}),v=y?.name??f.slice(f.lastIndexOf("/")+1),{transcripts:D,isoformSequences:E,structureSequence:I,selectedTranscriptId:L,setSelectedTranscriptId:oe,selectedTranscript:C,selectedIsoform:O,error:pe}=pn({feature:t,view:o,structureSequences:A}),Re=pe??w??P,ke=!!(f||y)&&!!O&&!!C,Me=!!O?.seq&&!!I&&de(O.seq)!==I,Ee=x(async()=>{if(O&&C){let Oe=y?await y.text():void 0;rn({session:n,view:o,feature:t,selectedTranscript:C,url:f||void 0,data:Oe,userProvidedTranscriptSequence:O.seq,alignmentAlgorithm:i})}});return ee.default.createElement(ee.default.Fragment,null,ee.default.createElement(cn.DialogContent,{className:l.dialogContent},Re?ee.default.createElement(rr.ErrorMessage,{error:Re}):null,ee.default.createElement(pf,null),ee.default.createElement(Ri,{choice:d,setChoice:g,structureURL:h,setStructureURL:b,setFile:c,pdbId:u,setPdbId:m}),ee.default.createElement("div",{style:{margin:20}},E?I?ee.default.createElement(ee.default.Fragment,null,ee.default.createElement(sn,{val:L,setVal:oe,structureSequence:I,isoforms:D,feature:t,isoformSequences:E}),ee.default.createElement(zn,{structureSequence:I,structureName:v,isoformSequences:E})):null:ee.default.createElement(rr.LoadingEllipses,{title:"Loading protein sequences",variant:"h6"}))),ee.default.createElement(cn.DialogActions,null,Me?ee.default.createElement(Kn,{alignmentAlgorithm:i,onAlignmentAlgorithmChange:s}):null,ee.default.createElement(cn.Button,{variant:"contained",color:"secondary",onClick:()=>{r()}},"Cancel"),ee.default.createElement(cn.Button,{variant:"contained",color:"primary",disabled:!ke,onClick:()=>{Ee()}},"Launch 3D protein structure view")))}),au=uf;var lu=p(S());function pu(e,t){let[n,o]=(0,lu.useState)(()=>{let i=localStorage.getItem(e);if(i)try{return JSON.parse(i)}catch{return t}return t});function r(i){o(i),localStorage.setItem(e,JSON.stringify(i))}return[n,r]}function Oi({handleClose:e,feature:t,model:n}){let[o,r]=(0,Se.useState)(0),[i,s]=pu("jbrowse-protein3d-alignment-algorithm",Wn),l=(0,ir.getSession)(n),a=(0,ir.getContainingView)(n);return Se.default.createElement(uu.Dialog,{"data-testid":"launch-protein-view-dialog",maxWidth:"xl",title:"Launch protein view",titleNode:Se.default.createElement(Se.default.Fragment,null,"Launch protein view ",Se.default.createElement(to,null)),open:!0,onClose:e},Se.default.createElement(qn.Tabs,{value:o,onChange:(c,u)=>{r(u)}},Se.default.createElement(qn.Tab,{value:0,label:"AlphaFoldDB search"}),Se.default.createElement(qn.Tab,{value:1,label:"Foldseek search"}),Se.default.createElement(qn.Tab,{value:2,label:"Open file manually"})),Se.default.createElement(no,{value:o,index:0},Se.default.createElement(Bp,{session:l,view:a,feature:t,handleClose:e,alignmentAlgorithm:i,onAlignmentAlgorithmChange:s})),Se.default.createElement(no,{value:o,index:1},Se.default.createElement(Qp,{session:l,view:a,feature:t,handleClose:e})),Se.default.createElement(no,{value:o,index:2},Se.default.createElement(au,{session:l,view:a,feature:t,handleClose:e,alignmentAlgorithm:i,onAlignmentAlgorithmChange:s})))}function cf(e){return e.name==="LinearBasicDisplay"}var mf=["gene","mRNA","transcript"];function df(e,t){let{item:n,subfeature:o,displayedRegionIndex:r}=e,i=o?o.type:n.type,s=o?o.parentFeatureId:n.featureId;return i===void 0?void 0:{type:i,fetchFeature:()=>t(s,r)}}function gf(e){let t=e.get("type");return t===void 0?void 0:{type:t,feature:e}}function ff(e){let{contextMenuFeature:t,contextMenuInfo:n,fetchFullFeature:o}=e;return n&&o?df(n,o):t?gf(t):void 0}function hf(e,t){let n=(0,sr.getContainingTrack)(e),o=(0,sr.getSession)(n),r=i=>{o.queueDialog(s=>[Oi,{model:n,handleClose:s,feature:i}])};"feature"in t?r(t.feature):t.fetchFeature().then(i=>{i?r(i):o.notify("Could not load feature for protein view","warning")}).catch(i=>{console.error(i),o.notifyError(`${i}`,i)})}function bf(e){return e.views(t=>{let n=t.contextMenuItems;return{contextMenuItems(){let o=ff(t);return[...n.call(t),...o&&mf.includes(o.type)?[{label:"Launch protein view",icon:nl,onClick:()=>{hf(t,o)}}]:[]]}}})}function zi(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(cf(t)&&(t.stateModel=bf(t.stateModel)),t))}var ji=p(en()),cu=p(ie());function yf(e){if(typeof e=="string")return e;let{trackId:t}=e;return typeof t=="string"?t:void 0}function Sf(e,t){let n=e;return n.getTrackById?.(t)??n.getTracksById?.()[t]??n.tracks?.find(o=>(0,ji.readConfObject)(o,"trackId")===t)}function wf(e,t){let n=On(t);return[e.get("name"),e.get("id"),e.id()].some(o=>typeof o=="string"&&(o===t||On(o)===n))}async function mu({session:e,structureUrl:t,transcriptId:n,connectedView:o}){if(!n)throw new Error("transcriptId is required to launch from a uniprotId or pdbId");let r=o?.assembly,i=o?.loc,s=o?.tracks??[];if(!r||!i)throw new Error("connectedView with assembly + loc is required to launch from a uniprotId");let l=await e.assemblyManager.waitForAssembly(r);if(!l)throw new Error(`assembly "${r}" not found`);let a=(0,cu.parseLocString)(i,x=>l.isValidRefName(x));if(a.start===void 0||a.end===void 0)throw new Error(`could not parse a start-end region from loc "${i}"`);let c={assemblyName:r,refName:l.getCanonicalRefName(a.refName)??a.refName,start:a.start,end:a.end},u=s.map(yf).filter(x=>x!==void 0),m="getFeatures",d=[];for(let x of u){let w=Sf(e,x);if(!w)continue;let y=await e.rpcManager.call(m,"CoreGetFeatures",{adapterConfig:(0,ji.readConfObject)(w,"adapter"),sessionId:m,regions:[c]});for(let f of y)d.push(...Xt(f))}let g=d.find(x=>wf(x,n));if(!g)throw new Error(`transcript "${n}" not found at ${i} in tracks [${u.join(", ")}]`);if(!(g.get("subfeatures")??[]).some(x=>x.get("type")==="CDS"))throw new Error(`transcript "${n}" has no CDS subfeatures`);let b=await Xo({session:e,assemblyName:r,feature:g});if(!b)throw new Error(`could not translate a protein sequence for "${n}"`);return{url:t,feature:g.toJSON(),userProvidedTranscriptSequence:b}}Pe();function _i(e){e.addToExtensionPoint("LaunchView-ProteinView",async t=>{let{session:n,url:o,uniprotId:r,pdbId:i,transcriptId:s,userProvidedTranscriptSequence:l,feature:a,connectedViewId:c,connectedView:u,alignmentAlgorithm:m,displayName:d,height:g,showControls:h,showHighlight:b,zoomToBaseLevel:x,sideBySide:w,initialSelection:y}=t,f=Lo({url:o,uniprotId:r,pdbId:i}),A;if(!o&&f)try{A=await mu({session:n,structureUrl:f,transcriptId:s,connectedView:u})}catch(I){return console.error(I),n.notify(`Could not launch protein view: ${I}`,"error"),t}let P=o??A?.url;if(!P){let I="No url, uniprotId or pdbId provided when launching protein view";return console.error(I),n.notify(`Could not launch protein view: ${I}`,"error"),t}let v=!c&&!!u,D=c??(u?n.addView("LinearGenomeView",{type:"LinearGenomeView",init:u}).id:void 0),E=n.addView("ProteinView",qo({alignmentAlgorithm:m===void 0?void 0:ql(m),displayName:d,height:g,showControls:h,showHighlight:b,zoomToBaseLevel:x,structures:[{url:P,userProvidedTranscriptSequence:A?.userProvidedTranscriptSequence??l,feature:A?.feature??a,connectedViewId:D,initialSelection:y}]}));return v&&Eo(n,E.id,w),t})}var Qm=p(S()),$m=p(Wi());var Xu=p(Wi()),ec=p(fu()),fe=p(Dn());nt();var bu=p(ot(),1),Ki=(0,se.createSvgIcon)((0,bu.jsx)("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"}),"Visibility");var Vn=p(Sn());Ji();var Yi=p(Dn());function wu(e,t){let n=e.obj?.data;if(!n)return;let{B_iso_or_equiv:o}=n.atomicConformation,{offsets:r,count:i}=n.atomicHierarchy.residueAtomSegments,s=t===void 0?i:Math.min(i,t),l=[];for(let a=0;a<s;a++)l.push(o.value(r[a]));return l}function xu(e){return!!e&&e.length>1&&e.every(t=>t>=0&&t<=100)&&new Set(e).size>1}async function vu({structure:e,plugin:t}){let{model:n,structure:o}=e.data?await Jo({data:e.data,plugin:t}):e.url?await Yo({url:e.url,plugin:t}):{model:void 0,structure:void 0},r=n?vi(n):void 0,i=r?.[0],s=n?wu(n,i?.seq.length):void 0;return{entities:r,confidence:i&&s?{entityId:i.entityId,values:s}:void 0,molstarStructure:o}}function Tu(e){let t=new Set;function n(o,r){t.add(o),vu({structure:o,plugin:r}).then(i=>{let s=(0,Yi.isAlive)(o)?e.molstarPluginContext:void 0;s===r&&(o.setStructureData(i),o.setLoadedToMolstar(!0)),t.delete(o),s&&s!==r&&!o.loadedToMolstar&&n(o,s)}).catch(i=>{t.delete(o),(0,Yi.isAlive)(e)&&(e.setError(i),console.error(i))})}return function(){let{structures:r,molstarPluginContext:i}=e;if(i)for(let s of r)!s.loadedToMolstar&&!t.has(s)&&n(s,i)}}var so=p(ie()),ne=p(Dn()),io=p(Sn());Fn();async function Au({structure:e,plugin:t,channel:n,labelSeqIds:o,entityId:r}){let{lociHighlights:i,lociSelects:s}=t.managers.interactivity;if(n==="highlight"?i.clearHighlights():s.deselectAll(),o?.length){let{StructureSelection:l,Script:a}=await He(),c=a.getStructureSelection(m=>m.struct.generator.atomGroups({...r?{"chain-test":m.core.rel.eq([m.struct.atomProperty.macromolecular.label_entity_id(),r])}:{},"residue-test":m.core.set.has([m.core.type.set([...new Set(o)]),m.struct.atomProperty.macromolecular.label_seq_id()]),"group-by":m.struct.atomProperty.macromolecular.residueKey()}),e),u=l.toLociWithSourceUnits(c);n==="highlight"?i.highlight({loci:u}):s.select({loci:u})}}var Pu=["A","R","N","D","C","Q","E","G","H","I","L","K","M","F","P","S","T","W","Y","V","B","Z","X","*"],xf=[[4,-1,-2,-2,0,-1,-1,0,-2,-1,-1,-1,-1,-2,-1,1,0,-3,-2,0,-2,-1,0,-4],[-1,5,0,-2,-3,1,0,-2,0,-3,-2,2,-1,-3,-2,-1,-1,-3,-2,-3,-1,0,-1,-4],[-2,0,6,1,-3,0,0,0,1,-3,-3,0,-2,-3,-2,1,0,-4,-2,-3,3,0,-1,-4],[-2,-2,1,6,-3,0,2,-1,-1,-3,-4,-1,-3,-3,-1,0,-1,-4,-3,-3,4,1,-1,-4],[0,-3,-3,-3,9,-3,-4,-3,-3,-1,-1,-3,-1,-2,-3,-1,-1,-2,-2,-1,-3,-3,-2,-4],[-1,1,0,0,-3,5,2,-2,0,-3,-2,1,0,-3,-1,0,-1,-2,-1,-2,0,3,-1,-4],[-1,0,0,2,-4,2,5,-2,0,-3,-3,1,-2,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-2,0,-1,-3,-2,-2,6,-2,-4,-4,-2,-3,-3,-2,0,-2,-2,-3,-3,-1,-2,-1,-4],[-2,0,1,-1,-3,0,0,-2,8,-3,-3,-1,-2,-1,-2,-1,-2,-2,2,-3,0,0,-1,-4],[-1,-3,-3,-3,-1,-3,-3,-4,-3,4,2,-3,1,0,-3,-2,-1,-3,-1,3,-3,-3,-1,-4],[-1,-2,-3,-4,-1,-2,-3,-4,-3,2,4,-2,2,0,-3,-2,-1,-2,-1,1,-4,-3,-1,-4],[-1,2,0,-1,-3,1,1,-2,-1,-3,-2,5,-1,-3,-1,0,-1,-3,-2,-2,0,1,-1,-4],[-1,-1,-2,-3,-1,0,-2,-3,-2,1,2,-1,5,0,-2,-1,-1,-1,-1,1,-3,-1,-1,-4],[-2,-3,-3,-3,-2,-3,-3,-3,-1,0,0,-3,0,6,-4,-2,-2,1,3,-1,-3,-3,-1,-4],[-1,-2,-2,-1,-3,-1,-1,-2,-2,-3,-3,-1,-2,-4,7,-1,-1,-4,-3,-2,-2,-1,-2,-4],[1,-1,1,0,-1,0,0,0,-1,-2,-2,0,-1,-2,-1,4,1,-3,-2,-2,0,0,0,-4],[0,-1,0,-1,-1,-1,-1,-2,-2,-1,-1,-1,-1,-2,-1,1,5,-2,-2,0,-1,-1,0,-4],[-3,-3,-4,-4,-2,-2,-3,-2,-2,-3,-2,-3,-1,1,-4,-3,-2,11,2,-3,-4,-3,-2,-4],[-2,-2,-2,-3,-2,-1,-2,-3,2,-1,-1,-2,-1,3,-3,-2,-2,2,7,-1,-3,-2,-1,-4],[0,-3,-3,-3,-1,-2,-2,-3,-3,3,1,-2,1,-1,-2,-2,0,-3,-1,4,-3,-2,-1,-4],[-2,-1,3,4,-3,0,1,-1,0,-3,-4,0,-3,-3,-2,0,-1,-4,-3,-3,4,1,-1,-4],[-1,0,0,1,-3,3,4,-2,0,-3,-3,1,-1,-3,-1,0,-1,-3,-2,-2,1,4,-1,-4],[0,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-2,0,0,-2,-1,-1,-1,-1,-1,-4],[-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,1]],Cu=-4,Rt=Pu.length,$i=new Int8Array(128).fill(-1);for(let e=0;e<Rt;e++){let t=Pu[e];$i[t.charCodeAt(0)]=e,$i[t.toLowerCase().charCodeAt(0)]=e}var Zi=new Int8Array(Rt*Rt);for(let e=0;e<Rt;e++)for(let t=0;t<Rt;t++)Zi[e*Rt+t]=xf[e][t];var lr=e=>{let t=e.charCodeAt(0);return t<128?$i[t]:-1};function vf(e,t){let n=lr(e),o=lr(t);return n<0||o<0?Cu:Zi[n*Rt+o]}var ku=-10,Mu=-.5,Iu=4e7;function Xi(e,t){return(e+1)*(t+1)>Iu}function Tf(e,t){if(Xi(e,t))throw new Error(`Sequences too long to align (${e} x ${t} residues exceeds the ${Iu} cell limit)`)}var mn=0,oo=1,ar=2,Lu=3,Eu=0,Fu=2,qu=4,Qi=(e,t,n)=>e[t]>>n&3;function Du(e,t,n,o,r){let i=e.length,s=t.length;Tf(i,s);let l=s+1,a=new Uint8Array((i+1)*l),c=new Float32Array(l),u=new Float32Array(l).fill(-1/0),m=new Float32Array(l).fill(-1/0),d=new Float32Array(l),g=new Float32Array(l),h=new Float32Array(l);if(!r){c.fill(-1/0),c[0]=0;for(let E=1;E<=s;E++)m[E]=n+(E-1)*o}let b=r?0:-1/0,x=0,w=0,y=mn,f=new Int8Array(s);for(let E=0;E<s;E++)f[E]=lr(t[E]);for(let E=1;E<=i;E++){d[0]=r?0:-1/0,g[0]=r?-1/0:n+(E-1)*o,h[0]=-1/0;let I=E*l,L=lr(e[E-1]),oe=L*Rt;for(let C=1;C<=s;C++){let O=f[C-1],pe=L<0||O<0?Cu:Zi[oe+O],Re=c[C-1],ke=u[C-1],Me=m[C-1],Ee=Math.max(Re,ke,Me),Oe=Ee===Re?mn:Ee===ke?oo:ar,Ie=Ee+pe,he=r&&Ie<=0;d[C]=he?0:Ie;let Wt=c[C]+n,It=u[C]+o;g[C]=Math.max(Wt,It);let Kt=d[C-1]+n,Xe=h[C-1]+o;if(h[C]=Math.max(Kt,Xe),a[I+C]=(he?Lu:Oe)<<Eu|(Wt>=It?mn:oo)<<Fu|(Kt>=Xe?mn:ar)<<qu,r){let Lt=Math.max(d[C],g[C],h[C]);Lt>b&&(b=Lt,x=E,w=C,y=Lt===d[C]?mn:Lt===g[C]?oo:ar)}}[c,d]=[d,c],[u,g]=[g,u],[m,h]=[h,m]}if(r)return{trace:a,width:l,score:b,startI:x,startJ:w,startMatrix:y};let A=c[s],P=u[s],v=m[s],D=Math.max(A,P,v);return{trace:a,width:l,score:D,startI:i,startJ:s,startMatrix:D===A?mn:D===P?oo:ar}}function Nu(e,t,n){let{trace:o,width:r,startI:i,startJ:s,score:l}=n,a=[],c=[];for(let g=e.length;g>i;g--)a.push(e[g-1]),c.push("-");for(let g=t.length;g>s;g--)a.push("-"),c.push(t[g-1]);let u=i,m=s,d=n.startMatrix;for(;u>0&&m>0;){let g=u*r+m;if(d===mn){let h=Qi(o,g,Eu);if(h===Lu)break;a.push(e[u-1]),c.push(t[m-1]),d=h,u--,m--}else d===oo?(a.push(e[u-1]),c.push("-"),d=Qi(o,g,Fu),u--):(a.push("-"),c.push(t[m-1]),d=Qi(o,g,qu),m--)}for(;u>0;)a.push(e[u-1]),c.push("-"),u--;for(;m>0;)a.push("-"),c.push(t[m-1]),m--;return{alignedSeq1:a.reverse().join(""),alignedSeq2:c.reverse().join(""),score:l}}function Af(e,t,n=ku,o=Mu){return Nu(e,t,Du(e,t,n,o,!1))}function Pf(e,t,n=ku,o=Mu){return Nu(e,t,Du(e,t,n,o,!0))}function Cf(e,t){let n=[];for(let o=0;o<e.length;o++){let r=e[o],i=t[o];r!=="-"&&i!=="-"&&r.toUpperCase()===i.toUpperCase()?n.push("|"):r!=="-"&&i!=="-"&&vf(r,i)>0?n.push(":"):n.push(" ")}return n.join("")}function Vu(e,t,n){let{alignedSeq1:o,alignedSeq2:r}=n==="smith_waterman"?Pf(e,t):Af(e,t);return{consensus:Cf(o,r),alns:[{id:"a",seq:o},{id:"b",seq:r}]}}lt();function Gu(e,t){return t===void 0||e===t}function kf(e){let t=Dt(e),n=$t(e),o=0;for(let r=0;r<t.length;r++){let i=t[r],s=n[r];i!=="-"&&s!=="-"&&i?.toUpperCase()===s?.toUpperCase()&&o++}return o}function Hu(e,t,n){let o=de(e);if(!o||t.length===0)return;let r=t.map(de),i=r.findIndex(a=>a.length>0&&a===o);if(i!==-1)return{index:i,alignment:{consensus:"|".repeat(o.length),alns:[{id:"seq1",seq:o},{id:"seq2",seq:r[i]}]},matches:o.length};let s=new Map,l;for(let a=0;a<r.length;a++){let c=r[a];if(c.length>0&&!Xi(o.length,c.length)){let u=s.get(c);if(!u){let m=Vu(o,c,n);u={alignment:m,matches:kf(m)},s.set(c,u)}(!l||u.matches>l.matches)&&(l={index:a,...u})}}return l}st();lt();var Ou=e=>e;var ts=e=>e;function zu(e){let{structureSeqToTranscriptSeqPosition:t,transcriptSeqToStructureSeqPosition:n}=Ys(e),o=$s(e),r=Zs(e),i=vr(o),s=vr(r);return{structureToTranscript:l=>t[l],transcriptToStructure:l=>n[l],structureToAlignment:l=>o[l],alignmentToStructure:l=>i[l],transcriptToAlignment:l=>r[l],alignmentToTranscript:l=>s[l],maps:{structureSeqToTranscriptSeqPosition:t,transcriptSeqToStructureSeqPosition:n,structurePositionToAlignmentMap:o,transcriptPositionToAlignmentMap:r,alignmentToStructurePosition:i,alignmentToTranscriptPosition:s}}}var ju=Object.fromEntries([{name:"alanine",abbreviation:"Ala",singleLetterCode:"A"},{name:"arginine",abbreviation:"Arg",singleLetterCode:"R"},{name:"asparagine",abbreviation:"Asn",singleLetterCode:"N"},{name:"aspartic acid",abbreviation:"Asp",singleLetterCode:"D"},{name:"cysteine",abbreviation:"Cys",singleLetterCode:"C"},{name:"glutamic acid",abbreviation:"Glu",singleLetterCode:"E"},{name:"glutamine",abbreviation:"Gln",singleLetterCode:"Q"},{name:"glycine",abbreviation:"Gly",singleLetterCode:"G"},{name:"histidine",abbreviation:"His",singleLetterCode:"H"},{name:"isoleucine",abbreviation:"Ile",singleLetterCode:"I"},{name:"leucine",abbreviation:"Leu",singleLetterCode:"L"},{name:"lysine",abbreviation:"Lys",singleLetterCode:"K"},{name:"methionine",abbreviation:"Met",singleLetterCode:"M"},{name:"phenylalanine",abbreviation:"Phe",singleLetterCode:"F"},{name:"proline",abbreviation:"Pro",singleLetterCode:"P"},{name:"serine",abbreviation:"Ser",singleLetterCode:"S"},{name:"threonine",abbreviation:"Thr",singleLetterCode:"T"},{name:"tryptophan",abbreviation:"Trp",singleLetterCode:"W"},{name:"tyrosine",abbreviation:"Tyr",singleLetterCode:"Y"},{name:"valine",abbreviation:"Val",singleLetterCode:"V"}].map(e=>[e.abbreviation.toUpperCase(),e]));os();is();Fn();function Ef(e,t){return{labelSeqId:e.StructureProperties.residue.label_seq_id(t),code:e.StructureProperties.atom.label_comp_id(t),chain:e.StructureProperties.chain.auth_asym_id(t),entityId:e.StructureProperties.entity.id(t)}}async function ss({plugin:e,kind:t,onUpdate:n}){let o=await He(),r=e.behaviors.interaction[t].subscribe(i=>{if(o.StructureElement.Loci.is(i.current.loci)){let s=o.StructureElement.Loci.getFirstLocation(i.current.loci);n(s?Ef(o,s):void 0)}else n(void 0)});return()=>{r.unsubscribe()}}Pe();lt();var Vf=ne.types.model({url:ne.types.maybe(ne.types.string),data:ne.types.maybe(ne.types.string),connectedViewId:ne.types.maybe(ne.types.string),pairwiseAlignment:ne.types.frozen(),feature:ne.types.frozen(),userProvidedTranscriptSequence:ne.types.optional(ne.types.string,""),initialSelection:ne.types.frozen()}).preProcessSnapshot(({uniprotId:e,pdbId:t,...n})=>({...n,url:Lo({...n,uniprotId:e,pdbId:t})})).volatile(()=>({clickedStructureRange:void 0,hoverPosition:void 0,entities:void 0,mappedEntityIndex:0,structureConfidence:void 0,isMouseInAlignment:!1,loadedToMolstar:!1,molstarStructure:void 0,alignmentHoverRange:void 0,selectedFeatureId:void 0,hiddenFeatureTypes:new Set,expandedFeatureTypes:new Set})).actions(e=>({setStructureData(t){e.entities=t.entities,e.structureConfidence=t.confidence,e.molstarStructure=t.molstarStructure},hideFeatureType(t){e.hiddenFeatureTypes=new Set([...e.hiddenFeatureTypes,t])},showFeatureType(t){let n=new Set(e.hiddenFeatureTypes);n.delete(t),e.hiddenFeatureTypes=n},showAllFeatureTypes(){e.hiddenFeatureTypes=new Set},toggleFeatureTypeExpanded(t){let n=new Set(e.expandedFeatureTypes);n.has(t)?n.delete(t):n.add(t),e.expandedFeatureTypes=n},setLoadedToMolstar(t){e.loadedToMolstar=t,t||(e.molstarStructure=void 0)}})).views(e=>({get connectedView(){let{views:t}=(0,so.getSession)(e);return t.find(n=>n.id===e.connectedViewId)}})).actions(e=>({setClickedStructureRange(t){e.clickedStructureRange=t},setAlignmentHoverRange(t){e.alignmentHoverRange=t},setSelectedFeatureId(t){e.selectedFeatureId=t},setHoveredPosition(t){e.hoverPosition=t?{...t,source:"structure"}:void 0},setGenomeHoveredPosition(t){e.hoverPosition=t===void 0?void 0:{structureSeqPos:t,source:"genome"}},setAlignment(t){e.pairwiseAlignment=t},setMappedEntityIndex(t){e.mappedEntityIndex=t},setIsMouseInAlignment(t){e.isMouseInAlignment=t}})).views(e=>({get structureSequences(){return e.entities?.map(t=>t.seq)},get mappedEntity(){return e.entities?.[e.mappedEntityIndex]},get mappedStructureSeq(){return this.mappedEntity?.seq},get mappedEntityId(){return this.mappedEntity?.entityId},get uniprotId(){let{url:t}=e;if(t)return An(t)},get coordinateMapper(){return e.pairwiseAlignment?zu(e.pairwiseAlignment):void 0},get structureSeqToTranscriptSeqPosition(){return this.coordinateMapper?.maps.structureSeqToTranscriptSeqPosition},get transcriptSeqToStructureSeqPosition(){return this.coordinateMapper?.maps.transcriptSeqToStructureSeqPosition},get structurePositionToAlignmentMap(){return this.coordinateMapper?.maps.structurePositionToAlignmentMap},get transcriptPositionToAlignmentMap(){return this.coordinateMapper?.maps.transcriptPositionToAlignmentMap},get confidenceCells(){let t=e.structureConfidence;return t&&t.entityId===this.mappedEntityId&&xu(t.values)?rs(t.values,this.structurePositionToAlignmentMap):[]},get hydrophobicityCells(){let t=this.mappedStructureSeq;return t?rs(Ku(de(t)),this.structurePositionToAlignmentMap):[]},get pairwiseAlignmentToTranscriptPosition(){return this.coordinateMapper?.maps.alignmentToTranscriptPosition},get pairwiseAlignmentToStructurePosition(){return this.coordinateMapper?.maps.alignmentToStructurePosition},get hoverString(){let t=e.hoverPosition;if(t===void 0)return"";let n=this.hoverStructureLetter,o=this.hoverGenomeLetter,r=[];return t.structureSeqPos!==void 0&&r.push(`${t.structureSeqPos+1}`),n&&r.push(`Structure: ${n}`),o&&n&&o!==n&&r.push(`Genome: ${o}`),t.chain&&r.push(`Chain: ${t.chain}`),r.join(", ")},get genomeToTranscriptSeqMapping(){return e.feature?wn(new so.SimpleFeature(e.feature)):void 0},get structureSeqHoverPos(){return e.hoverPosition?.structureSeqPos},get alignmentHoverPos(){let t=this.structureSeqHoverPos;return t===void 0?void 0:this.coordinateMapper?.structureToAlignment(Ou(t))},get hoverStructureRange(){let{alignmentHoverRange:t}=e,n=this.pairwiseAlignmentToStructurePosition;if(!t||!n)return;let o=n[t.start],r=n[t.end];return o===void 0||r===void 0?void 0:{start:o,end:r+1}},get hoverHighlightRange(){let t=this.structureSeqHoverPos;return this.hoverStructureRange??(t===void 0?void 0:{start:t,end:t+1})},get labelSeqIdIndex(){return yp(this.mappedEntity)},get selectLabelSeqIds(){let t=this.mappedEntity,n=e.clickedStructureRange;if(n)return Ti(t,n);let o=this.structureSeqToTranscriptSeqPosition;return this.showHighlight&&o?bp(t,Object.keys(o).map(Number)):[]},get hoverLabelSeqIds(){return Ti(this.mappedEntity,this.hoverHighlightRange)},get clickAlignmentRange(){let t=e.clickedStructureRange,n=this.structurePositionToAlignmentMap;if(!t||!n)return;let o=n[t.start],r=n[t.end-1];return o===void 0||r===void 0?void 0:{start:o,end:r}},structureRangeToGenomeHighlight(t){let n=e.connectedView?.assemblyNames[0],o=this.genomeToTranscriptSeqMapping;if(!t||!n||!o)return[];let r={genomeToTranscriptSeqMapping:o,pairwiseAlignment:e.pairwiseAlignment,structureSeqToTranscriptSeqPosition:this.structureSeqToTranscriptSeqPosition},i=t.end>t.start+1?ns({model:r,structureSeqPos:t.start,structureSeqEndPos:t.end}):pr({model:r,structureSeqPos:t.start});if(!i)return[];let[s,l]=i;return[{assemblyName:n,refName:o.refName,start:s,end:l}]},get hoverGenomeHighlights(){return e.hoverPosition?.source==="genome"?[]:this.structureRangeToGenomeHighlight(this.hoverHighlightRange)},get clickGenomeHighlights(){return this.structureRangeToGenomeHighlight(e.clickedStructureRange)},get hoverStructureLetter(){let t=e.hoverPosition?.code;if(t)return ju[t]?.singleLetterCode;let n=this.structureSeqHoverPos,o=this.mappedStructureSeq;if(n!==void 0&&o)return o[n]},get hoverGenomeLetter(){let t=this.structureSeqHoverPos;if(t===void 0)return;let n=this.structureSeqToTranscriptSeqPosition?.[t];if(n!==void 0)return e.userProvidedTranscriptSequence[n]},get alignmentMatchSet(){let t=e.pairwiseAlignment?.consensus;if(!t)return;let n=new Set;for(let o=0;o<t.length;o++)(t[o]==="|"||t[o]===":")&&n.add(o);return n},get alignmentPending(){return!e.pairwiseAlignment&&!!e.userProvidedTranscriptSequence&&!!this.structureSequences?.length},get exactMatch(){let t=de(e.userProvidedTranscriptSequence),n=this.mappedStructureSeq?de(this.mappedStructureSeq):void 0;return t===n},get parentView(){return(0,ne.getParent)(e,2)},get zoomToBaseLevel(){return this.parentView.zoomToBaseLevel},get autoScrollAlignment(){return this.parentView.autoScrollAlignment},get showHighlight(){return this.parentView.showHighlight},get showProteinTracks(){return this.parentView.showProteinTracks},get trackHeight(){return this.parentView.compactTracks?8:12},get trackGap(){return this.parentView.compactTracks?1:2},get alignmentAlgorithm(){return this.parentView.alignmentAlgorithm},get molstarPluginContext(){return this.parentView.molstarPluginContext}})).actions(e=>({setError(t){e.parentView.setError(t)},hoverAlignmentPosition(t){if(!e.alignmentHoverRange){let n=e.coordinateMapper?.alignmentToStructure(ts(t));e.setHoveredPosition(n!==void 0?{structureSeqPos:n}:void 0)}},clickAlignmentPosition(t){let n=e.coordinateMapper?.alignmentToStructure(ts(t));e.setSelectedFeatureId(void 0),n!==void 0?ro({model:e,structureSeqPos:n}).catch(o=>{console.error(o),e.parentView.setError(o)}):e.setClickedStructureRange(void 0)}})).actions(e=>({afterAttach(){e.initialSelection&&e.setClickedStructureRange(e.initialSelection);let t=(r,i)=>{let s;(0,ne.addDisposer)(e,()=>{s?.()}),(0,ne.addDisposer)(e,(0,io.autorun)(async()=>{let{molstarPluginContext:l}=e;if(s?.(),s=void 0,l){let a=await ss({plugin:l,kind:r,onUpdate:i});(0,ne.isAlive)(e)&&e.molstarPluginContext===l?s=a:a()}}))};(0,ne.addDisposer)(e,(0,io.autorun)(async()=>{try{let{userProvidedTranscriptSequence:r,structureSequences:i,alignmentAlgorithm:s}=e;if(e.pairwiseAlignment||!r||!i?.length)return;let l=Hu(r,i,s);if(!l)return;e.setMappedEntityIndex(l.index),e.setAlignment(l.alignment),l.matches<go(l.alignment)&&e.parentView.setShowAlignment(!0)}catch(r){console.error(r),e.parentView.setError(r)}})),(0,ne.addDisposer)(e,(0,io.autorun)(()=>{let{hovered:r}=(0,so.getSession)(e),{transcriptSeqToStructureSeqPosition:i,genomeToTranscriptSeqMapping:s,connectedView:l}=e,a=l?.initialized?mo(r,s):void 0;a!==void 0?e.setGenomeHoveredPosition(i?.[a]):e.hoverPosition?.source==="genome"&&e.setGenomeHoveredPosition(void 0)}));let n=r=>{if(!r||!Gu(r.entityId,e.coordinateMapper?e.mappedEntityId:void 0))return;let i=e.labelSeqIdIndex.get(r.labelSeqId);return i===void 0?void 0:{...r,structureSeqPos:i}};t("click",r=>{let i=n(r);i&&(e.setHoveredPosition(i),e.setSelectedFeatureId(void 0),ro({model:e,structureSeqPos:i.structureSeqPos}).catch(s=>{console.error(s),e.parentView.setError(s)}))}),t("hover",r=>{e.setHoveredPosition(n(r))});let o=(r,i)=>{(0,ne.addDisposer)(e,(0,io.autorun)(async()=>{let{molstarStructure:s,molstarPluginContext:l}=e,a=i();s&&l&&await Au({structure:s,plugin:l,channel:r,entityId:e.mappedEntityId,labelSeqIds:a})}))};o("select",()=>e.selectLabelSeqIds),o("highlight",()=>e.hoverLabelSeqIds)}})),as=Vf;var Qu=p(Dn());Fn();var Gf="SuperpositionTransform";async function ur(e){let{QueryContext:t,StructureElement:n,StructureSelection:o,StructureSelectionQueries:r,PluginCommands:i,PluginStateObject:s,tmAlign:l}=await He(),a=e.managers.structure.hierarchy.current.structures;if(a.length<2)return;let{query:c}=r.trace,m=a.map(h=>{let b=h.cell.obj?.data;if(!b)return;let x=e.helpers.substructureParent.get(b);if(!x)return;let w=e.state.data.selectQ(f=>f.byValue(x).rootOfType(s.Molecule.Structure))[0]?.obj?.data;if(!w)return;let y=o.toLociWithSourceUnits(c(new t(b)));return n.Loci.remap(y,w)}).filter(h=>h!==void 0);if(m.length<2)return;let g=e.managers.structure.hierarchy.findStructure(m[0]?.structure)?.transform?.cell.obj?.data.coordinateSystem;for(let h=1;h<m.length;h++){let b=l(m[0],m[h]),{bTransform:x,tmScoreA:w,tmScoreB:y,rmsd:f,alignedLength:A}=b;await Hf(e,a[h].cell,x,g),e.log.info(`TM-align: TM-score=${w.toFixed(4)}/${y.toFixed(4)}, RMSD=${f.toFixed(2)} \xC5, aligned ${A} residues.`)}await new Promise(h=>requestAnimationFrame(h)),await i.Camera.Reset(e)}async function Hf(e,t,n,o){let{Mat4:r,StateObjectRef:i,StateTransforms:s}=await He(),l=i.resolveAndCheck(e.state.data,t);if(!l)return;let a=e.state.data.selectQ(d=>d.byRef(l.transform.ref).subtree().withTransformer(s.Model.TransformStructureConformation))[0],u={transform:{name:"matrix",params:{data:o&&!r.isIdentity(o.matrix)?r.mul(r(),o.matrix,n):n,transpose:!1}}},m=a?e.state.data.build().to(a).update(u):e.state.data.build().to(t).insert(s.Model.TransformStructureConformation,u,{tags:Gf});await e.runTask(e.state.data.updateTree(m))}function $u(e){let t=!1,n=0,o;function r(){let{molstarPluginContext:i,structures:s}=e,l=s.filter(a=>a.loadedToMolstar).length;i!==o&&(n=0),i&&!t&&l>=2&&l!==n&&(t=!0,ur(i).catch(a=>{(0,Qu.isAlive)(e)&&(e.setError(a),console.error(a))}).finally(()=>{t=!1,n=l,o=i,r()}))}return r}var Zu="proteinView-settings",ls=["showAlignment","showProteinTracks","showHighlight","zoomToBaseLevel","autoScrollAlignment","compactTracks"],Bf={showAlignment:!0,showProteinTracks:!0,showHighlight:!1,zoomToBaseLevel:!0,autoScrollAlignment:!1,compactTracks:!0};function Uf(){return fe.types.compose("ProteinView",Xu.BaseViewModel,fe.types.model({id:ec.ElementId,type:fe.types.literal("ProteinView"),structures:fe.types.array(as),showControls:!1,height:fe.types.optional(fe.types.number,650),showHighlight:!1,zoomToBaseLevel:!0,autoScrollAlignment:!1,colorScheme:fe.types.optional(fe.types.enumeration("ColorScheme",yu),"default"),showAlignment:!0,showProteinTracks:!0,compactTracks:!0,alignmentAlgorithm:fe.types.optional(fe.types.enumeration("AlignmentAlgorithm",Wr),Wn),connectedMsaViewId:fe.types.maybe(fe.types.string)})).volatile(()=>({error:void 0,molstarPluginContext:void 0,showManualAlignmentDialog:!1,showAddStructureDialog:!1})).actions(e=>({setHeight(t){return e.height=t,t},setShowAlignment(t){e.showAlignment=t},setShowControls(t){e.showControls=t},setError(t){e.error=t},setShowHighlight(t){e.showHighlight=t},setShowProteinTracks(t){e.showProteinTracks=t},setCompactTracks(t){e.compactTracks=t},setZoomToBaseLevel(t){e.zoomToBaseLevel=t},setAutoScrollAlignment(t){e.autoScrollAlignment=t},setAlignmentAlgorithm(t){e.alignmentAlgorithm=t},setColorScheme(t){e.colorScheme=t},setMolstarPluginContext(t){if(t!==e.molstarPluginContext)for(let n of e.structures)n.setLoadedToMolstar(!1);e.molstarPluginContext=t},setShowManualAlignmentDialog(t){e.showManualAlignmentDialog=t},setShowAddStructureDialog(t){e.showAddStructureDialog=t},setConnectedMsaViewId(t){e.connectedMsaViewId=t},addStructure(t){e.structures.push(as.create(t))}})).actions(e=>({afterAttach(){try{let t=localStorage.getItem(Zu);if(t){let n=JSON.parse(t);for(let o of ls)n[o]!==void 0&&e[o]===Bf[o]&&(e[o]=n[o])}}catch(t){console.error("Failed to restore protein view settings",t)}(0,fe.addDisposer)(e,(0,Vn.reaction)(()=>ls.map(t=>e[t]),()=>{try{let t={};for(let n of ls)t[n]=e[n];localStorage.setItem(Zu,JSON.stringify(t))}catch(t){console.error("Failed to save protein view settings",t)}})),(0,fe.addDisposer)(e,(0,Vn.autorun)(()=>{let{molstarPluginContext:t,colorScheme:n}=e,o=e.structures.filter(r=>r.structureSequences!==void 0).length;t&&o>0&&Su({plugin:t,colorScheme:n}).catch(r=>{console.error(r),e.setError(r)})})),(0,fe.addDisposer)(e,(0,Vn.autorun)(Tu(e))),(0,fe.addDisposer)(e,(0,Vn.autorun)($u(e)))}})).views(e=>({get primaryStructure(){return e.structures[0]},menuItems(){return[{label:"Pairwise alignment",icon:Ki,type:"checkbox",checked:e.showAlignment,onClick:()=>{e.setShowAlignment(!e.showAlignment)}},{label:"Protein feature tracks",icon:Ki,type:"checkbox",checked:e.showProteinTracks,onClick:()=>{e.setShowProteinTracks(!e.showProteinTracks)}},{label:"Color scheme...",subMenu:Nn.map(t=>({label:t.label,type:"radio",checked:e.colorScheme===t.value,onClick:()=>{e.setColorScheme(t.value)}}))},{label:"Add structure...",onClick:()=>{e.setShowAddStructureDialog(!0)}},{label:"Advanced...",icon:Pn,subMenu:[{label:"Pairwise alignment as green highlight",type:"checkbox",checked:e.showHighlight,onClick:()=>{e.setShowHighlight(!e.showHighlight)}},{label:"Show all protein feature tracks",onClick:()=>{for(let t of e.structures)t.showAllFeatureTypes()}},{label:"Import manual alignment...",onClick:()=>{e.setShowManualAlignmentDialog(!0)}},{label:"Re-align structures (TM-align)",onClick:()=>{e.molstarPluginContext&&ur(e.molstarPluginContext).catch(t=>{console.error(t),e.setError(t)})}},{label:"Zoom to base level on click",type:"checkbox",checked:e.zoomToBaseLevel,onClick:()=>{e.setZoomToBaseLevel(!e.zoomToBaseLevel)}},{label:"Auto-scroll alignment to hovered position",type:"checkbox",checked:e.autoScrollAlignment,onClick:()=>{e.setAutoScrollAlignment(!e.autoScrollAlignment)}}]}]}}))}var tc=Uf;var Sh=(0,Qm.lazy)(()=>Promise.resolve().then(()=>(Ym(),Jm)));function Ts(e){e.addViewType(()=>new $m.ViewType({name:"ProteinView",displayName:"Protein view",stateModel:tc(),ReactComponent:Sh}))}var rd=p(xo());var Zm=p(en());var wh=(0,Zm.ConfigurationSchema)("UniProtVariationAdapter",{location:{type:"fileLocation",defaultValue:{uri:"/path/to/my.bed.gz",locationType:"UriLocation"}},scoreField:{type:"string",defaultValue:""}},{explicitlyTyped:!0}),Xm=wh;function As(e){e.addAdapterType(()=>new rd.default({name:"UniProtVariationAdapter",displayName:"UniProtVariation adapter",configSchema:Xm,getAdapterClass:()=>Promise.resolve().then(()=>(od(),nd)).then(t=>t.default)}))}var id="0.8.4";var br=class extends sd.default{name="ProteinViewer";version=id;install(t){Ts(t),zi(t),_i(t),Lr(t),Er(t),Fr(t),As(t)}configure(t){}};return gd(xh);})();
29
29
  /*! Bundled license information:
30
30
 
31
31
  use-sync-external-store/cjs/use-sync-external-store-shim.production.js: