chromosomix 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,28 @@
1
+ async function Te(t){return t.bytes?t.bytes():new Uint8Array(await t.arrayBuffer())}const nc=50;async function Gs(t,e){const n=t.headers.get("content-length"),A=n?parseInt(n,10):void 0,s=t.body;if(!s||A===void 0){const c=await Te(t);return e(c.byteLength,A??c.byteLength),c}const r=s.getReader();let o=new Uint8Array(A),i=0,a=0;e(0,A);for(let c=await r.read();!c.done;c=await r.read()){if(i+c.value.byteLength>o.length){const g=new Uint8Array(Math.max(i+c.value.byteLength,o.length*2));g.set(o.subarray(0,i)),o=g}o.set(c.value,i),i+=c.value.byteLength;const l=Date.now();l-a>=nc&&(a=l,e(i,A))}return e(i,A),i===o.length?o:o.subarray(0,i)}class Ac{blob;constructor(e){this.blob=e}async read(e,n=0){return e===0?new Uint8Array(0):Te(this.blob.slice(n,n+e))}async readFile(e){const n=typeof e=="string"?e:e?.encoding;if(n==="utf8")return this.blob.text();if(n)throw new Error(`unsupported encoding: ${n}`);return Te(this.blob)}stat(){return Promise.resolve({size:this.blob.size})}close(){return Promise.resolve()}}function sc(t){return(typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"?t.message:`${t}`).replace(/\.$/,"")}class No{url;_stat;fetchImplementation;baseHeaders;baseOverrides;constructor(e,n={}){this.url=e,this.baseHeaders=n.headers??{},this.baseOverrides=n.overrides??{},this.fetchImplementation=n.fetch??globalThis.fetch.bind(globalThis)}buildRequest(e,n){return{...this.baseOverrides,...e.overrides,headers:{...this.baseHeaders,...e.headers,...n},method:"GET",redirect:"follow",mode:"cors",signal:e.signal}}async fetch(e,n){const A=r=>new Error(`${sc(r)} fetching ${e}`,{cause:r});let s;try{s=await this.fetchImplementation(e,n)}catch(r){if(`${r}`.includes("Failed to fetch")){console.warn(`generic-filehandle: refetching ${e} to attempt to work around chrome CORS header caching bug`);try{s=await this.fetchImplementation(e,{...n,cache:"reload"})}catch(o){throw A(o)}}else throw A(r)}return s}async read(e,n,A={}){if(e===0)return new Uint8Array(0);if(Number.isNaN(e)||Number.isNaN(n))throw new TypeError(`read() called with NaN length or position (length=${e}, position=${n}). The index file may be corrupt.`);const s=await this.fetch(this.url,this.buildRequest(A,{range:`bytes=${n}-${n+e-1}`}));if(s.status===416)return new Uint8Array(0);if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(s.status===200&&n===0||s.status===206){const r=s.headers.get("content-range"),o=/\/(\d+)$/.exec(r??"");o?.[1]&&(this._stat={size:parseInt(o[1],10)});const i=A.onProgress?await Gs(s,A.onProgress):await Te(s);return!this._stat&&s.status===200&&(this._stat={size:i.byteLength}),i.byteLength<=e?i:i.subarray(0,e)}throw new Error(s.status===200?`${this.url} fetch returned status 200, expected 206`:`HTTP ${s.status} fetching ${this.url}`)}async readFile(e={}){const n=typeof e=="string"?e:e.encoding,A=typeof e=="string"?{}:e,s=await this.fetch(this.url,this.buildRequest(A));if(!s.ok)throw new Error(`HTTP ${s.status} fetching ${this.url}`);if(n==="utf8")return s.text();if(n)throw new Error(`unsupported encoding: ${n}`);return A.onProgress?Gs(s,A.onProgress):Te(s)}async stat(){return this._stat||await this.read(10,0),this._stat??{size:0}}close(){return Promise.resolve()}}class rc{readFile(){return Promise.reject(new Error("unimplemented"))}read(){return Promise.reject(new Error("unimplemented"))}stat(){return Promise.reject(new Error("unimplemented"))}close(){return Promise.reject(new Error("unimplemented"))}}class oc{}class ic{constructor(){this.signals=new Set,this.abortController=new AbortController}addSignal(e=new oc){if(this.signal.aborted)throw new Error("cannot add a signal, already aborted!");this.signals.add(e),e.aborted?this.handleAborted(e):typeof e.addEventListener=="function"&&e.addEventListener("abort",()=>{this.handleAborted(e)})}handleAborted(e){this.signals.delete(e),this.signals.size===0&&this.abortController.abort()}get signal(){return this.abortController.signal}abort(){this.abortController.abort()}}class ac{constructor(){this.callbacks=new Set}addCallback(e=()=>{}){this.callbacks.add(e),this.currentMessage&&e(this.currentMessage)}callback(e){this.currentMessage=e;for(const n of this.callbacks)n(e)}}class Cn{constructor({fill:e,cache:n}){if(typeof e!="function")throw new TypeError("must pass a fill function");if(typeof n!="object")throw new TypeError("must pass a cache object");if(typeof n.get!="function"||typeof n.set!="function"||typeof n.delete!="function")throw new TypeError("cache must implement get(key), set(key, val), and and delete(key)");this.cache=n,this.fillCallback=e}static isAbortException(e){return e.name==="AbortError"||e.code==="ERR_ABORTED"||e.message==="AbortError: aborted"||e.message==="Error: aborted"}evict(e,n){this.cache.get(e)===n&&this.cache.delete(e)}fill(e,n,A,s){const r=new ic,o=new ac;o.addCallback(s);const i={aborter:r,promise:this.fillCallback(n,r.signal,a=>{o.callback(a)}),settled:!1,statusReporter:o,get aborted(){return this.aborter.signal.aborted}};i.aborter.addSignal(A),i.aborter.signal.addEventListener("abort",()=>{i.settled||this.evict(e,i)}),i.promise.then(()=>{i.settled=!0},()=>{i.settled=!0,this.evict(e,i)}).catch(a=>{throw console.error(a),a}),this.cache.set(e,i)}static checkSinglePromise(e,n){function A(){if(n?.aborted)throw Object.assign(new Error("aborted"),{code:"ERR_ABORTED"})}return e.then(s=>(A(),s),s=>{throw A(),s})}has(e){return this.cache.has(e)}get(e,n,A,s){if(!A&&n instanceof AbortSignal)throw new TypeError("second get argument appears to be an AbortSignal, perhaps you meant to pass `null` for the fill data?");const r=this.cache.get(e);return r?r.aborted&&!r.settled?(this.evict(e,r),this.get(e,n,A,s)):r.settled?r.promise:(r.aborter.addSignal(A),r.statusReporter.addCallback(s),Cn.checkSinglePromise(r.promise,A)):(this.fill(e,n,A,s),Cn.checkSinglePromise(this.cache.get(e).promise,A))}delete(e){const n=this.cache.get(e);n&&(n.settled||n.aborter.abort(),this.cache.delete(e))}clear(){const e=this.cache.keys();let n=0;for(let A=e.next();!A.done;A=e.next())this.delete(A.value),n+=1;return n}}var X=function(t,e,n,A,s){if(A==="m")throw new TypeError("Private method is not writable");if(A==="a"&&!s)throw new TypeError("Private accessor was defined without a setter");if(typeof e=="function"?t!==e||!s:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return A==="a"?s.call(t,n):s?s.value=n:e.set(t,n),n},M=function(t,e,n,A){if(n==="a"&&!A)throw new TypeError("Private accessor was defined without a getter");if(typeof e=="function"?t!==e||!A:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return n==="m"?A:n==="a"?A.call(t):A?A.value:e.get(t)},O,ot,_,W,qt,ke,Ht,ze,ut,Us,Wn,Pn,zn,vs,Xe;class cc extends Map{constructor(e={}){if(super(),O.add(this),ot.set(this,0),_.set(this,new Map),W.set(this,new Map),qt.set(this,void 0),ke.set(this,void 0),Ht.set(this,void 0),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if(typeof e.maxAge=="number"&&e.maxAge===0)throw new TypeError("`maxAge` must be a number greater than 0");X(this,qt,e.maxSize,"f"),X(this,ke,e.maxAge||Number.POSITIVE_INFINITY,"f"),X(this,Ht,e.onEviction,"f")}get __oldCache(){return M(this,W,"f")}get(e){if(M(this,_,"f").has(e)){const n=M(this,_,"f").get(e);return M(this,O,"m",Wn).call(this,e,n)}if(M(this,W,"f").has(e)){const n=M(this,W,"f").get(e);if(!M(this,O,"m",ut).call(this,e,n))return M(this,O,"m",vs).call(this,e,n),n.value}}set(e,n,{maxAge:A=M(this,ke,"f")}={}){const s=typeof A=="number"&&A!==Number.POSITIVE_INFINITY?Date.now()+A:void 0;return M(this,_,"f").has(e)?M(this,_,"f").set(e,{value:n,expiry:s}):M(this,O,"m",zn).call(this,e,{value:n,expiry:s}),this}has(e){return M(this,_,"f").has(e)?!M(this,O,"m",ut).call(this,e,M(this,_,"f").get(e)):M(this,W,"f").has(e)?!M(this,O,"m",ut).call(this,e,M(this,W,"f").get(e)):!1}peek(e){if(M(this,_,"f").has(e))return M(this,O,"m",Pn).call(this,e,M(this,_,"f"));if(M(this,W,"f").has(e))return M(this,O,"m",Pn).call(this,e,M(this,W,"f"))}expiresIn(e){const n=M(this,_,"f").get(e)??M(this,W,"f").get(e);if(n)return n.expiry?n.expiry-Date.now():Number.POSITIVE_INFINITY}delete(e){var n;const A=M(this,_,"f").delete(e);return A&&X(this,ot,(n=M(this,ot,"f"),n--,n),"f"),M(this,W,"f").delete(e)||A}clear(){M(this,_,"f").clear(),M(this,W,"f").clear(),X(this,ot,0,"f")}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");const n=[...M(this,O,"m",Xe).call(this)],A=n.length-e;A<0?(X(this,_,new Map(n),"f"),X(this,W,new Map,"f"),X(this,ot,n.length,"f")):(A>0&&M(this,O,"m",ze).call(this,n.slice(0,A)),X(this,W,new Map(n.slice(A)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f")),X(this,qt,e,"f")}evict(e=1){const n=e;if(!n||n<=0)return;const A=[...M(this,O,"m",Xe).call(this)],s=Math.trunc(Math.min(n,Math.max(A.length-1,0)));s<=0||(M(this,O,"m",ze).call(this,A.slice(0,s)),X(this,W,new Map(A.slice(s)),"f"),X(this,_,new Map,"f"),X(this,ot,0,"f"))}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[(ot=new WeakMap,_=new WeakMap,W=new WeakMap,qt=new WeakMap,ke=new WeakMap,Ht=new WeakMap,O=new WeakSet,ze=function(n){if(typeof M(this,Ht,"f")=="function")for(const[A,s]of n)M(this,Ht,"f").call(this,A,s.value)},ut=function(n,A){return typeof A.expiry=="number"&&A.expiry<=Date.now()?(typeof M(this,Ht,"f")=="function"&&M(this,Ht,"f").call(this,n,A.value),this.delete(n)):!1},Us=function(n,A){if(!M(this,O,"m",ut).call(this,n,A))return A.value},Wn=function(n,A){return A.expiry?M(this,O,"m",Us).call(this,n,A):A.value},Pn=function(n,A){const s=A.get(n);return M(this,O,"m",Wn).call(this,n,s)},zn=function(n,A){var s;M(this,_,"f").set(n,A),X(this,ot,(s=M(this,ot,"f"),s++,s),"f"),M(this,ot,"f")>=M(this,qt,"f")&&(X(this,ot,0,"f"),M(this,O,"m",ze).call(this,M(this,W,"f")),X(this,W,M(this,_,"f"),"f"),X(this,_,new Map,"f"))},vs=function(n,A){M(this,W,"f").delete(n),M(this,O,"m",zn).call(this,n,A)},Xe=function*(){for(const n of M(this,W,"f")){const[A,s]=n;M(this,_,"f").has(A)||M(this,O,"m",ut).call(this,A,s)||(yield n)}for(const n of M(this,_,"f")){const[A,s]=n;M(this,O,"m",ut).call(this,A,s)||(yield n)}},Symbol.iterator)](){for(const e of M(this,_,"f")){const[n,A]=e;M(this,O,"m",ut).call(this,n,A)||(yield[n,A.value])}for(const e of M(this,W,"f")){const[n,A]=e;M(this,_,"f").has(n)||M(this,O,"m",ut).call(this,n,A)||(yield[n,A.value])}}*entriesDescending(){let e=[...M(this,_,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;M(this,O,"m",ut).call(this,s,r)||(yield[s,r.value])}e=[...M(this,W,"f")];for(let n=e.length-1;n>=0;--n){const A=e[n],[s,r]=A;M(this,_,"f").has(s)||M(this,O,"m",ut).call(this,s,r)||(yield[s,r.value])}}*entriesAscending(){for(const[e,n]of M(this,O,"m",Xe).call(this))yield[e,n.value]}get size(){if(!M(this,ot,"f"))return M(this,W,"f").size;let e=0;for(const n of M(this,W,"f").keys())M(this,_,"f").has(n)||e++;return Math.min(M(this,ot,"f")+e,M(this,qt,"f"))}get maxSize(){return M(this,qt,"f")}get maxAge(){return M(this,ke,"f")}entries(){return this.entriesAscending()}forEach(e,n=this){for(const[A,s]of this.entriesAscending())e.call(n,s,A,this)}get[Symbol.toStringTag](){return"QuickLRU"}toString(){return`QuickLRU(${this.size}/${this.maxSize})`}[Symbol.for("nodejs.util.inspect.custom")](){return this.toString()}}function lc(t){if(t.length===0)return[];const e=t.toSorted((s,r)=>s.min-r.min),n=[];let A=e[0];for(let s=1;s<e.length;s++){const r=e[s];r.min>A.max+1?(n.push(A),A=r):r.max>A.max&&(A={min:A.min,max:r.max})}return n.push(A),n}var gc={},Ts={};function gt(t){var e=Ts[t];if(e!==void 0)return e.exports;var n=Ts[t]={exports:{}};return gc[t](n,n.exports,gt),n.exports}(()=>{var t=Object.getPrototypeOf?n=>Object.getPrototypeOf(n):n=>n.__proto__,e;gt.t=function(n,A){if(A&1&&(n=this(n)),A&8||typeof n=="object"&&n&&(A&4&&n.__esModule||A&16&&typeof n.then=="function"))return n;var s=Object.create(null);gt.r(s);var r={};e=e||[null,t({}),t([]),t(t)];for(var o=A&2&&n;(typeof o=="object"||typeof o=="function")&&!~e.indexOf(o);o=t(o))Object.getOwnPropertyNames(o).forEach(i=>r[i]=()=>n[i]);return r.default=()=>n,gt.d(s,r),s}})();gt.d=(t,e)=>{for(var n in e)gt.o(e,n)&&!gt.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})};gt.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);gt.r=t=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var zA={};gt.r(zA);gt.d(zA,{__wbg_Error_ef53bc310eb298a0:()=>Ic,__wbg_set_wasm:()=>VA,decompress_and_parse_bigwig:()=>bo,decompress_and_parse_summary:()=>Do,inflate_raw:()=>hc,inflate_raw_batch:()=>Mo,inflate_raw_unknown_size:()=>uc});const ko="data:application/wasm;base64,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AkH4AXEiAkGAncAAaiEGIAJBiJ3AAGooAgAhAgsgBiAANgIIIAIgADYCDCAAIAY2AgwgACACNgIIDAELIAggAiADaiIAQQNyNgIEIAggAGoiACAAKAIEQQFyNgIECyAIQQhqIgANAQsCQAJAAkACQAJAAkBBACgCkJ9AIgAgA08NAAJAQQAoApSfQCIAIANLDQAgAUEEakG0n8AAIANBr4AEakGAgHxxECMCQCABKAIEIgYNAEEAIQAMCAsgASgCDCEFQQBBACgCoJ9AIAEoAggiCWoiADYCoJ9AQQAgAEEAKAKkn0AiAiAAIAJLGzYCpJ9AAkACQAJAQQAoApyfQCICRQ0AQfCcwAAhAANAIAYgACgCACIIIAAoAgQiB2pGDQIgACgCCCIADQAMAwsLAkACQEEAKAKsn0AiAEUNACAGIABPDQELQQAgBjYCrJ9AC0EAQf8fNgKwn0BBACAFNgL8nEBBACAJNgL0nEBBACAGNgLwnEBBAEGAncAANgKMnUBBAEGIncAANgKUnUBBAEGAncAANgKInUBBAEGQncAANgKcnUBBAEGIncAANgKQnUBBAEGYncAANgKknUBBAEGQncAANgKYnUBBAEGgncAANgKsnUBBAEGYncAANgKgnUBBAEGoncAANgK0nUBBAEGgncAANgKonUBBAEGwncAANgK8nUBBAEGoncAANgKwnUBBAEG4ncAANgLEnUBBAEGwncAANgK4nUBBAEHAncAANgLMnUBBAEG4ncAANgLAnUBBAEHAncAANgLInUBBAEHIncAANgLUnUBBAEHIncAANgLQnUBBAEHQncAANgLcnUBBAEHQncAANgLYnUBBAEHYncAANgLknUBBAEHYncAANgLgnUBBAEHgncAANgLsnUBBAEHgncAANgLonUBBAEHoncAANgL0nUBBAEHoncAANgLwnUBBAEHwncAANgL8nUBBAEHwncAANgL4nUBBAEH4ncAANgKEnkBBAEH4ncAANgKAnkBBAEGAnsAANgKMnkBBAEGInsAANgKUnkBBAEGAnsAANgKInkBBAEGQnsAANgKcnkBBAEGInsAANgKQnkBBAEGYnsAANgKknkBBAEGQnsAANgKYnkBBAEGgnsAANgKsnkBBAEGYnsAANgKgnkBBAEGonsAANgK0nkBBAEGgnsAANgKonkBBAEGwnsAANgK8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bGVkOiDAAMACOiDAAC9ydXN0Yy84YmFiMjZmNGY2OGUwZTI2ZjBiYjc5NjBiZTMzNGQ1YjUyMGVhNDUyL2xpYnJhcnkvYWxsb2Mvc3JjL2ZtdC5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L3N0ZC9zcmMvc3lzL3N5bmMvcndsb2NrL25vX3RocmVhZHMucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMjIvc3JjL2V4dGVybnJlZi5ycwAvcnVzdGMvOGJhYjI2ZjRmNjhlMGUyNmYwYmI3OTYwYmUzMzRkNWI1MjBlYTQ1Mi9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjL21vZC5ycwAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi4xMy9zcmMvZGxtYWxsb2MucnMAL2hvbWUvcnVubmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvbGliZGVmbGF0ZXItMS4yNS4yL3NyYy9saWIucnMAY29tcHJlc3NlZCBibG9jayBleHRlbmRzIHBhc3QgdGhlIGlucHV0IGJ1ZmZlcmJsb2NrIG9mZnNldCBvdmVyZmxvd3NibG9jayBpcyBzaG9ydGVyIHRoYW4gdGhlIDItYnl0ZSB6bGliIGhlYWRlcgAAAM4CEAAKAAAAUQAAAAsAAADOAhAACgAAAGcAAAALAAAAzgIQAAoAAABZAAAAPQAAAM4CEAAKAAAAYgAAACsAAADOAhAACgAAAFwAAAAPAAAAZGVjb21wcmVzc2lvbiBvdXRwdXQgdG9vIGxhcmdlAADOAhAACgAAAJIAAAA9AAAAzgIQAAoAAACYAAAAHQAAAM4CEAAKAAAAAQEAAD0AAADOAhAACgAAAAcBAAAdAAAAQmFkRGF0YUluc3VmZmljaWVudFNwYWNllQEQAGcAAACEAAAAEQAAAJUBEABnAAAAkgAAABEAAABsaWJkZWZsYXRlX2RlZmxhdGVfZGVjb21wcmVzcyByZXR1cm5lZCBhbiB1bmtub3du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IG1heF9vdmVyaGVhZAAATgIQACoAAAC3BAAADQAAAHJ3bG9jayBvdmVyZmxvd2VkIHJlYWQgbG9ja3M3ARAAXQAAABUAAAAsAAAAAAAAAAgAAAAEAAAAFQAAAAkAAAAMAAAABAAAABYAAAByd2xvY2sgaGFzIG5vdCBiZWVuIGxvY2tlZCBmb3IgcmVhZGluZwAANwEQAF0AAAA+AAAACQAAAGNhcGFjaXR5IG92ZXJmbG93AAAA/QEQAFAAAAAcAAAABQAAABcAAAAMAAAABAAAABgAAAAZAAAAGgAAAAAAAAAAAAAAAQAAABsAAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdAAA7gAQAEgAAACPAgAADgAAAEVycm9yMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlSZWZDZWxsIGFscmVhZHkgYm9ycm93ZWQAQaybwAALBAQAAAAAKQRuYW1lASIBXx9fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyAEgJcHJvZHVjZXJzAQxwcm9jZXNzZWQtYnkCBndhbHJ1cwYwLjI2LjIMd2FzbS1iaW5kZ2VuEzAuMi4xMjIgKGRkZDMyMjUxNCk=";var fc=gt.t(ko);function bo(t,e,n,A,s,r){try{const g=U.__wbindgen_add_to_stack_pointer(-16),f=Ke(t,U.__wbindgen_export),h=it,u=Qe(e,U.__wbindgen_export),I=it,d=Qe(n,U.__wbindgen_export),C=it;U.decompress_and_parse_bigwig(g,f,h,u,I,d,C,A,s,r);var o=z().getInt32(g+0,!0),i=z().getInt32(g+4,!0),a=z().getInt32(g+8,!0),c=z().getInt32(g+12,!0);if(c)throw qe(a);var l=_e(o,i).slice();return U.__wbindgen_export2(o,i*1,1),l}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Do(t,e,n,A,s,r,o){try{const f=U.__wbindgen_add_to_stack_pointer(-16),h=Ke(t,U.__wbindgen_export),u=it,I=Qe(e,U.__wbindgen_export),d=it,C=Qe(n,U.__wbindgen_export),E=it;U.decompress_and_parse_summary(f,h,u,I,d,C,E,A,s,r,o);var i=z().getInt32(f+0,!0),a=z().getInt32(f+4,!0),c=z().getInt32(f+8,!0),l=z().getInt32(f+12,!0);if(l)throw qe(c);var g=_e(i,a).slice();return U.__wbindgen_export2(i,a*1,1),g}finally{U.__wbindgen_add_to_stack_pointer(16)}}function hc(t,e){try{const i=U.__wbindgen_add_to_stack_pointer(-16),a=Ke(t,U.__wbindgen_export),c=it;U.inflate_raw(i,a,c,e);var n=z().getInt32(i+0,!0),A=z().getInt32(i+4,!0),s=z().getInt32(i+8,!0),r=z().getInt32(i+12,!0);if(r)throw qe(s);var o=_e(n,A).slice();return U.__wbindgen_export2(n,A*1,1),o}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Mo(t,e,n,A){try{const c=U.__wbindgen_add_to_stack_pointer(-16),l=Ke(t,U.__wbindgen_export),g=it,f=Qe(e,U.__wbindgen_export),h=it,u=Qe(n,U.__wbindgen_export),I=it;U.inflate_raw_batch(c,l,g,f,h,u,I,A);var s=z().getInt32(c+0,!0),r=z().getInt32(c+4,!0),o=z().getInt32(c+8,!0),i=z().getInt32(c+12,!0);if(i)throw qe(o);var a=_e(s,r).slice();return U.__wbindgen_export2(s,r*1,1),a}finally{U.__wbindgen_add_to_stack_pointer(16)}}function uc(t){try{const o=U.__wbindgen_add_to_stack_pointer(-16),i=Ke(t,U.__wbindgen_export),a=it;U.inflate_raw_unknown_size(o,i,a);var e=z().getInt32(o+0,!0),n=z().getInt32(o+4,!0),A=z().getInt32(o+8,!0),s=z().getInt32(o+12,!0);if(s)throw qe(A);var r=_e(e,n).slice();return U.__wbindgen_export2(e,n*1,1),r}finally{U.__wbindgen_add_to_stack_pointer(16)}}function Ic(t,e){const n=Error(Qc(t,e));return dc(n)}function dc(t){Ge===Ft.length&&Ft.push(Ft.length+1);const e=Ge;return Ge=Ft[e],Ft[e]=t,e}function Cc(t){t<1028||(Ft[t]=Ge,Ge=t)}function _e(t,e){return t=t>>>0,XA().subarray(t/1,t/1+e)}let ae=null;function z(){return(ae===null||ae.buffer.detached===!0||ae.buffer.detached===void 0&&ae.buffer!==U.memory.buffer)&&(ae=new DataView(U.memory.buffer)),ae}function Qc(t,e){return wc(t>>>0,e)}let Ve=null;function Bc(){return(Ve===null||Ve.byteLength===0)&&(Ve=new Uint32Array(U.memory.buffer)),Ve}let Ze=null;function XA(){return(Ze===null||Ze.byteLength===0)&&(Ze=new Uint8Array(U.memory.buffer)),Ze}function Ec(t){return Ft[t]}let Ft=new Array(1024).fill(void 0);Ft.push(void 0,null,!0,!1);let Ge=Ft.length;function Qe(t,e){const n=e(t.length*4,4)>>>0;return Bc().set(t,n/4),it=t.length,n}function Ke(t,e){const n=e(t.length*1,1)>>>0;return XA().set(t,n/1),it=t.length,n}function qe(t){const e=Ec(t);return Cc(t),e}let an=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});an.decode();const mc=2146435072;let Xn=0;function wc(t,e){return Xn+=e,Xn>=mc&&(an=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0}),an.decode(),Xn=e),an.decode(XA().subarray(t,t+e))}let it=0,U;function VA(t){U=t}VA(fc);let je=null,Vn=null;async function ZA(){return je||(Vn||(Vn=(async()=>{const e=await(await fetch(ko)).arrayBuffer(),{instance:n}=await WebAssembly.instantiate(e,{"./inflate_wasm_bg.js":zA});return VA(n.exports),je=n.exports,je})()),Vn)}async function pc(t,e,n,A){await ZA();const s=Mo(t,e,n,A),r=new DataView(s.buffer,s.byteOffset,s.byteLength),o=r.getUint32(0,!0),i=4,a=i+(o+1)*4,c=new Array(o+1);for(let g=0;g<=o;g++)c[g]=r.getUint32(i+g*4,!0);return{data:s.subarray(a),offsets:c}}function yc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n)}}function Nc(t){const n=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0,!0);if(n===0)return{starts:new Int32Array(0),ends:new Int32Array(0),scores:new Float32Array(0),minScores:new Float32Array(0),maxScores:new Float32Array(0)};const A=4,s=A+n*4,r=s+n*4,o=r+n*4,i=o+n*4;return{starts:new Int32Array(t.buffer,t.byteOffset+A,n),ends:new Int32Array(t.buffer,t.byteOffset+s,n),scores:new Float32Array(t.buffer,t.byteOffset+r,n),minScores:new Float32Array(t.buffer,t.byteOffset+o,n),maxScores:new Float32Array(t.buffer,t.byteOffset+i,n)}}async function kc(t,e,n,A,s,r){await ZA();const o=bo(t,e,n,A,s,r);return yc(o)}async function bc(t,e,n,A,s,r,o){await ZA();const i=Do(t,e,n,A,s,r,o);return Nc(i)}function jA(t){const e=new Uint32Array(t.length),n=new Uint32Array(t.length);for(let A=0;A<t.length;A++){const s=t[A];e[A]=s.offset,n[A]=s.length}return{inputOffsets:e,inputLengths:n}}async function Dc(t,e,n){const{inputOffsets:A,inputLengths:s}=jA(e);return pc(t,A,s,n)}async function Mc(t,e,n,A,s){const{inputOffsets:r,inputLengths:o}=jA(e);return kc(t,r,o,n,A,s)}async function Fc(t,e,n,A,s,r){const{inputOffsets:o,inputLengths:i}=jA(e);return bc(t,o,i,n,A,s,r)}const ts=new TextDecoder("utf8");function rt(t,e=0){return new DataView(t.buffer,t.byteOffset+e,t.length-e)}function j(t,e){return t.getUint32(e,!0)+t.getUint32(e+4,!0)*2**32}function uA(t,e,n){const A=t.indexOf(0,e),s=A!==-1&&A<e+n?A:e+n;return ts.decode(t.subarray(e,s))}function Sc(t){const e=t.toSorted((s,r)=>s.offset-r.offset),n=[];let A;for(const s of e)A&&s.offset-(A.offset+A.length)<=2e3?(A.length=Math.max(A.length,s.offset+s.length-A.offset),A.blocks.push(s)):(A={blocks:[s],length:s.length,offset:s.offset},n.push(A));return n}const Js=610839776;function Rc(t,e){let n=0;for(const s of t)n+=s.length;let A=0;return e?.(0,n),s=>{A+=s,e?.(A,n)}}function ue(t,e,n,A){return t<A&&e>n}function Fo(t,e){return e?t/e:t}function Lc(t,e){const n=[];let A=0;const s=rt(t);for(;A<t.byteLength;){const r=s.getUint32(A,!0);A+=4;const o=s.getUint32(A,!0);A+=4;const i=s.getUint32(A,!0);A+=4;const a=s.getUint32(A,!0);A+=4;const c=s.getFloat32(A,!0);A+=4;const l=s.getFloat32(A,!0);A+=4;const g=s.getFloat32(A,!0);A+=8,(!e||r===e.chrId&&ue(o,i,e.start,e.end))&&n.push({start:o,end:i,maxScore:l,minScore:c,summary:!0,score:Fo(g,a)})}return n}function xc(t,e,n){const A=[];let s=0;const r=rt(t);for(;s<t.byteLength;){const o=s,i=r.getUint32(s,!0);s+=4;const a=r.getInt32(s,!0);s+=4;const c=r.getInt32(s,!0);s+=4;const l=t.indexOf(0,s),g=l===-1?t.length:l,f=ts.decode(t.subarray(s,g));s=g+1,(!n||i===n.chrId&&ue(a,c,n.start,n.end))&&A.push({start:a,end:c,rest:f,uniqueId:`bb-${e}-${o}`})}return A}function Gc(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0);let a=24;const c=[];switch(o){case 1:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getInt32(a,!0);a+=4;const h=n.getFloat32(a,!0);a+=4,(!e||ue(g,f,e.start,e.end))&&c.push({start:g,end:f,score:h})}break}case 2:{for(let l=0;l<i;l++){const g=n.getInt32(a,!0);a+=4;const f=n.getFloat32(a,!0);a+=4;const h=g+r;(!e||ue(g,h,e.start,e.end))&&c.push({score:f,start:g,end:h})}break}case 3:{for(let l=0;l<i;l++){const g=n.getFloat32(a,!0);a+=4;const f=A+l*s,h=f+r;(!e||ue(f,h,e.start,e.end))&&c.push({score:g,start:f,end:h})}break}}return c}function $s(t,e){const n=rt(t),A=n.getInt32(4,!0),s=n.getUint32(12,!0),r=n.getUint32(16,!0),o=n.getUint8(20),i=n.getUint16(22,!0),a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i),g=e.start,f=e.end;let h=0;switch(o){case 1:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=n.getInt32(u+4,!0);d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+8,!0),h++),u+=12}break}case 2:{let u=24;for(let I=0;I<i;I++){const d=n.getInt32(u,!0),C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u+4,!0),h++),u+=8}break}case 3:{let u=24;for(let I=0;I<i;I++){const d=A+I*s,C=d+r;d<f&&C>g&&(a[h]=d,c[h]=C,l[h]=n.getFloat32(u,!0),h++),u+=4}break}}return h<i?{starts:a.subarray(0,h),ends:c.subarray(0,h),scores:l.subarray(0,h)}:{starts:a,ends:c,scores:l}}function Ys(t,e){const n=rt(t),A=Math.floor(t.byteLength/32),s=new Int32Array(A),r=new Int32Array(A),o=new Float32Array(A),i=new Float32Array(A),a=new Float32Array(A);let c=0,l=0;for(;l<t.byteLength;){const g=n.getUint32(l,!0);l+=4;const f=n.getUint32(l,!0);l+=4;const h=n.getUint32(l,!0);l+=4;const u=n.getUint32(l,!0);l+=4;const I=n.getFloat32(l,!0);l+=4;const d=n.getFloat32(l,!0);l+=4;const C=n.getFloat32(l,!0);l+=8,g===e.chrId&&ue(f,h,e.start,e.end)&&(s[c]=f,r[c]=h,o[c]=Fo(C,u),i[c]=I,a[c]=d,c++)}return c<A?{starts:s.subarray(0,c),ends:r.subarray(0,c),scores:o.subarray(0,c),minScores:i.subarray(0,c),maxScores:a.subarray(0,c)}:{starts:s,ends:r,scores:o,minScores:i,maxScores:a}}function Ue(t,e,n,A){if(t.length===1)return e(t[0]);const s=new A(n);let r=0;for(const o of t){const i=e(o);s.set(i,r),r+=i.length}return s}function So(t){let e=0;for(const n of t)e+=n.starts.length;return e}function Ro(t){const e=So(t);return{starts:Ue(t,n=>n.starts,e,Int32Array),ends:Ue(t,n=>n.ends,e,Int32Array),scores:Ue(t,n=>n.scores,e,Float32Array),isSummary:!1}}function Uc(t){const e=So(t),{starts:n,ends:A,scores:s}=Ro(t);return{starts:n,ends:A,scores:s,minScores:Ue(t,r=>r.minScores,e,Float32Array),maxScores:Ue(t,r=>r.maxScores,e,Float32Array),isSummary:!0}}function Lo(t){let e=0;for(const i of t)for(const a of i)e+=a.starts.length;const n=new Int32Array(e),A=new Int32Array(e),s=new Float32Array(e),r=[0];let o=0;for(const i of t){for(const a of i)n.set(a.starts,o),A.set(a.ends,o),s.set(a.scores,o),o+=a.starts.length;r.push(o)}return{starts:n,ends:A,scores:s,regionOffsets:r,totalCount:e}}function vc(t){const{starts:e,ends:n,scores:A,regionOffsets:s}=Lo(t);return{starts:e,ends:n,scores:A,regionOffsets:s,isSummary:!1}}function Tc(t){const{starts:e,ends:n,scores:A,regionOffsets:s,totalCount:r}=Lo(t),o=new Float32Array(r),i=new Float32Array(r);let a=0;for(const c of t)for(const l of c)o.set(l.minScores,a),i.set(l.maxScores,a),a+=l.starts.length;return{starts:e,ends:n,scores:A,minScores:o,maxScores:i,regionOffsets:s,isSummary:!0}}function Os(t,e,n,A){switch(t){case"summary":return Lc(e,A);case"bigwig":return Gc(e,A);case"bigbed":return xc(e,n,A)}}class Jc{rTreePromise;rTreeNodeCache=new Cn({cache:new cc({maxSize:1e3}),fill:async({length:e,offset:n},A)=>this.bbi.read(e,n,{signal:A})});bbi;refsByName;rTreeOffset;uncompressBufSize;blockType;constructor(e,n,A,s,r){if(!(A>=0))throw new Error("invalid rTreeOffset!");this.bbi=e,this.refsByName=n,this.rTreeOffset=A,this.uncompressBufSize=s,this.blockType=r}async _collectBlocks(e,n,A,s){const r=this.refsByName[e];if(r===void 0||n>=A)return;this.rTreePromise||(this.rTreePromise=this.bbi.read(48,this.rTreeOffset,{signal:s?.signal}).catch(u=>{throw this.rTreePromise=void 0,u}));const o=await this.rTreePromise,i=rt(o),a=i.getUint32(0,!0);if(a!==Js)throw new Error(`invalid cirTree magic: 0x${a.toString(16)} (expected 0x${Js.toString(16)}) at offset ${this.rTreeOffset}, file may be corrupt or unsupported`);const l=4+i.getUint32(4,!0)*32,g=(u,I,d,C)=>(u<r||u===r&&I<A)&&(d>r||d===r&&C>n),f=[];let h=[this.rTreeOffset+48];for(;h.length>0;){const u=lc(h.map(d=>({min:d,max:d+l}))),I=[];for(const{min:d,max:C}of u){const E=C-d,B=d,Q=await this.rTreeNodeCache.get(`${E}_${B}`,{length:E,offset:B},s?.signal);for(const m of h)if(d<=m&&m<=C){const p=Q.subarray(m-B),w=rt(p),y=w.getUint8(0),N=w.getUint16(2,!0);if(y===1||y===0){const k=y===1?32:24;let b=4;for(let D=0;D<N;D++){const F=w.getUint32(b,!0),R=w.getUint32(b+4,!0),v=w.getUint32(b+8,!0),x=w.getUint32(b+12,!0);if(g(F,R,v,x)){const Y=j(w,b+16);if(y===1){const J=j(w,b+24);f.push({offset:Y,length:J})}else I.push(Y)}b+=k}}}}h=I}return{blocks:f,chrId:r}}async readWigData(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);if(!r)return[];const{blocks:o,chrId:i}=r;return this.readFeatures(o,{...s,request:{chrId:i,start:n,end:A}})}async getBlockSizeForRange(e,n,A,s){const r=await this._collectBlocks(e,n,A,s);let o=0;if(r)for(const i of r.blocks)o+=i.length;return o}async getBlockSizeForRangeMulti(e,n={}){const{blockByOffset:A}=await this._collectBlocksMulti(e,n);let s=0;for(const r of A.values())s+=r.length;return s}async _collectBlocksMulti(e,n){const A=await Promise.all(e.map(({refName:o,start:i,end:a})=>this._collectBlocks(o,i,a,n))),s=new Map,r=new Map;for(let o=0;o<A.length;o++){const i=A[o];if(i){const{start:a,end:c}=e[o],l={chrId:i.chrId,start:a,end:c};for(const g of i.blocks){const f=r.get(g.offset);f?f.push({regionIndex:o,request:l}):(s.set(g.offset,g),r.set(g.offset,[{regionIndex:o,request:l}]))}}}return{blockByOffset:s,tagsByOffset:r}}async readWigDataMulti(e,n={}){const A=e.map(()=>[]),{blockByOffset:s,tagsByOffset:r}=await this._collectBlocksMulti(e,n),{blockType:o}=this;return await this._forEachDecodedBlock([...s.values()],n.signal,n.onProgress,(i,a)=>{const c=r.get(a);if(c)for(const{regionIndex:l,request:g}of c){const f=Os(o,i,a,g);for(const h of f)A[l].push(h)}}),A}assertNotBigBed(e){if(this.blockType==="bigbed")throw new Error(`${e} is not supported for BigBed data; use getFeatures/getFeaturesMulti instead`)}async readWigDataAsArrays(e,n,A,s){this.assertNotBigBed("getFeaturesAsArrays");const r=await this._collectBlocks(e,n,A,s),o=r?r.blocks:[],i={chrId:r?r.chrId:0,start:n,end:A};return this.blockType==="summary"?this._readSummaryFeaturesAsArrays(o,i,s):this._readBigWigFeaturesAsArrays(o,i,s)}async readWigDataAsArraysMulti(e,n={}){this.assertNotBigBed("getFeaturesAsArraysMulti");const A=await this._collectBlocksMulti(e,n);return this.blockType==="summary"?Tc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>Ys(s,r),n)):vc(await this._readBlocksAsArraysMulti(A,e.length,(s,r)=>$s(s,r),n))}async _readBlocksAsArraysMulti(e,n,A,s){const{blockByOffset:r,tagsByOffset:o}=e,i=Array.from({length:n},()=>[]);return await this._forEachDecodedBlock([...r.values()],s.signal,s.onProgress,(a,c)=>{const l=o.get(c);if(l)for(const{regionIndex:g,request:f}of l){const h=A(a,f);h.starts.length>0&&i[g].push(h)}}),i}async _forEachBlockGroup(e,n,A,s){const r=Sc(e),o=Rc(r,A);for(const i of r){const a=await this.bbi.read(i.length,i.offset,{signal:n});o(i.length),await s(a,i.blocks.map(c=>({offset:c.offset-i.offset,length:c.length})),i.offset)}}async _forEachDecodedBlock(e,n,A,s){const{uncompressBufSize:r}=this;await this._forEachBlockGroup(e,n,A,async(o,i,a)=>{if(r>0){const{data:c,offsets:l}=await Dc(o,i,r);for(let g=0;g<i.length;g++)s(c.subarray(l[g],l[g+1]),a+i[g].offset)}else for(const c of i)s(o.subarray(c.offset,c.offset+c.length),a+c.offset)})}async readFeatures(e,n={}){const{blockType:A}=this,{signal:s,request:r,onProgress:o}=n,i=[];return await this._forEachDecodedBlock(e,s,o,(a,c)=>{const l=Os(A,a,c,r);for(const g of l)i.push(g)}),i}async _readBlocksAsArrays(e,n,A,s,r){const{uncompressBufSize:o}=this,i=[],a=c=>{c.starts.length>0&&i.push(c)};return await this._forEachBlockGroup(e,n,r,async(c,l)=>{if(o>0)a(await A(c,l));else for(const g of l)a(s(c.subarray(g.offset,g.offset+g.length)))}),i}async _readBigWigFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Mc(r,o,this.uncompressBufSize,n.start,n.end),r=>$s(r,n),A.onProgress);return Ro(s)}async _readSummaryFeaturesAsArrays(e,n,A={}){const s=await this._readBlocksAsArrays(e,A.signal,(r,o)=>Fc(r,o,this.uncompressBufSize,n.chrId,n.start,n.end),r=>Ys(r,n),A.onProgress);return Uc(s)}}const $c=-2003829722,_s=-2021002517;class xo{bbi;headerP;getHeader(e){return this.headerP||(this.headerP=this._getHeader(e).catch(n=>{throw this.headerP=void 0,n})),this.headerP}constructor(e){const{filehandle:n,path:A,url:s}=e;if(n)this.bbi=n;else if(s)this.bbi=new No(s);else if(A)this.bbi=new rc(A);else throw new Error("no file given")}async _getHeader(e){const n=await this._getMainHeader(e),A=await this._readChromosomeTree(n,e);return{...n,...A}}async _getMainHeader(e,n=2e3){const A=await this.bbi.read(n,0,e),s=rt(A);let r=0;const o=s.getInt32(r,!0);if(r+=4,o!==$c&&o!==_s)throw new Error("not a BigWig/BigBed file");const i=s.getUint16(r,!0);r+=2;const a=s.getUint16(r,!0);r+=2;const c=j(s,r);r+=8;const l=j(s,r);r+=8;const g=j(s,r);r+=8;const f=s.getUint16(r,!0);r+=2;const h=s.getUint16(r,!0);r+=2;const u=j(s,r);r+=8;const I=j(s,r);r+=8;const d=s.getUint32(r,!0);r+=4;const C=j(s,r);r+=8;const E=[];for(let y=0;y<a;y++){const N=s.getUint32(r,!0);r+=4,r+=4;const k=j(s,r);r+=8;const b=j(s,r);r+=8,E.push({reductionLevel:N,dataOffset:k,indexOffset:b})}const B=o===_s?"bigbed":"bigwig",Q=A.length<n,m=u!==0&&!A.includes(0,u);if(!Q&&(u>n||I>n-40||m))return this._getMainHeader(e,n*2);let p;if(I){const y=rt(A,I);p={basesCovered:j(y,0),scoreMin:y.getFloat64(8,!0),scoreMax:y.getFloat64(16,!0),scoreSum:y.getFloat64(24,!0),scoreSumSquares:y.getFloat64(32,!0)}}else throw new Error("no stats");let w="";if(u){const y=A.indexOf(0,u),N=y===-1?A.length:y;w=ts.decode(A.subarray(u,N))}return{zoomLevels:E,magic:o,extHeaderOffset:C,numZoomLevels:a,fieldCount:f,totalSummary:p,definedFieldCount:h,uncompressBufSize:d,asOffset:u,chromosomeTreeOffset:c,totalSummaryOffset:I,unzoomedDataOffset:l,unzoomedIndexOffset:g,fileType:B,version:i,autoSql:w}}async _readChromosomeTree(e,n){const A=[],s={},r=e.chromosomeTreeOffset,o=rt(await this.bbi.read(32,r,n)),i=o.getUint32(4,!0),a=o.getUint32(8,!0),c=o.getUint32(12,!0),l=4+i*(a+Math.max(c,8)),g=async f=>{const h=await this.bbi.read(l,f,n),u=rt(h),I=u.getUint8(0),d=u.getUint16(2,!0);let C=4;if(I)for(let E=0;E<d;E++){const B=uA(h,C,a);C+=a;const Q=u.getUint32(C,!0);C+=4;const m=u.getUint32(C,!0);C+=4,s[B]=Q,A[Q]={name:B,id:Q,length:m}}else{const E=[];for(let B=0;B<d;B++){C+=a;const Q=j(u,C);C+=8,E.push(g(Q))}await Promise.all(E)}};return await g(r+32),{refsByName:s,refsByNumber:A}}viewCache=new Map;getOrCreateBlockView(e,n,A,s){const r=`${n}_${s}`;let o=this.viewCache.get(r);return o||(o=new Jc(this.bbi,e,n,A,s),this.viewCache.set(r,o)),o}async getUnzoomedView(e){const{unzoomedIndexOffset:n,refsByName:A,uncompressBufSize:s,fileType:r}=await this.getHeader(e);return this.getOrCreateBlockView(A,n,s,r)}async _getView(e){const{basesPerSpan:n,scale:A}=e??{},s=n?1/n:A??1;return this.getView(s,e)}async getFeatures(e,n,A,s){return(await this._getView(s)).readWigData(e,n,A,s)}async getRegionByteSize(e,n,A,s){return(await this._getView(s)).getBlockSizeForRange(e,n,A,s)}async getRegionByteSizeMulti(e,n){return(await this._getView(n)).getBlockSizeForRangeMulti(e,n)}async getFeaturesMulti(e,n){return(await this._getView(n)).readWigDataMulti(e,n)}async getFeaturesAsArrays(e,n,A,s){return(await this._getView(s)).readWigDataAsArrays(e,n,A,s)}async getFeaturesAsArraysMulti(e,n){return(await this._getView(n)).readWigDataAsArraysMulti(e,n)}}class Go extends xo{async getView(e,n){const{zoomLevels:A,refsByName:s,uncompressBufSize:r}=await this.getHeader(n),o=1/e,i=A.length-1;for(let a=i;a>=0;a-=1){const c=A[a];if(c.reductionLevel<=2*o)return this.getOrCreateBlockView(s,c.indexOffset,r,"summary")}return this.getUnzoomedView(n)}}function Yc(t,e){if(e<0)return;let n=0;for(let s=0;s<e;s++){if(n=t.indexOf(" ",n),n===-1)return;n++}const A=t.indexOf(" ",n);return A===-1?t.slice(n):t.slice(n,A)}function Ks(t,e){return t<e?-1:t>e?1:0}async function Uo(t,e,n,A,s,r,o,i){const a=4+n*(A+s),c=await t.read(a,e,i),l=rt(c),g=l.getInt8(0),f=l.getInt16(2,!0);let h=4;if(g===0){const u=[];for(let B=0;B<f;B++){const Q=uA(c,h,A);h+=A;const m=j(l,h);h+=8,u.push({key:Q,offset:m})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const B=Math.floor((I+d)/2);Ks(r,u[B].key)>=0?(C=B,I=B+1):d=B-1}const E=u[Math.max(C,0)].offset;return Uo(t,E,n,A,s,r,o,i)}else if(g===1){const u=[];for(let Q=0;Q<f;Q++){const m=uA(c,h,A);h+=A;const p=j(l,h);h+=8;const w=l.getUint32(h,!0);h+=4,h+=4,u.push({key:m,offset:p,length:w})}let I=0,d=u.length-1,C=-1;for(;I<=d;){const Q=Math.floor((I+d)/2),m=Ks(r,u[Q].key);if(m===0){C=Q;break}else m<0?d=Q-1:I=Q+1}if(C===-1)return[];let E=C;for(;E>0&&u[E-1].key===r;)E--;let B=C;for(;B<u.length-1&&u[B+1].key===r;)B++;return u.slice(E,B+1).map(Q=>({...Q,field:o}))}return[]}class vo extends xo{indicesP;readIndices(e={}){return this.indicesP||(this.indicesP=this._readIndices(e).catch(n=>{throw this.indicesP=void 0,n})),this.indicesP}async getView(e,n){return this.getUnzoomedView(n)}async _readIndices(e){const{extHeaderOffset:n}=await this.getHeader(e);if(n===0)return[];const A=await this.bbi.read(64,n,e),s=rt(A),r=s.getUint16(2,!0),o=j(s,4);if(r===0)return[];const i=20,a=i*r,c=await this.bbi.read(a,o,e),l=[];for(let g=0;g<r;g+=1){const f=rt(c,g*i),h=f.getInt16(0,!0),u=f.getInt16(2,!0),I=j(f,4),d=f.getInt16(16,!0);l.push({type:h,fieldcount:u,offset:I,field:d})}return l}async searchExtraIndexBlocks(e,n={}){const A=await this.readIndices(n);if(A.length===0)return[];const s=A.map(async o=>{const{offset:i,field:a}=o,c=await this.bbi.read(32,i,n),l=rt(c),g=l.getInt32(4,!0),f=l.getInt32(8,!0),h=l.getInt32(12,!0);return Uo(this.bbi,i+32,g,f,h,e,a,n)});return(await Promise.all(s)).flat()}async searchExtraIndex(e,n={}){const A=await this.searchExtraIndexBlocks(e,n);if(A.length===0)return[];const s=await this.getUnzoomedView(n),r=new Map;for(const i of A){const a=i.field??0,c=r.get(a);c?c.set(i.offset,i):r.set(a,new Map([[i.offset,i]]))}return(await Promise.all([...r].map(async([i,a])=>(await s.readFeatures([...a.values()],n)).map(l=>({...l,field:i}))))).flat().filter(i=>i.rest?Yc(i.rest,i.field-3)===e:!1)}}const Oc=["exact","case","decorated","prefix","padded","roman","organelle","accession","version"],qs=new Set(["gi","gb","ref","emb","dbj","tpg","tpe","tpd","lcl","pir","prf","sp","tr","pdb","ena","bbs"]);function es(t){let e=t.trim().split(/\s+/)[0]??"";if(e=e.replace(/[,;]+$/,""),e.includes("|")){const n=e.split("|").filter(A=>A!=="");if(n.some(A=>qs.has(A.toLowerCase()))){const A=n.filter((s,r)=>qs.has(s.toLowerCase())?!1:!(/^[0-9]+$/.test(s)&&r>0&&n[r-1].toLowerCase()==="gi"));A.length>0&&(e=A[A.length-1])}}return e}const To=/^(?:chromosome|chrom|chr)[ _.-]?/i;function Jo(t){const e=t.replace(To,"");if(e===""||e===t)return null;const n=e.toLowerCase();return/^[0-9]/.test(e)||Bn.has(n)||Qn.has(n)||Un(e)>0||/^un[_.-]/i.test(e)||/^[A-Za-z]{1,2}[0-9]/.test(e)||Yo.test(e)||Oo.test(e.replace(/\.[0-9]+$/,""))?e:null}const _c=/^(?:lg|linkage_?group|group)[ _.-]?(?=[0-9])/i,$o=/_(random|alt|fix|hap\d+|maternal|paternal)$/i,Kc=/(?:^|[_.-])([A-Z]{2}[0-9]{5,6})v([0-9]+)(?:$|[_.-])/,Yo=/^(N[CGTWZ]|AC)_([0-9]{5,})$/i,Oo=/^[A-Z]{1,6}[0-9]{5,8}$/,qc=[["mito",["m","mt","mtdna","mito","mitochondrion","mitochondria","mitochondrial","mitochondrion_genome","dmel_mitochondrion_genome","mitochondrial_genome","mitochondrion_dna","chrmt","nc_012920","j01415","nc_001224","nc_005089"]],["plastid",["c","pt","cp","chloroplast","plastid","chloroplast_genome","chrc","nc_000932"]],["2micron",["2-micron","2micron","2u","2-micron_plasmid","nc_001398"]]],Qn=new Map;for(const[t,e]of qc)for(const n of e)Qn.set(n,t);const Bn=new Set(["x","y","z","w"]),Hc=/^(XL|L|X{0,3})(IX|IV|V?I{0,3})$/i,Wc={"":0,x:10,xx:20,xxx:30,xl:40,l:50},Pc={"":0,i:1,ii:2,iii:3,iv:4,v:5,vi:6,vii:7,viii:8,ix:9};function Un(t){const e=Hc.exec(t);if(e===null)return 0;const n=Wc[e[1].toLowerCase()],A=Pc[e[2].toLowerCase()];return n===void 0||A===void 0?0:n+A}const zc=[{from:1,to:22,first:1,tail:["x","y"]},{from:67,to:85,first:1,tail:["x","y"]}];function Xc(t){for(const e of zc){if(t>=e.from&&t<=e.to)return String(e.first+(t-e.from));const n=t-e.to-1;if(n>=0&&n<e.tail.length)return e.tail[n]}return null}const IA=200;function Vc(t){return t.length<2||Bn.has(t.toLowerCase())?!1:Un(t)>0}function _o(t){const e=t.map(a=>Ko(a)),A=e.filter(a=>Vc(a)).length>=2,s=e.filter(a=>/^[0-9]+$/.test(a)&&Number(a)>=1&&Number(a)<=IA),r=s.length<IA,o=a=>e.some(c=>c.toLowerCase()===a),i=r&&s.length>=2;return{roman:A,ordinals:r,xIsTen:A&&!i&&(o("ix")||o("xi"))}}function Ko(t){const e=es(t);return(Jo(e)??e).replace($o,"")}function cn(t,e){const n=[],A=es(t);A!==t.trim()&&n.push("decorated");const s=Jo(A),r=s??A;s!==null&&n.push("prefix");const o=$o.exec(r),i=o===null?r:r.slice(0,o.index),a=o===null?"":`+${o[1].toLowerCase()}`,c=i.toLowerCase(),l=Kc.exec(r);if(l!==null)return n.push("accession"),{key:`acc:${l[1].toLowerCase()}`,via:n,version:l[2],opaque:!1};const g=/^(.*?)\.([0-9]+)$/.exec(i),f=g===null?i:g[1],h=g===null?null:g[2],u=Qn.get(c)??Qn.get(f.toLowerCase());if(u!==void 0)return u!==c&&n.push("organelle"),{key:`org:${u}`,via:n,version:h,opaque:!1};const I=Yo.exec(f);if(I!==null){n.push("accession");const E=I[1].toLowerCase()==="nc"?Xc(Number(I[2])):null;return E!==null?{key:Bn.has(E)?`sex:${E}${a}`:`num:${E}${a}`,via:n,version:h,opaque:!1}:{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1}}if(Oo.test(f))return n.push("accession"),{key:`acc:${f.toLowerCase()}${a}`,via:n,version:h,opaque:!1};if(/^[0-9]+$/.test(i)&&e.ordinals&&Number(i)<=IA)return/^0[0-9]/.test(i)&&n.push("padded"),{key:`num:${Number(i)}${a}`,via:n,version:null,opaque:!1};const d=/^([0-9]{1,2})([a-z]{1,2})$/i.exec(i);if(d!==null&&e.ordinals)return d[1].startsWith("0")&&n.push("padded"),{key:`num:${Number(d[1])}${d[2].toLowerCase()}${a}`,via:n,version:null,opaque:!1};const C=_c.exec(i);if(C!==null){const E=i.slice(C[0].length);if(/^[0-9]+$/.test(E))return/^0[0-9]/.test(E)&&n.push("padded"),{key:`lg:${Number(E)}${a}`,via:n,version:null,opaque:!1}}if(Bn.has(c)&&!(c==="x"&&e.xIsTen))return{key:`sex:${c}${a}`,via:n,version:null,opaque:!1};if(e.roman){const E=Un(i);if(E>0)return n.push("roman"),{key:`num:${E}${a}`,via:n,version:null,opaque:!1}}return{key:`raw:${c}${a}`,via:n,version:null,opaque:!0}}function Be(t){return Oc.indexOf(t)}function Zc(t,e){let n="case";for(const A of[...t.via,...e.via])Be(A)>Be(n)&&(n=A);return n}function Zn(t,e){return t===void 0||e===void 0||t<=0||e<=0?"unknown":t===e?"agree":"differ"}const Hs=new WeakMap;class St{names;context;styleCache=null;get style(){return this.styleCache??=tl(this.names,this.context),this.styleCache}exact=new Map;folded=new Map;keyed=new Map;constructor(e){this.names=e.map(n=>n.name),this.context=_o(this.names);for(const n of e){this.exact.has(n.name)||this.exact.set(n.name,n),Ws(this.folded,n.name.toLowerCase(),n);const A=cn(n.name,this.context);Ws(this.keyed,A.key,{sequence:n,canon:A})}}static of(e){return new St(e)}static ofNames(e){return new St(e.map(n=>({name:n})))}static for(e){const n=Hs.get(e);if(n!==void 0)return n;const A=typeof e[0]=="string"?St.ofNames(e):St.of(e);return Hs.set(e,A),A}has(e){return this.exact.has(e)}find(e,n={}){const{length:A}=n,s=this.exact.get(e);if(s!==void 0)return{name:s.name,asked:e,tier:"exact",lengths:Zn(A,s.length)};const r=this.folded.get(e.toLowerCase());if(r!==void 0&&r.length===1)return{name:r[0].name,asked:e,tier:"case",lengths:Zn(A,r[0].length)};const o=n.from??this.context,i=this.byKey(e,cn(e,o),A);if(i!==null)return i;if(!o.roman){const a=Ko(e).toLowerCase();if(a!=="x"&&a!=="l"&&Un(a)>0)return this.byKey(e,cn(e,{...o,roman:!0,xIsTen:!1}),A)}return null}byKey(e,n,A){const s=this.keyed.get(n.key);if(s===void 0||s.length===0)return null;const r=jc(s,A);if(r===null)return null;const o=Zc(n,r.canon),i=n.version!==null&&r.canon.version!==null&&n.version!==r.canon.version;return{name:r.sequence.name,asked:e,tier:i&&Be(o)<Be("version")?"version":o,lengths:Zn(A,r.sequence.length)}}}function jc(t,e){if(t.length===1)return t[0];if(e===void 0||e<=0)return null;const n=t.filter(A=>A.sequence.length===e);return n.length===1?n[0]:null}function Ws(t,e,n){const A=t.get(e);A===void 0?t.set(e,[n]):A.push(n)}function tl(t,e=_o(t)){if(t.length===0)return"empty";let n=0,A=0,s=0,r=0;for(const i of t){const a=cn(i,e);if(a.opaque){r++;continue}a.via.includes("accession")?s++:To.test(es(i))?n++:A++}const o=n+A+s;return o===0||r>o*4?"assembly":e.roman&&n<=A?"roman":s>n&&s>A?"accession":n>0&&A>0?"mixed":n>0?e.roman?"roman":"ucsc":e.roman?"roman":"ensembl"}function el(t,e){const n=St.of(e),A=St.of(t).context,s=[];for(const g of t){const f=n.find(g.name,{length:g.length,from:A});f!==null&&s.push({source:g,match:f})}s.sort((g,f)=>Be(g.match.tier)-Be(f.match.tier));const r=new Map,o=new Set;for(const g of s){const f=r.get(g.match.name);f===void 0?r.set(g.match.name,{source:g.source.name,tier:g.match.tier}):f.tier===g.match.tier&&o.add(g.match.name)}const i=new Map,a=[];let c=0;for(const g of s){const f=r.get(g.match.name);f===void 0||f.source!==g.source.name||o.has(g.match.name)||(i.set(g.source.name,g.match),g.match.tier!=="exact"&&c++,g.match.lengths==="differ"&&a.push(g.match))}const l=t.map(g=>g.name).filter(g=>!i.has(g));return{pairs:i,unmatched:l,contested:a,renamed:c}}function we(t,e){const n=el(t,e),A=new Map,s=t.map(r=>{const o=n.pairs.get(r.name);return o===void 0?r.name:(A.set(o.name,r.name),o.name)});for(const r of t)A.has(r.name)||A.set(r.name,r.name);return{names:s,sourceOf:A,renamed:n.renamed,contested:n.contested}}function nl(t){return t.map(e=>({name:e}))}function Kt(t,e){const n=Al(t),A=n.get(e);if(A!==void 0)return A;const s=St.for(t).find(e);return s===null?-1:n.get(s.name)??-1}const Ps=new WeakMap;function Al(t){const e=Ps.get(t);if(e!==void 0)return e;const n=new Map;return t.forEach((A,s)=>{const r=typeof A=="string"?A:A.name;n.has(r)||n.set(r,s)}),Ps.set(t,n),n}class Rt extends Error{code;detail;constructor(e,n,A={}){super(n),this.name="ViewerError",this.code=e,this.detail=A}}const jn=new Intl.NumberFormat(void 0,{maximumFractionDigits:0}),sl=new Intl.NumberFormat(void 0,{maximumFractionDigits:3}),rl=new Intl.NumberFormat(void 0,{maximumSignificantDigits:3}),zs=new Map,ol=new Intl.NumberFormat("en-US",{maximumFractionDigits:0}),G={int(t){return Number.isFinite(t)?jn.format(t):"—"},num(t){if(!Number.isFinite(t))return"—";if(Number.isInteger(t))return jn.format(t);const e=Math.abs(t);return e>=.001?sl.format(t):e>=1e-7?rl.format(t):t.toExponential(2)},fixed(t,e){if(!Number.isFinite(t))return"—";let n=zs.get(e);return n===void 0&&(n=new Intl.NumberFormat(void 0,{minimumFractionDigits:e,maximumFractionDigits:e}),zs.set(e,n)),n.format(t)},pct(t,e=1){return Number.isFinite(t)?`${(t*100).toFixed(e)}%`:"—"},pos(t){return Number.isFinite(t)?ol.format(Math.round(t)):"—"},bp(t){return Number.isFinite(t)?Math.abs(t)>=1e6?`${(t/1e6).toFixed(2)} Mb`:Math.abs(t)>=1e3?`${(t/1e3).toFixed(1)} kb`:`${jn.format(t)} bp`:"—"},bytes(t){if(!Number.isFinite(t))return"—";const e=["B","kB","MB","GB","TB"];let n=t,A=0;for(;n>=1e3&&A<e.length-1;)n/=1e3,A++;return`${A===0?n:n.toFixed(1)} ${e[A]}`}};function il(t){return!Number.isFinite(t)||t<=0?"—":t>=1e6?`${tA(t/1e6)} Mb`:t>=1e3?`${tA(t/1e3)} kb`:`${tA(t)} bp`}function tA(t){return String(Number(t.toFixed(2)))}function nt(t,e){const n=cl(t),A=ll(n,e);if(A===null)return n;throw new Rt("format",`The ${e.field} of this ${e.format} reads ${CA(t)}, ${A.reason}. `+Ie,{format:e.format,field:e.field,value:typeof t=="bigint"?t.toString():t,ceiling:e.ceiling,...e.available===void 0?{}:{available:e.available},...A.most===void 0?{}:{most:A.most}})}function ns(t,e,n){const A={format:n.format,field:n.field,offset:t,length:e,size:n.size};if(!dA(t)||!dA(e))throw new Rt("format",`The ${n.field} of this ${n.format} points at ${CA(e)} bytes from byte ${CA(t)}, which is not a place in a file. ${Ie}`,A);if(n.ceiling!==void 0&&e>n.ceiling)throw new Rt("format",`The ${n.field} of this ${n.format} is ${G.int(e)} bytes long, more than the ${G.int(n.ceiling)} any real one holds. ${Ie}`,{...A,ceiling:n.ceiling});if(t+e>n.size)throw new Rt("format",`The ${n.field} of this ${n.format} points at bytes ${G.int(t)} to ${G.int(t+e)}, past the end of a file of ${G.int(n.size)}. ${Ie}`,A)}const Xs=65536,qo=2**29;async function As(t,e){if(typeof DecompressionStream>"u")throw new Rt("unsupported",`Reading a ${e.format} needs DecompressionStream, which this runtime does not have. Every browser since 2023 has it; a very old one does not.`,{format:e.format});const n=new DecompressionStream(e.encoding),A=n.writable.getWriter(),s=n.readable.getReader(),r=[];let o=0,i=!1;const a=(async()=>{for(;;){const{done:I,value:d}=await s.read();if(I)return;if(o+=d.byteLength,o>e.maxBytes){i=!0,await s.cancel();return}r.push(d)}})(),c=(async()=>{for(let I=0;I<t.byteLength;I+=Xs){if(i)return;const d=t.subarray(I,Math.min(I+Xs,t.byteLength));await A.write(d)}i||await A.close()})(),[l,g]=await Promise.allSettled([a,c]);if(i)throw Ho(e,e.maxBytes,t.byteLength);const f=l.status==="rejected"?l.reason:g.status==="rejected"?g.reason:null;if(f!==null){const I=f instanceof Error?f.message:String(f);throw new Rt("format",`The ${e.field} of this ${e.format} does not inflate (${I.replace(/\.$/,"")}). ${Ie}`,{format:e.format,field:e.field})}if(r.length===1)return r[0];const h=new Uint8Array(o);let u=0;for(const I of r)h.set(I,u),u+=I.length;return h}function al(t,e){return Math.min(e.ceiling,Math.max(e.floor,Math.ceil(t*e.ratio)))}function Ho(t,e,n){return new Rt("format",`The ${t.field} of this ${t.format} inflates to more than ${G.bytes(e)}, past what any real one holds. ${Ie}`,{format:t.format,field:t.field,maxBytes:e,compressed:n})}const Ie="The file is truncated, corrupt, or not the format its first bytes claim.";function cl(t){return typeof t=="number"?t:t>=BigInt(Number.MIN_SAFE_INTEGER)&&t<=BigInt(Number.MAX_SAFE_INTEGER)?Number(t):Number.NaN}function dA(t){return Number.isSafeInteger(t)&&t>=0}function ll(t,e){if(!dA(t))return{reason:"which is not a count"};if(t>e.ceiling)return{reason:`more than the ${G.int(e.ceiling)} any real one declares`};if(e.available!==void 0){const n=Math.floor(Math.max(0,e.available)/Math.max(1,e.bytesPerItem??1));if(t>n){const A=Math.max(0,e.available);return{reason:`and the ${G.int(A)} byte${A===1?"":"s"} after it could hold at most ${G.int(n)}`,most:n}}}return null}function CA(t){return typeof t=="bigint"?t.toString():Number.isSafeInteger(t)?G.int(t):String(t)}const gl=65536;async function fl(t){return t.length===0?t:As(t,{format:"BGZF file",field:"member",encoding:"deflate-raw",maxBytes:gl})}const ss=12,Et=65536;function He(t){return t.length<ss||t[0]!==31||t[1]!==139||t[2]!==8||(t[3]&4)===0?!1:pe(t)!==null}function pe(t){if(t.length<ss)return null;const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint16(10,!0);let A=12;const s=Math.min(12+n,t.length);for(;A+4<=s;){const r=t[A],o=t[A+1],i=e.getUint16(A+2,!0);if(r===66&&o===67&&i===2)return e.getUint16(A+4,!0)+1;A+=4+i}return null}const hl=fl;async function Ot(t,e=Number.POSITIVE_INFINITY,n=qo){const A=[];let s=0,r=0;for(;r+ss<=t.length;){const a=r,c=pe(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const g=new DataView(t.buffer,t.byteOffset+r,c).getUint16(10,!0),f=r+12+g,h=r+c-8;if(h>f){const u=await hl(t.subarray(f,h));if(u.length>0){if(s+u.length>n)throw Ho({format:"BGZF file",field:"span read"},n,t.length);A.push(u),s+=u.length}}if(r+=c,a>=e)break}const o=new Uint8Array(s);let i=0;for(const a of A)o.set(a,i),i+=a.length;return o}function ul(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<36||t[0]!==84||t[1]!==66||t[2]!==73||t[3]!==1)throw new Error("This is not a tabix index: the magic bytes are not TBI\\1.");const n=e.getInt32(4,!0),A=e.getInt32(8,!0),s=String.fromCharCode(e.getInt32(24,!0)),r=e.getInt32(28,!0),o=e.getInt32(32,!0),i=[],a=new TextDecoder().decode(t.subarray(36,36+o));for(const g of a.split("\0"))g!==""&&i.push(g);let c=36+o;const l=new Map;for(let g=0;g<n;g++){const f=e.getInt32(c,!0);c+=4;let h=Number.POSITIVE_INFINITY,u=Number.NEGATIVE_INFINITY;for(let d=0;d<f;d++){c+=4;const C=e.getInt32(c,!0);c+=4;for(let E=0;E<C;E++){const B=Number(e.getBigUint64(c,!0)>>16n),Q=Number(e.getBigUint64(c+8,!0)>>16n);c+=16,B<h&&(h=B),Q>u&&(u=Q)}}const I=e.getInt32(c,!0);c+=4;for(let d=0;d<I;d++){const C=Number(e.getBigUint64(c,!0)>>16n);c+=8,C>0&&C<h&&(h=C)}Number.isFinite(h)&&Number.isFinite(u)&&g<i.length&&l.set(i[g],{from:h,to:u})}return{names:i,spans:l,format:A,meta:s,skip:r}}function Il(t,e,n){const A=[];for(const r of e){const o=t.spans.get(r);o!==void 0&&A.push({from:o.from,to:Math.min(n,o.to+Et),lastBlock:o.to})}A.sort((r,o)=>r.from-o.from);const s=[];for(const r of A){const o=s[s.length-1];o!==void 0&&r.from<=o.to+(1<<20)?(o.to=Math.max(o.to,r.to),o.lastBlock=Math.max(o.lastBlock,r.lastBlock)):s.push({...r})}return s}function dl(t,e){if(e.length===0)return t.names;const n=St.ofNames(t.names),A=new Set;for(const s of e){const r=n.find(s);r!==null&&A.add(r.name)}return A.size===0?t.names:[...A]}class et{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s={}){const r=Math.min(n,A),o=Math.max(r+1,Math.max(n,A));this.rows.push({contig:this.contigId(e),start:r,end:o,strand:s.strand??0,score:s.score??Number.NaN,name:s.name??"",id:s.id??"",detail:s.detail??"",exons:s.exons??null,cds:s.cds??null,bars:s.bars??null,xyz:s.xyz??null,hap:s.hap??0})}get length(){return this.rows.length}finish(e=null,n=null){const A=this.rows;A.sort((h,u)=>h.contig-u.contig||h.start-u.start||h.end-u.end||h.hap-u.hap);const s=A.length,r={contigs:this.contigs,length:s,contig:new Int32Array(s),start:new Int32Array(s),end:new Int32Array(s),strand:new Int8Array(s),score:new Float32Array(s),name:new Array(s),id:new Array(s),detail:new Array(s),exonAt:new Int32Array(s+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(s),cdsEnd:new Int32Array(s),contigAt:new Int32Array(this.contigs.length+1),maxSpan:new Int32Array(this.contigs.length)};let o=0;for(const h of A)o+=h.exons===null?0:h.exons.length>>1;r.exonStart=new Int32Array(o),r.exonEnd=new Int32Array(o);const i=e===null?0:e.labels.length,a=new Float32Array(i*s).fill(Number.NaN);let c=0;const l=n===null?null:{x:new Float32Array(s),y:new Float32Array(s),z:new Float32Array(s),hap:new Int8Array(s)};let g=0;for(let h=0;h<s;h++){const u=A[h];if(r.contig[h]=u.contig,r.start[h]=u.start,r.end[h]=u.end,r.strand[h]=u.strand,r.score[h]=u.score,r.name[h]=u.name,r.id[h]=u.id,r.detail[h]=u.detail,r.cdsStart[h]=u.cds===null?-1:u.cds[0],r.cdsEnd[h]=u.cds===null?-1:u.cds[1],r.exonAt[h]=g,u.exons!==null){const d=[];for(let C=0;C+1<u.exons.length;C+=2)d.push([u.exons[C],u.exons[C+1]]);d.sort((C,E)=>C[0]-E[0]);for(const[C,E]of d)r.exonStart[g]=C,r.exonEnd[g]=E,g++}if(i>0&&u.bars!==null&&u.bars.length===i)for(let d=0;d<i;d++){const C=u.bars[d];a[h*i+d]=C,C>c&&(c=C)}l!==null&&(l.x[h]=u.xyz===null?Number.NaN:u.xyz[0],l.y[h]=u.xyz===null?Number.NaN:u.xyz[1],l.z[h]=u.xyz===null?Number.NaN:u.xyz[2],l.hap[h]=u.hap);const I=u.end-u.start;I>r.maxSpan[u.contig]&&(r.maxSpan[u.contig]=I)}r.exonAt[s]=g;let f=0;for(let h=0;h<this.contigs.length;h++)for(r.contigAt[h]=f;f<s&&r.contig[f]===h;)f++;if(r.contigAt[this.contigs.length]=f,e!==null){const{limit:h,...u}=e;r.bars={...u,values:a,max:Number.isFinite(h)&&h>0?h:c}}return l!==null&&n!==null&&(r.model={...l,haplotypes:[...n.haplotypes],width:n.width}),r}}function Cl(t,e,n=4){const A=new Set(t),s=new Set(e),r=e.filter(i=>!A.has(i)),o=t.filter(i=>!s.has(i));return{matched:e.length-r.length,total:e.length,missing:r.slice(0,n),extra:o.slice(0,n)}}class vn{rows=[];contigIds=new Map;contigs=[];contigId(e){const n=this.contigIds.get(e);if(n!==void 0)return n;const A=this.contigs.length;return this.contigIds.set(e,A),this.contigs.push(e),A}add(e,n,A,s,r,o,i={}){this.rows.push({c1:this.contigId(e),s1:n,e1:Math.max(n+1,A),c2:this.contigId(s),s2:r,e2:Math.max(r+1,o),score:i.score??Number.NaN,name:i.name??"",detail:i.detail??""})}get length(){return this.rows.length}finish(){const e=this.rows.length,n={contigs:this.contigs,length:e,contig1:new Int32Array(e),start1:new Int32Array(e),end1:new Int32Array(e),contig2:new Int32Array(e),start2:new Int32Array(e),end2:new Int32Array(e),score:new Float32Array(e),name:new Array(e),detail:new Array(e)};for(let A=0;A<e;A++){const s=this.rows[A];n.contig1[A]=s.c1,n.start1[A]=s.s1,n.end1[A]=s.e1,n.contig2[A]=s.c2,n.start2[A]=s.s2,n.end2[A]=s.e2,n.score[A]=s.score,n.name[A]=s.name,n.detail[A]=s.detail}return n}}const be=256,Ql=["#FFFEF9","#FCF9CE","#FFF2A9","#FDE188","#FFCA67","#FAAA4B","#F78E40","#F15C34","#ED3024","#D42027","#B01F29","#7A1128","#1A0A10"],Bl=["#FFFFFF","#FFF5F0","#FEE0D2","#FCBBA1","#FC9272","#FB6A4A","#EF3B2C","#CB181D","#A50F15","#67000D"],El=["#053061","#2166AC","#4393C3","#92C5DE","#D1E5F0","#F7F7F7","#FDDBC7","#F4A582","#D6604D","#B2182B","#67001F"],ml=["#1659b1","#487BA8","#819EC8","#D1E6F1","#FFFFFF","#FAC1C1","#F1606C","#EE222A"],wl=[0,.125,.25,.375,.5,2/3,5/6,1],pl=["#00004D","#0000FF","#FFFFFF","#FF0000","#800000"];function De(t,e,n){const A=t.map(i=>[Number.parseInt(i.slice(1,3),16),Number.parseInt(i.slice(3,5),16),Number.parseInt(i.slice(5,7),16)]),s=A.length-1,r=n??A.map((i,a)=>a/s),o=new Array(e*3);for(let i=0;i<e;i++){const a=i/(e-1);let c=0;for(;c<s-1&&a>=r[c+1];)c++;const l=r[c+1]-r[c],g=l>0?(a-r[c])/l:0;for(let f=0;f<3;f++)o[i*3+f]=Math.round(A[c][f]+(A[c+1][f]-A[c][f])*g)}return o}De(Ql,be),De(Bl,be),De(El,be),De(ml,be,wl),De(pl,be);const yl="RdBu_r";(()=>{const t=new Int8Array(256).fill(-1),e=(n,A)=>{for(const s of n)t[s.charCodeAt(0)]=A,t[s.toLowerCase().charCodeAt(0)]=A};return e("TU",0),e("C",1),e("A",2),e("G",3),t})();const Vs=[66,65,77,1],ln=32,At={PAIRED:1,PROPER_PAIR:2,UNMAPPED:4,MATE_UNMAPPED:8,REVERSE:16,FIRST_IN_PAIR:64,SECOND_IN_PAIR:128,SECONDARY:256,QC_FAIL:512,DUPLICATE:1024,SUPPLEMENTARY:2048};function rs(t,e,n,A){const s={c:1,C:1,s:2,S:2,i:4,I:4,f:4,A:1};if(n==="Z"||n==="H"){let o=e;for(;o<A&&t[o]!==0;)o++;return o+1}if(n==="B"){const o=String.fromCharCode(t[e]),i=new DataView(t.buffer,t.byteOffset,t.byteLength).getInt32(e+1,!0),a=s[o];return a===void 0||i<0?-1:e+5+i*a}const r=s[n];return r===void 0?-1:e+r}const Wo=At.UNMAPPED|At.SECONDARY|At.SUPPLEMENTARY|At.QC_FAIL;function Po(t){return t.length<Vs.length?!1:Vs.every((e,n)=>t[n]===e)}function Nl(t){if(!Po(t))throw new Error("This is not a BAM: the first four bytes are not BAM\\1.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength);if(t.length<8)return null;const n=e.getInt32(4,!0);if(n<0)throw new Error("This BAM header declares a negative length.");let A=8+n;if(t.length<A+4)return null;const s=new TextDecoder().decode(t.subarray(8,A)),r=e.getInt32(A,!0);if(A+=4,r<0)throw new Error("This BAM header declares a negative reference count.");const o=[];for(let i=0;i<r;i++){if(t.length<A+4)return null;const a=e.getInt32(A,!0);if(A+=4,a<0)throw new Error("This BAM header declares a negative name length.");if(t.length<A+a+4)return null;const c=new TextDecoder().decode(t.subarray(A,A+a-1));A+=a;const l=e.getInt32(A,!0);A+=4,o.push({name:c,length:l})}return{text:s,refs:o,sortOrder:kl(s),recordsFrom:A}}function kl(t){for(const e of t.split(`
2
+ `))if(e.startsWith("@HD"))for(const n of e.split(" ")){if(!n.startsWith("SO:"))continue;const A=n.slice(3).trim();return A==="coordinate"||A==="queryname"||A==="unsorted"?A:"unknown"}return"unknown"}const bl=[!0,!1,!0,!0,!1,!1,!1,!0,!0],Dl=[!0,!0,!1,!1,!0,!1,!1,!0,!0];function mt(t){return bl[t]===!0}function Yt(t){return Dl[t]===!0}function zo(t,e,n){let A=0;for(let s=0;s<n;s++){const r=t.getUint32(e+s*4,!0);mt(r&15)&&(A+=r>>>4)}return A}function En(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s={at:0,bytes:0,refId:-1,pos:-1,end:-1,mapq:0,flag:0,nameBytes:0,cigarOps:0,cigarAt:0,seqLength:0,seqAt:0,nextRefId:-1,nextPos:-1,tlen:0};let r=e;for(;r+4<=t.length;){const o=A.getInt32(r,!0);if(o<=0)break;const i=r+4;if(i+o>t.length||o<ln)break;const a=A.getUint8(i+8),c=A.getUint16(i+12,!0),l=i+ln+a,g=A.getInt32(i+16,!0),f=A.getInt32(i+4,!0),h=ln+a+c*4+Math.ceil(g/2)+g;if(g<0||h>o)break;if(s.at=i,s.bytes=o+4,s.refId=A.getInt32(i,!0),s.pos=f,s.mapq=A.getUint8(i+9),s.flag=A.getUint16(i+14,!0),s.nameBytes=a,s.cigarOps=c,s.cigarAt=l,s.seqLength=g,s.seqAt=l+c*4,s.nextRefId=A.getInt32(i+20,!0),s.nextPos=A.getInt32(i+24,!0),s.tlen=A.getInt32(i+28,!0),s.end=f<0?f:f+zo(A,l,c),n(s)===!1)return;r+=4+o}}function Ml(t,e){const n=e.at+ln;return new TextDecoder().decode(t.subarray(n,n+e.nameBytes-1))}const os="=ACMGRSVTWYHKDBN";function Fl(t,e,n){let A="";for(let s=0;s<n;s++){const r=t[e+(s>>1)];A+=os[s%2===0?r>>4:r&15]}return A}function Sl(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s={};let r=e;for(;r+3<=n;){const o=String.fromCharCode(t[r],t[r+1]),i=String.fromCharCode(t[r+2]);if(r+=3,i==="B"){const c=String.fromCharCode(t[r]),l=A.getInt32(r+1,!0);r+=5;const g=Zs[c];if(g===void 0||l<0||r+l*g>n)return s;const f=[];for(let h=0;h<l;h++)f.push(js(A,r+h*g,c));r+=l*g,s[o]=f;continue}if(i==="Z"||i==="H"){let c=r;for(;c<n&&t[c]!==0;)c++;s[o]=new TextDecoder().decode(t.subarray(r,c)),r=c+1;continue}if(i==="A"){s[o]=String.fromCharCode(t[r]),r+=1;continue}const a=Zs[i];if(a===void 0)return s;s[o]=js(A,r,i),r+=a}return s}const Zs={c:1,C:1,s:2,S:2,i:4,I:4,f:4};function js(t,e,n){switch(n){case"c":return t.getInt8(e);case"C":return t.getUint8(e);case"s":return t.getInt16(e,!0);case"S":return t.getUint16(e,!0);case"i":return t.getInt32(e,!0);case"I":return t.getUint32(e,!0);case"f":return t.getFloat32(e,!0);default:return 0}}function We(t,e){if(e.cigarOps!==2)return null;const n=new DataView(t.buffer,t.byteOffset,t.byteLength),A=n.getUint32(e.cigarAt,!0),s=n.getUint32(e.cigarAt+4,!0);if((A&15)!==4||A>>>4!==e.seqLength||(s&15)!==3)return null;const r=e.seqAt+(e.seqLength+1>>1),i=Sl(t,r+e.seqLength,e.at+e.bytes-4).CG;return Array.isArray(i)?Uint32Array.from(i):null}const Rl=/^([ACGTUN])([-+])([A-Za-z]+|\d+)([.?]?)((?:,\d+)*),?$/;function Ll(t){const e=[];for(const n of t.split(";")){const A=n.trim();if(A==="")continue;const s=Rl.exec(A);if(s===null)return null;const[,r,o,i,a,c]=s,l=/^\d+$/.test(i)?[i]:[...i],g=c===""?[]:c.slice(1).split(",").map(Number);e.push({base:r==="U"?"T":r,strand:o,codes:l,mode:a==="?"?"explicit":"implicit",skips:g})}return e}const xl={A:"T",C:"G",G:"C",T:"A",U:"A",N:"N",M:"K",K:"M",R:"Y",Y:"R",S:"S",W:"W",B:"V",V:"B",D:"H",H:"D"};function Gl(t){let e="";for(let n=t.length-1;n>=0;n--){const A=t[n].toUpperCase();e+=xl[A]??"N"}return e}function Ul(t,e,n,A){const s=Ll(n);if(s===null||t.length===0)return[];const r=e?Gl(t):t.toUpperCase(),o=r.length,i=l=>e?o-1-l:l,a=[];let c=0;for(const l of s){const g=l.skips.length*l.codes.length;if(A!==null&&c+g>A.length)return[];const f=u=>l.base==="N"||u===l.base;let h=0;for(let u=0;u<l.skips.length;u++){let I=l.skips[u];for(;h<o;){if(f(r[h])){if(I===0)break;if(l.mode==="implicit")for(const d of l.codes)a.push({query:i(h),code:d,prob:0,implicit:!0});I--}h++}if(h>=o)return[];for(let d=0;d<l.codes.length;d++){const C=A===null?255:A[c+u*l.codes.length+d];a.push({query:i(h),code:l.codes[d],prob:C,implicit:!1})}h++}if(l.mode==="implicit"){for(;h<o;h++)if(f(r[h]))for(const u of l.codes)a.push({query:i(h),code:u,prob:0,implicit:!0})}c+=g}return a.sort((l,g)=>l.query-g.query),a}function vl(t,e,n){const A=new Int32Array(n).fill(-1);let s=e,r=0;for(let o=0;o<t.length;o++){const i=t[o]&15,a=t[o]>>>4,c=mt(i),l=Yt(i);if(c&&l)for(let g=0;g<a&&r+g<n;g++)A[r+g]=s+g;c&&(s+=a),l&&(r+=a)}return A}function Tl(t,e,n,A){if(t.length===0)return[];const s=vl(e,n,A),r=[];for(const o of t){const i=s[o.query];i===void 0||i<0||r.push({pos:i,code:o.code,prob:o.prob,implicit:o.implicit})}return r.sort((o,i)=>o.pos-i.pos),r}function Jl(t,e){const n={mm:null,ml:null,mn:null},A=new DataView(t.buffer,t.byteOffset,t.byteLength);let s=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const r=e.at+e.bytes-4;for(;s+3<=r;){const o=t[s],i=t[s+1],a=String.fromCharCode(t[s+2]);if(s+=3,o===77)if((i===77||i===109)&&a==="Z"){let c=s;for(;c<r&&t[c]!==0;)c++;n.mm=new TextDecoder().decode(t.subarray(s,c))}else if((i===76||i===108)&&a==="B"&&t[s]===67){const c=A.getInt32(s+1,!0);c>=0&&s+5+c<=r&&(n.ml=t.slice(s+5,s+5+c))}else i===78&&"cCsSiI".includes(a)&&(n.mn=$l(A,s,a));if(s=rs(t,s,a,r),s<0)break}return n}function $l(t,e,n){switch(n){case"c":return t.getInt8(e);case"C":return t.getUint8(e);case"s":return t.getInt16(e,!0);case"S":return t.getUint16(e,!0);case"i":return t.getInt32(e,!0);default:return t.getUint32(e,!0)}}function Xo(t,e,n=null){if(e.seqLength<=0)return[];const A=Jl(t,e);if(A.mm===null||A.mm==="")return[];if(A.mn!==null&&A.mn!==e.seqLength)return[];const s=Fl(t,e.seqAt,e.seqLength),r=Ul(s,(e.flag&16)!==0,A.mm,A.ml);return r.length===0?[]:Tl(r,n??Yl(t,e),e.pos,e.seqLength)}function Yl(t,e){const n=We(t,e);if(n!==null)return n;const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=new Uint32Array(e.cigarOps);for(let r=0;r<e.cigarOps;r++)s[r]=A.getUint32(e.cigarAt+r*4,!0);return s}function Ol(t){return(t+.5)/256}function _l(t,e){const n=Ol(t);return n>=e?1:n<=1-e?0:-1}const Kl={m:"5mC",h:"5hmC",f:"5fC",c:"5caC",C:"any C mod",g:"5hmU",e:"5fU",b:"5caU",T:"any T mod",U:"any U mod",a:"6mA",A:"any A mod",o:"8oxoG",G:"any G mod",n:"Xao",N:"any mod",21839:"4mC",17802:"pseU",17596:"inosine",27551:"5mC",76792:"5hmC",28871:"6mA"};function ql(t){return Kl[t]??(/^\d+$/.test(t)?`ChEBI:${t}`:t)}const ct=" · ";function Vo(t){let e=0,n=0;const A=t.length;for(;n<A&&e<Hl;){let s=t.indexOf(`
3
+ `,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o==="")continue;if(o.startsWith("##")){if(/^##fileformat=VCF/i.test(o))return!0;continue}if(o.startsWith("#")){if(/^#CHROM\s+POS\s+ID\s+REF\s+ALT/i.test(o))return!0;continue}const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(!Wl(i))return!1;e++}return e>=1}const Hl=4;function Zo(t){return t.length<8||!/^\d+$/.test(t[1])?!1:jo(t[3])&&zl(t[4])}function Wl(t){return Zo(t)&&Pl(t[5])}function Pl(t){return t===void 0?!1:t==="."?!0:t!==""&&Number.isFinite(Number(t))}function jo(t){return t!==void 0&&/^[ACGTNacgtnRYKMSWBDHVryksmwbdhv]+$/.test(t)}function zl(t){return t===void 0||t===""?!1:t.split(",").every(e=>e==="."||e==="*"||jo(e)||/^<[^<>]+>$/.test(e)||/[[\]]/.test(e)||/^\.[ACGTNacgtn]+$/.test(e)||/^[ACGTNacgtn]+\.$/.test(e))}function Xl(t,e){const n=e.split(",").filter(s=>s!==""&&s!=="."&&s!=="*");if(n.length===0)return"snv";let A=null;for(const s of n){const r=/^<[^<>]+>$/.test(s)||/[[\]]/.test(s)?"structural":s.length===t.length?"snv":s.length>t.length?"insertion":"deletion";if(A===null)A=r;else if(A!==r)return"mixed"}return A??"snv"}function de(t,e){if(!(t===""||t===".")){for(const n of t.split(";"))if(n.startsWith(e)){if(n.length===e.length)return"";if(n.charCodeAt(e.length)===61)return n.slice(e.length+1)}}}function mn(t){if(t===void 0||t===""||t===".")return;const e=Number(t);return Number.isFinite(e)?e:void 0}function Vl(t,e,n,A){const s=t+Math.max(1,e.length);if(!/<[^<>]+>/.test(n))return s;const r=mn(de(A,"END"));if(r!==void 0&&r>t)return r;if(Zl(n,A))return s;const o=jl(A);return o>0?t+o+1:s}function Zl(t,e){return/<INS(:|>)/i.test(t)?!0:/^INS(:|$)/i.test(de(e,"SVTYPE")??"")}function jl(t){const e=de(t,"SVLEN");if(e===void 0||e==="")return 0;let n=0;for(const A of e.split(",")){const s=mn(A);s!==void 0&&Math.abs(s)>n&&(n=Math.abs(s))}return n}function ti(t){const e=new et;let n=0;if(is(t,s=>{if(s.startsWith("##"))return;if(s.startsWith("#")){const I=QA(s);/^#CHROM$/i.test(I[0]??"")&&Math.max(0,I.length-9);return}const r=QA(s);if(!Zo(r)){n++;return}const[o,i,a,c,l,g,f,h]=r,u=Math.max(0,Number(i)-1);e.add(o,u,Vl(u,c,l,h??""),{...a===void 0||a==="."||a===""?{}:{name:a,id:a},...mn(g)===void 0?{}:{score:mn(g)},detail:eg(c,l,g,f,h??"")})}),e.length===0&&n>0)throw new Error(`No usable rows: all ${n} data lines failed the "contig, position, ID, REF, ALT" test a VCF record begins with.`);return e.finish()}function tg(t){let e=0;return is(t,n=>{if(!n.startsWith("#"))return!1;if(n.startsWith("##"))return;const A=QA(n);return/^#CHROM$/i.test(A[0]??"")&&(e=Math.max(0,A.length-9)),!1}),e}function eg(t,e,n,A,s){const r=[`${t}>${e}`,`type ${Xl(t,e)}`];n!==void 0&&n!=="."&&n!==""&&r.push(`QUAL ${n}`),A!==void 0&&A!=="."&&A!==""&&r.push(`filter ${A}`);const o=de(s,"AF");o!==void 0&&o!==""&&r.push(`AF ${o}`);const i=de(s,"DP");i!==void 0&&i!==""&&r.push(`DP ${i}`);const a=de(s,"SVTYPE");return a!==void 0&&a!==""&&r.push(`SVTYPE ${a}`),r.join(ct)}function is(t,e){let n=0;const A=t.length;for(;n<A;){let s=t.indexOf(`
4
+ `,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o!==""&&e(o)===!1)return}}function QA(t){return t.includes(" ")?t.split(" "):t.trim().split(/\s+/)}function ng(t){const e=[];return is(t,n=>{if(!n.startsWith("#"))return!1;if(!n.startsWith("##contig=<"))return;const A=/[<,]ID=([^,>]+)/.exec(n),s=/[<,]length=(\d+)/.exec(n);A===null||s===null||e.push({name:A[1],length:Number(s[1])})}),e}async function as(t,e=qo){if(!(t.length>2&&t[0]===31&&t[1]===139))return t;if(typeof DecompressionStream>"u")throw new Error("This file is gzipped and this browser has no DecompressionStream to un-gzip it with. Decompress it and drop the plain text file.");return He(t)?Ot(t,Number.POSITIVE_INFINITY,e):As(t,{format:"file",field:"gzip stream",encoding:"gzip",maxBytes:e})}function wt(t,e){let n=0,A=0;const s=t.length;for(;n<s;){let r=t.indexOf(`
5
+ `,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);n=r+1,A++,!(i===""||i.charCodeAt(0)===35)&&(i.startsWith("track ")||i.startsWith("browser ")||e(i.includes(" ")?i.split(" "):i.trim().split(/\s+/),A))}}function Tn(t){let e=null;return wt(t,n=>{e??=n}),e}function S(t){return t!==void 0&&/^[+-]?\d+$/.test(t)}function Wt(t){return t!==void 0&&t!==""&&Number.isFinite(Number(t))}function tr(t){return S(t)&&Number(t)>=0}function ei(t,e=""){const n=cs(t);if(n!==null){const s=n.map(r=>r.trim().toLowerCase());return s.includes("chrom2")||s.includes("chr2")||s.includes("start2")?"bedpe":"bed"}const A=Tn(t);return A===null?/\.(gtf|gff3?)(\.b?gz)?$/i.test(e)?"gtf":/\.(bedpe|pairs)(\.b?gz)?$/i.test(e)?"bedpe":"bed":S(A[1])&&S(A[2])?A.length>=6&&!S(A[3])&&S(A[4])&&S(A[5])?"bedpe":"bed":A.length>=8&&S(A[3])&&S(A[4])?"gtf":"bed"}function cs(t){const e=Tn(t);return e===null||e.length<3||S(e[1])||S(e[3])?null:e}function vt(t,e){const n=t.map(A=>A.trim().toLowerCase());for(const A of e){const s=n.indexOf(A);if(s>=0)return s}return-1}function ls(t,e=""){const n=new et,A=cs(t),s=Ag(t,e);let r=0,o=!0;if(wt(t,i=>{if(o&&A!==null){o=!1;return}if(o=!1,i.length<3||!S(i[1])||!S(i[2])){r++;return}const a=i[0],c=Number(i[1]),l=Number(i[2]),g=i[3]!==void 0&&i[3]!=="."?i[3]:"",f=ni(i[5]),h=BA(s===null?i[4]:i[Ai(s)]),u=sg(i,c,l),I=rg(i,s);n.add(a,c,l,{strand:f,score:h,name:g,detail:og(i,s),...u===null?{}:{exons:u},...I===null?{}:{cds:I}})}),n.length===0&&r>0)throw new Error(`No usable rows: all ${r} lines failed the "contig, start, end" test that every BED-like format begins with.`);return n.finish()}function Ag(t,e){if(/\.narrowpeak(\.b?gz)?$/i.test(e))return"narrow";if(/\.gappedpeak(\.b?gz)?$/i.test(e))return"gapped";if(/\.broadpeak(\.b?gz)?$/i.test(e))return"broad";const n=Tn(t);return n===null?null:n.length===10&&Wt(n[6])&&Wt(n[7])&&Wt(n[8])?S(n[9])?"narrow":null:n.length===15&&Wt(n[12])&&Wt(n[13])&&Wt(n[14])?"gapped":n.length!==9||n[8]!==void 0&&n[8].includes(",")?null:[n[6],n[7],n[8]].some(s=>s!==void 0&&Wt(s)&&!S(s))?"broad":null}function ni(t){return t==="+"?1:t==="-"?-1:0}function BA(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}function Ai(t){return t==="gapped"?12:6}function sg(t,e,n){if(t.length<12)return null;const A=(t[10]??"").split(",").filter(i=>i!==""),s=(t[11]??"").split(",").filter(i=>i!=="");if(A.length===0||A.length!==s.length||!S(t[9])||Number(t[9])!==A.length||!A.every(tr)||!s.every(tr))return null;const r=A.length-1;if(Number(s[0])!==0||e+Number(s[r])+Number(A[r])!==n)return null;const o=[];for(let i=0;i<A.length;i++){const a=e+Number(s[i]);o.push(a,a+Number(A[i]))}return o}function rg(t,e){if(e==="narrow"||e==="broad"||t.length<8||!S(t[6])||!S(t[7]))return null;const n=Number(t[6]),A=Number(t[7]);return A>n?[n,A]:null}function og(t,e){if(e===null){const s=t[4];return s===void 0||s===""||s==="."?"":`score ${s}`}const n=Ai(e),A=[`signal ${t[n]??"—"}`,`-log10 p ${t[n+1]??"—"}`,`-log10 q ${t[n+2]??"—"}`];return e==="narrow"&&t[9]!==void 0&&t[9]!=="-1"&&A.push(`summit +${t[9]}`),A.join(ct)}function si(t){const e=new Map,n=new Map,A=new Map,s=[],r=[],o=Cg(t);wt(t,l=>{if(l.length<8||!S(l[3])||!S(l[4]))return;const g=l[0],f=l[1]??"",h=(l[2]??"").toLowerCase(),u=Number(l[3])-1,I=Number(l[4]),d=ni(l[6]),C=Qg(l[8]??"",o),E=Ig(h,C,o);if(E==="landmark")return;const B=gg(C,E),Q=ri(C,cg),m=C.get("gene_biotype")??C.get("gene_type")??"",p=C.get("product")??"";if(E==="gene"){for(const N of[B,C.get("id")??""])N!==""&&(Q!==""&&n.set(N,Q),m!==""&&A.set(N,m));s.push({contig:g,start:u,end:I,strand:d,geneId:B,geneName:Q,biotype:m,source:f,product:p,exons:[],pieces:[],cdsFrom:-1,cdsTo:-1});return}const w=ug(C,E);if(w===null&&E!=="standalone")return;let y=w===null?void 0:e.get(w);y===void 0&&(y={contig:g,start:u,end:I,strand:d,geneId:B,geneName:Q,biotype:m,source:f,product:p,exons:[],pieces:[],cdsFrom:-1,cdsTo:-1},w===null?r.push(y):e.set(w,y)),E==="transcript"?(y.start=u,y.end=I):(u<y.start&&(y.start=u),I>y.end&&(y.end=I)),y.geneId===""&&(y.geneId=B),y.geneName===""&&(y.geneName=Q),y.biotype===""&&(y.biotype=m),y.product===""&&(y.product=p),h==="exon"&&y.exons.push(u,I),(h==="cds"||h==="stop_codon")&&((y.cdsFrom<0||u<y.cdsFrom)&&(y.cdsFrom=u),I>y.cdsTo&&(y.cdsTo=I)),(h==="cds"||h==="stop_codon"||ig.test(h))&&y.pieces.push(u,I)});const i=[...e.values(),...r],a=i.length>0?i:s;if(a.length===0)throw new Error("No features found. Every row either described the sequence itself rather than something on it, or named a parent that the file never defines — on a GTF, that means no row carried a `transcript_id`.");const c=new et;for(const l of a){if(l.exons.length===0){const d=ag(l.pieces);d.length>=4&&(l.exons=d)}const g=l.geneId===""?"":n.get(l.geneId)??"",f=g!==""?g:l.geneName,h=f!==""?f:l.geneId,u=l.biotype!==""?l.biotype:A.get(l.geneId)??"",I=[u===""?"":`biotype ${u}`,l.product===""?"":`product ${l.product}`,l.source===""?"":`source ${l.source}`,l.exons.length>0?`${l.exons.length>>1} exons`:""].filter(d=>d!=="").join(ct);c.add(l.contig,l.start,l.end,{strand:l.strand,name:h,id:l.geneId,detail:I,...l.exons.length>0?{exons:l.exons}:{},...l.cdsFrom>=0&&l.cdsTo>l.cdsFrom?{cds:[l.cdsFrom,l.cdsTo]}:{}})}return c.finish()}const ig=/^(five_prime_|three_prime_|5'|3')?utr$/;function ag(t){const e=[];for(let A=0;A+1<t.length;A+=2)e.push([t[A],t[A+1]]);e.sort((A,s)=>A[0]-s[0]||A[1]-s[1]);const n=[];for(const[A,s]of e){const r=n.length-1;r>0&&A<=n[r]?n[r]=Math.max(n[r],s):n.push(A,s)}return n}const cg=["gene_name","genename","gene_symbol","symbol","gene","name"],lg=["gene_id","geneid","locus_tag"];function ri(t,e){for(const n of e){const A=t.get(n);if(A!==void 0&&A!=="")return A}return""}function gg(t,e){const n=ri(t,lg);if(n!=="")return n;if(e==="gene"||e==="standalone")return t.get("id")??"";if(e!=="transcript")return"";const A=t.get("parent")??"";return A===""?"":A.split(",")[0]}function fg(t){return t.endsWith("gene")}function hg(t){return t==="transcript"||t.endsWith("_transcript")||t.endsWith("rna")}function ug(t,e){const n=t.get("transcript_id");if(n!==void 0&&n!=="")return n;if(e==="part"){const s=t.get("parent");return s===void 0||s===""?null:s.split(",")[0]}const A=t.get("id");return A===void 0||A===""?null:A}function Ig(t,e,n){return dg.has(t)?"landmark":fg(t)?"gene":hg(t)?"transcript":er(e,"transcript_id")||!n||er(e,"parent")?"part":"standalone"}const dg=new Set(["region","source","chromosome","contig","scaffold","supercontig"]);function er(t,e){const n=t.get(e);return n!==void 0&&n!==""}function Cg(t){const n=Tn(t)?.[8];if(n===void 0)return!1;const A=n.indexOf("="),s=n.indexOf('"');return A>=0&&(s<0||A<s)}function Qg(t,e){const n=new Map;for(const A of t.split(";")){const s=A.trim();if(s==="")continue;if(e){const i=s.indexOf("=");if(i<0)continue;n.set(s.slice(0,i).toLowerCase(),Bg(s.slice(i+1)));continue}const r=s.indexOf(" ");if(r<0)continue;const o=s.slice(r+1).trim();n.set(s.slice(0,r).toLowerCase(),o.startsWith('"')&&o.endsWith('"')?o.slice(1,-1):o)}return n}function Bg(t){if(!t.includes("%"))return t;try{return decodeURIComponent(t)}catch{return t}}function oi(t){const e=cs(t),n=new vn,A=e===null?{c1:0,s1:1,e1:2,c2:3,s2:4,e2:5,name:6,score:7}:{c1:vt(e,["chrom1","chr1","chrom_1"]),s1:vt(e,["start1","x1","start_1"]),e1:vt(e,["end1","x2","end_1"]),c2:vt(e,["chrom2","chr2","chrom_2"]),s2:vt(e,["start2","y1","start_2"]),e2:vt(e,["end2","y2","end_2"]),name:vt(e,["name","id","label"]),score:vt(e,["score","value","obs/exp","count"])};if(A.c1<0||A.s1<0||A.e1<0||A.c2<0||A.s2<0||A.e2<0)throw new Error("This looks like a paired file but its header does not name all six coordinate columns. Expected chrom1, start1, end1, chrom2, start2 and end2.");const s=e===null?[]:e.map((i,a)=>({name:i.trim(),index:a})).filter(i=>i.name!==""&&![A.c1,A.s1,A.e1,A.c2,A.s2,A.e2,A.name].includes(i.index));let r=!0,o=0;if(wt(t,i=>{if(r&&e!==null){r=!1;return}if(r=!1,!S(i[A.s1])||!S(i[A.e1])){o++;return}if(!S(i[A.s2])||!S(i[A.e2])){o++;return}const a=s.map(c=>{const l=i[c.index];return l===void 0||l===""?"":`${c.name} ${l}`}).filter(c=>c!=="").join(" · ");n.add(i[A.c1],Number(i[A.s1]),Number(i[A.e1]),i[A.c2],Number(i[A.s2]),Number(i[A.e2]),{score:A.score<0?Number.NaN:BA(i[A.score]),name:A.name<0?"":i[A.name]??"",detail:a})}),n.length===0)throw new Error(o>0?`No usable rows: all ${o} lines were missing one of the six coordinates.`:"No rows found.");return n.finish()}const Eg=2,mg="top",wg="total",pg=4;function ii(t,e=""){const n=/\.(bigbarchart|barchart)(\.b?gz)?$/i.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<pg;){let o=t.indexOf(`
6
+ `,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!yg(c,n))return!1;A++}return A>0}function yg(t,e){return t.length<9||!S(t[1])||!S(t[2])||!e&&S(t[6])?!1:ai(t)>0}function ai(t){const e=Number(t[7]);return!S(t[7])||e<Eg?0:ci(t[8]??"").length===e?e:0}function ci(t){const e=t.trim();if(e==="")return[];const n=e.split(",");n.length>0&&n[n.length-1]===""&&n.pop();const A=[];for(const s of n){const r=Number(s);if(s.trim()===""||!Number.isFinite(r))return[];A.push(r)}return A}function li(t,e=""){const n=Lg(t),A=new et,s=gi(n.barchartbars);let r=s.length,o=0,i=0;if(wt(t,a=>{if(a.length<3||!S(a[1])||!S(a[2])){o++;return}const c=ai(a);r===0&&c>0&&(r=c);const l=c===r&&c>0?ci(a[8]??""):null;l===null&&i++;const g=Number(a[1]),f=Number(a[2]),h=nr(a[3]),u=nr(a[6]);A.add(a[0],g,f,{strand:Fg(a[5]),score:Sg(a[4]),name:u===""?h:u,id:h,detail:Dg(l,s),...l===null?{}:{bars:l}})}),A.length===0&&o>0)throw new Error(`No usable rows: all ${o} lines failed the "contig, start, end" test that every BED-like format begins with.`);if(r===0)throw new Error(`No row of ${e===""?"this file":e} carries a category count and a matching list of values, which is the whole of what makes a barChart one.`);return A.finish(Ng(n,s,r,i))}function Ng(t,e,n,A){return{labels:e.length===n?e:kg(n),named:e.length===n,colours:bg(gi(t.barchartcolors),n),unit:t.barchartunit??"",label:t.barchartlabel??"",metric:t.barchartmetric??"",limit:Number(t.maxlimit??Number.NaN),unplaced:A}}function kg(t){const e=[];for(let n=0;n<t;n++)e.push(String(n+1));return e}function bg(t,e){return t.length===e?t:[]}function Dg(t,e){if(t===null||t.length===0)return"";let n=0,A=0;for(let r=0;r<t.length;r++)n+=t[r],t[r]>t[A]&&(A=r);const s=[`${wg} ${Mg(n)}`];return e.length===t.length&&s.unshift(`${mg} ${e[A]}`),s.join(ct)}function Mg(t){return Number.isInteger(t)?String(t):t.toFixed(2)}function nr(t){return t===void 0||t==="."?"":t}function Fg(t){return t==="+"?1:t==="-"?-1:0}function Sg(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}const Rg=100;function Lg(t){const e={};let n=0,A=0;const s=t.length;for(;n<s&&A<Rg;){let r=t.indexOf(`
7
+ `,n);r<0&&(r=s);let o=r;o>n&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(n,o);if(n=r+1,A++,!(i===""||i.charCodeAt(0)===35)){if(!i.startsWith("track ")){if(!i.startsWith("browser "))break;continue}for(const[,a,c,l]of i.matchAll(/(\w+)=(?:"([^"]*)"|(\S+))/g))e[a.toLowerCase()]=c??l??"";break}}return e}function gi(t){if(t===void 0)return[];const e=t.trim();return e===""?[]:e.split(/[\s,]+/)}function xg(t){return/\bexpCount\b/.test(t)&&/\bexpScores\b/.test(t)}function Gg(t){const e=t.bars,n=`${t.length.toLocaleString()} feature${t.length===1?"":"s"}`;if(e===void 0)return n;const A=e.label===""?"categories":e.label.toLowerCase(),s=[n,`${e.labels.length} ${A}`];return e.unplaced>0&&s.push(`${e.unplaced.toLocaleString()} with no chart`),s.join(" · ")}const gs="haplotype";function fi(t){const e=t.split(/[\\/]/).pop()??t,n=e.split(/[?#]/)[0]??e;return/\.(g3d|3dg)(\.txt)?(\.gz)?$/i.test(n)?"g3d":/\.bed3d(\.txt)?(\.gz)?$/i.test(n)?"bed3d":/\.pdb(\.gz)?$/i.test(n)?"pdb":null}function Ug(t){return fi(t)==="pdb"}const eA="shared",Ar="maternal",sr="paternal",vg=200,Tg=1/3;function EA(t,e=""){return ui(t,e,"g3d")}function hi(t,e=""){return ui(t,e,"bed3d")}function ui(t,e,n){if(fi(e)===n)return!0;const A=[];let s=!1,r=0;const o=t.length;for(;r<o&&A.length<vg;){let i=t.indexOf(`
8
+ `,r);i<0&&(i=o);let a=i;a>r&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(r,a);if(r=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=Ii(l,n);if(g===null)return!1;g!==fs&&((!Number.isInteger(g.xyz[0])||!Number.isInteger(g.xyz[1])||!Number.isInteger(g.xyz[2])||g.xyz[0]<0||g.xyz[1]<0||g.xyz[2]<0)&&(s=!0),A.push(g))}return A.length===0||!s?!1:Yg(A)}const fs="unplaced",Jg=/^(|[+-]?nan|na|n\/a|none|null|\.|[+-]?inf(inity)?)$/i;function Ii(t,e){const n=e==="g3d"?2:3;if(t.length<n+3||t.length>n+4||!S(t[1]))return null;let A=null;if(e==="bed3d"&&(!S(t[2])||(A=Number(t[2]),A<=Number(t[1]))))return null;const s=[t[n],t[n+1],t[n+2]];if(s.some(l=>l!==void 0&&Jg.test(l)))return fs;const[r,o,i]=s.map(Number);if(!Number.isFinite(r)||!Number.isFinite(o)||!Number.isFinite(i))return null;let a=t[0],c=t[n+3];if(c!==void 0){if(!/^[A-Za-z][\w.-]*$/.test(c))return null}else{const l=/^(.+)\(([\w.-]+)\)$/.exec(a);l!==null&&(a=l[1],c=l[2])}return a===""?null:{contig:a,start:Number(t[1]),end:A,xyz:[r,o,i],hap:$g(c)}}function $g(t){if(t===void 0||t==="")return eA;const e=t.toLowerCase();return e==="m"||e==="mat"||e===Ar?Ar:e==="p"||e==="pat"||e===sr?sr:e==="s"||e===eA?eA:t}function Yg(t){const e=new Map;for(const i of t){const a=`${i.contig}\0${i.hap}`,c=e.get(a);c===void 0?e.set(a,[i]):c.push(i)}let n=[1/0,1/0,1/0],A=[-1/0,-1/0,-1/0];for(const i of t)n=n.map((a,c)=>Math.min(a,i.xyz[c])),A=A.map((a,c)=>Math.max(a,i.xyz[c]));const s=Math.hypot(A[0]-n[0],A[1]-n[1],A[2]-n[2]);if(!(s>0))return!0;const r=[];for(const i of e.values())if(!(i.length<6)){i.sort((a,c)=>a.start-c.start);for(let a=1;a<i.length;a++){const c=i[a-1].xyz,l=i[a].xyz;r.push(Math.hypot(l[0]-c[0],l[1]-c[1],l[2]-c[2]))}}return r.length===0?!0:(r.sort((i,a)=>i-a),r[r.length>>1]<s*Tg)}function Og(t){const e=new Map;for(const s of t){const r=[...s].sort((o,i)=>o-i);for(let o=1;o<r.length;o++){const i=r[o]-r[o-1];i<=0||e.set(i,(e.get(i)??0)+1)}}let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}function _g(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=1,A=0;for(const[s,r]of e)(r>A||r===A&&s<n)&&(A=r,n=s);return n}function di(t,e=""){return Qi(t,e,"g3d")}function Ci(t,e=""){return Qi(t,e,"bed3d")}function Qi(t,e,n){const A=[];let s=0,r=0;if(wt(t,h=>{const u=Ii(h,n);u===fs?r++:u===null?s++:A.push(u)}),A.length===0){const h=n==="g3d"?"chromosome, start, x, y, z":"chromosome, start, end, x, y, z";throw new Error(r>0&&s===0?`No bead in this file has a place: all ${r} rows carry \`nan\` where their coordinates go.`:s>0?`No usable rows: all ${s} lines failed the "${h}" test that a ${n} begins with.`:`${e===""?"This file":e} has no rows.`)}const o=[],i=new Map,a=new Map;for(const h of A){i.has(h.hap)||(i.set(h.hap,o.length),o.push(h.hap));const u=`${h.contig}\0${h.hap}`,I=a.get(u);I===void 0?a.set(u,[h.start]):I.push(h.start)}const c=n==="g3d"?Og(a.values()):_g(A.map(h=>(h.end??h.start)-h.start)),l=o.length>1,g=new et;for(const h of A)g.add(h.contig,h.start,h.end??h.start+c,{xyz:h.xyz,hap:i.get(h.hap)??0,detail:l?`${gs} ${h.hap}`:""});const f={width:c,haplotypes:o};return g.finish(null,f)}function Bi(t){const e=t.model,n=`${rr(t.length)} bead${t.length===1?"":"s"}`;if(e===void 0)return n;const A=[n,il(e.width)];return e.haplotypes.length>1&&A.push(`${e.haplotypes.length} haplotypes`),A.push(`${rr(t.contigs.length)} sequence${t.contigs.length===1?"":"s"}`),A.join(ct)}function rr(t){return t.toLocaleString("en-US")}const ge=99999,Kg="BEA",or="REMARK 250 CHROMOSOMIX",ir=1;function qg(t,e,n){return Number.isFinite(t)&&Number.isFinite(e)&&Number.isFinite(n)}function mA(t,e=""){if(Ug(e))return!0;const n=/^[ \t]*(\S[^\n]*)/m.exec(t)?.[1]??"";return/^(HEADER|TITLE |COMPND|SOURCE|KEYWDS|EXPDTA|AUTHOR|REMARK|CRYST1|MODEL |ATOM |HETATM)/.test(n)?/^(ATOM |HETATM)/m.test(t):!1}function Ei(t,e=""){const n=[],A=[];let s=null,r=null,o=null,i=null;const a=[];let c=0,l=!1,g=0;const f=t.length;for(;g<f;){let N=t.indexOf(`
9
+ `,g);N<0&&(N=f);let k=N;k>g&&t.charCodeAt(k-1)===13&&k--;const b=t.slice(g,k);if(g=N+1,b.startsWith(`${or} `)){const x=b.slice(or.length+1).trim().split(/\s+/),[Y,...J]=x;if(Y==="PLACEMENT")s=Number(J[0]);else if(Y==="FRAME"&&J.length===4){const[K,V,H,ht]=J.map(Number);[K,V,H].every(Number.isFinite)&&ht>0&&(r={cx:K,cy:V,cz:H,factor:ht})}else if(Y==="WIDTH"){const K=Number(J[0]);Number.isInteger(K)&&K>0&&(o=K)}else if(Y==="HAPLOTYPES")i=J.map(nA);else if(Y==="CHAIN"&&J.length>=6){const K=Number(J[2]),V=Number(J[3]);tn(K)&&tn(V)&&K<=V&&n.push({first:K,last:V,hap:nA(J[4]),sequence:nA(J.slice(5).join(" "))})}else if(Y==="RUN"&&J.length===4){const[K,V,H,ht]=J.map(Number);tn(K)&&Number.isInteger(V)&&V>0&&K+V-1<=ge&&Number.isInteger(H)&&H>=0&&Number.isInteger(ht)&&ht>0&&A.push({first:K,count:V,start:H,width:ht})}continue}if(l)continue;if(b.startsWith("ENDMDL")){l=!0;continue}if(!b.startsWith("HETATM")&&!b.startsWith("ATOM "))continue;const D=Number(b.slice(6,11)),F=Number(b.slice(30,38)),R=Number(b.slice(38,46)),v=Number(b.slice(46,54));!tn(D)||!qg(F,R,v)||(b.slice(17,20)===Kg&&c++,a.push({serial:D,x:F,y:R,z:v}))}const h=e===""?"This file":e;if(a.length===0)throw new Error(`${h} has no ATOM or HETATM record with a place, so there is no bead to read.`);if(s===null||n.length===0||A.length===0)throw new Error(c===a.length?"These beads are named the way this app writes a PDB, but the lines that said where each one is on the genome are gone: PyMOL drops REMARK records when it saves. Open the PDB as this app wrote it, or its bed3d.":"A PDB says where each bead is in space and not where it is on the genome, and this one does not say: pastis and the other solvers write their beads in bin order and nothing else. Write the coordinates beside the bins they were modelled at, as a bed3d (chrom, start, end, x, y, z), and open that.");if(s!==ir)throw new Error(`This PDB's placement table is version ${String(s)}, and this reader understands version ${ir}.`);const u=new Int32Array(ge+1).fill(-1);n.forEach((N,k)=>{for(let b=N.first;b<=N.last;b++)u[b]=k});const I=new Float64Array(ge+1).fill(-1),d=new Float64Array(ge+1);for(const N of A)for(let k=0;k<N.count;k++)I[N.first+k]=N.start+k*N.width,d[N.first+k]=N.width;const C=i??[],E=new Map;C.forEach((N,k)=>E.set(N,k));const B=r??{cx:0,cy:0,cz:0,factor:1},Q=new Uint8Array(ge+1),m=[];for(const N of a){const k=u[N.serial],b=I[N.serial];if(k<0||b<0||Q[N.serial]===1)continue;Q[N.serial]=1;const D=n[k];E.has(D.hap)||(E.set(D.hap,C.length),C.push(D.hap)),m.push({contig:D.sequence,start:b,end:b+d[N.serial],xyz:[N.x/B.factor+B.cx,N.y/B.factor+B.cy,N.z/B.factor+B.cz],hap:D.hap})}if(m.length===0)throw new Error(`${h} has a placement table, and it places none of the file's ${G.int(a.length)} atoms.`);const p=C.length>1,w=new et;for(const N of m)w.add(N.contig,N.start,N.end,{xyz:N.xyz,hap:E.get(N.hap)??0,detail:p?`${gs} ${N.hap}`:""});const y={width:o??Hg(m.map(N=>N.end-N.start)),haplotypes:C};return w.finish(null,y)}function tn(t){return Number.isInteger(t)&&t>=1&&t<=ge}function nA(t){try{return decodeURIComponent(t)}catch{return t}}function Hg(t){const e=new Map;for(const s of t)s>0&&e.set(s,(e.get(s)??0)+1);let n=0,A=1;for(const[s,r]of e)(r>n||r===n&&s<A)&&(n=r,A=s);return A}const AA="MessagePack value",ar=64,Wg=BigInt(Number.MAX_SAFE_INTEGER),Pg=BigInt(Number.MIN_SAFE_INTEGER);function mi(t,e=0){const n=new zg(t,e);return{value:n.next(),end:n.at}}class zg{constructor(e,n){this.bytes=e,this.at=n,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength)}at;view;decoder=new TextDecoder;depth=0;next(){const e=this.u8();if(e<=127)return e;if(e>=224)return e-256;if(e>=128&&e<=143)return this.map(e&15);if(e>=144&&e<=159)return this.array(e&15);if(e>=160&&e<=191)return this.str(e&31);switch(e){case 192:return null;case 194:return!1;case 195:return!0;case 196:return this.bin(this.u8());case 197:return this.bin(this.u16());case 198:return this.bin(this.u32());case 202:return this.f32();case 203:return this.f64();case 204:return this.u8();case 205:return this.u16();case 206:return this.u32();case 207:return this.big(this.view.getBigUint64(this.take(8)));case 208:return this.i8();case 209:return this.i16();case 210:return this.i32();case 211:return this.big(this.view.getBigInt64(this.take(8)));case 217:return this.str(this.u8());case 218:return this.str(this.u16());case 219:return this.str(this.u32());case 220:return this.array(this.u16());case 221:return this.array(this.u32());case 222:return this.map(this.u16());case 223:return this.map(this.u32());default:throw new Error(`msgpack: unsupported type byte 0x${e.toString(16).padStart(2,"0")} at offset ${this.at-1}.`)}}take(e){const n=this.at;if(n+e>this.bytes.length)throw new Error(`msgpack: truncated: needed ${e} byte${e===1?"":"s"} at offset ${n} of ${this.bytes.length}.`);return this.at=n+e,n}u8(){return this.view.getUint8(this.take(1))}u16(){return this.view.getUint16(this.take(2))}u32(){return this.view.getUint32(this.take(4))}i8(){return this.view.getInt8(this.take(1))}i16(){return this.view.getInt16(this.take(2))}i32(){return this.view.getInt32(this.take(4))}f32(){return this.view.getFloat32(this.take(4))}f64(){return this.view.getFloat64(this.take(8))}big(e){if(e>Wg||e<Pg)throw new Error(`msgpack: the 64-bit integer ${e} at offset ${this.at-9} does not fit a JavaScript number.`);return Number(e)}str(e){const n=this.take(e);return this.decoder.decode(this.bytes.subarray(n,n+e))}bin(e){const n=this.take(e);return this.bytes.subarray(n,n+e)}open(e,n,A){if(this.depth>=ar)throw new Rt("format",`This ${AA} nests deeper than ${ar} levels at offset ${this.at}, which no document this reader opens does. The file is corrupt, or not the format its first bytes claim.`,{format:AA,offset:this.at,depth:this.depth});return this.depth++,nt(e,{format:AA,field:`${n} length at offset ${this.at}`,ceiling:2**32-1,available:this.bytes.length-this.at,bytesPerItem:A})}array(e){const n=this.open(e,"array",1),A=new Array(n);for(let s=0;s<n;s++)A[s]=this.next();return this.depth--,A}map(e){const n=this.open(e,"map",2),A=new Map;for(let s=0;s<n;s++){const r=this.at,o=this.next();if(typeof o!="string"&&typeof o!="number")throw new Error(`msgpack: a map key at offset ${r} is neither a string nor an integer.`);A.set(o,this.next())}return this.depth--,A}}const cr=64e3,wn="binary g3d",wi={ratio:64,floor:64<<20,ceiling:1<<30},Xg=[165,109,97,103,105,99],Vg=[163,71,51,68];function hs(t){if(t.length===0)return!1;const e=t[0];let n;if(e>=128&&e<=143)n=1;else if(e===222)n=3;else return!1;const A=[...Xg,...Vg];if(t.length<n+A.length)return!1;for(let s=0;s<A.length;s++)if(t[n+s]!==A[s])return!1;return!0}async function Zg(t,e){const n=e===void 0?cr:Math.min(cr,e),A=await t(n,0);if(!hs(A))throw new Error("Not a binary g3d: the file does not begin with the G3D magic.");const{value:s}=mi(A);if(!(s instanceof Map))throw new Error("Not a binary g3d: the header is not a map.");if(s.get("magic")!=="G3D")throw new Error('Not a binary g3d: the magic is not "G3D".');const r=s.get("version");if(r!==2)throw r===1?new Error("This is a version-1 g3d, written by a g3dtools older than 0.2. Run `g3dtools load` over the original text to rewrite it as a version-2 file, which is the layout this reader and the WashU browser both understand."):new Error(`Unsupported g3d version ${String(r)}: this reader understands version 2.`);const o=Le(s.get("resolutions"),"resolutions"),i=nf(s.get("categories"),"categories"),a=s.get("offsets");if(!(a instanceof Map))throw new Error("This g3d has no offsets map in its header.");const c=new Map;for(const[l,g]of a){const f=typeof l=="number"?l:Number(l);if(!Number.isInteger(f)||!(g instanceof Map))continue;const h=g.get("offset"),u=g.get("size");if(typeof h!="number"||typeof u!="number")continue;const I=`${f} bp block`;nt(h,{format:wn,field:`offset of the ${I}`,ceiling:Number.MAX_SAFE_INTEGER}),nt(u,{format:wn,field:`size of the ${I}`,ceiling:wi.ceiling}),c.set(f,{offset:h,size:u})}for(const l of o)if(!c.has(l))throw new Error(`This g3d lists a resolution of ${l} bp but has no block for it.`);return{version:r,genome:typeof s.get("genome")=="string"?s.get("genome"):"",name:typeof s.get("name")=="string"?s.get("name"):"",resolutions:o,categories:i,offsets:c,...e===void 0?{}:{fileSize:e}}}async function jg(t,e,n){const A=e.offsets.get(n);if(A===void 0)throw new Error(`This g3d has no model at ${n} bp; it has ${e.resolutions.join(", ")}.`);e.fileSize!==void 0&&ns(A.offset,A.size,{format:wn,field:`${n} bp block`,size:e.fileSize});const s=await t(A.size,A.offset);if(s.length!==A.size)throw new Error(`The ${n} bp block of this g3d is ${s.length} bytes where the header promised ${A.size}.`);const{value:r}=mi(await ef(s,n));if(!(r instanceof Map))throw new Error(`The ${n} bp block of this g3d is not a map.`);const o=[...e.categories],i=o.length>1,a=new et;for(const[l,g]of r){const f=String(l);let h=o.indexOf(f);h<0&&(h=o.length,o.push(f));const u=i?`${gs} ${f}`:"";if(g instanceof Map)for(const[I,d]of g){if(!(d instanceof Map))continue;const C=`${f}/${String(I)} at ${n} bp`,E=Le(d.get("start"),`start of ${C}`),B=Le(d.get("x"),`x of ${C}`),Q=Le(d.get("y"),`y of ${C}`),m=Le(d.get("z"),`z of ${C}`);if(B.length!==E.length||Q.length!==E.length||m.length!==E.length)throw new Error(`The columns of ${C} in this g3d are not the same length.`);const p=String(I);for(let w=0;w<E.length;w++)a.add(p,E[w],E[w]+n,{xyz:[B[w],Q[w],m[w]],hap:h,detail:u})}}const c={width:n,haplotypes:o};return a.finish(null,c)}function tf(t){const e=t.resolutions.length,n=t.categories.length;return["binary g3d",`${e} resolution${e===1?"":"s"}`,`${n} categor${n===1?"y":"ies"}`].join(ct)}async function ef(t,e){return As(t,{format:wn,field:`${e} bp block`,encoding:"deflate",maxBytes:al(t.byteLength,wi)})}function Le(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="number")throw new Error(`This g3d's ${e} holds a value that is not a number.`);return t}function nf(t,e){if(!Array.isArray(t))throw new Error(`This g3d's ${e} is not an array.`);for(const n of t)if(typeof n!="string")throw new Error(`This g3d's ${e} holds a value that is not a string.`);return t}const Af=[66,65,73,1],sf=[67,83,73,1],rf=14,of=5,af=37450,Qt="BAM index",cf=65536,lf=65536,gf=10,ff=63,fe=2**31-1;function lr(t,e){return t.length<e.length?!1:e.every((n,A)=>t[A]===n)}async function hf(t){const e=He(t)?await Ot(t):t,n=lr(e,sf)?If:lr(e,Af)?uf:null;if(n===null)throw new Error("This is not a BAM index: the magic bytes are neither BAI\\1 nor CSI\\1.");try{return n(e)}catch(A){throw A instanceof RangeError?new Rt("format",`This ${Qt} ends part-way through its own tables, ${e.byteLength.toLocaleString("en-US")} bytes in. It is truncated; rebuild it with \`samtools index\`.`,{bytes:e.byteLength}):A}}function uf(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=o=>t.byteLength-o,A=nt(e.getInt32(4,!0),{format:Qt,field:"reference count",ceiling:fe,available:n(8),bytesPerItem:8});let s=8;const r=[];for(let o=0;o<A;o++){const i=new Map,a=nt(e.getInt32(s,!0),{format:Qt,field:`bin count of reference ${o}`,ceiling:cf,available:n(s+4)-4,bytesPerItem:8});s+=4;for(let g=0;g<a;g++){const f=e.getUint32(s,!0);s+=4;const h=nt(e.getInt32(s,!0),{format:Qt,field:`chunk count of bin ${f}`,ceiling:fe,available:n(s+4),bytesPerItem:16});s+=4;const u=[];for(let I=0;I<h;I++)u.push({begin:e.getBigUint64(s,!0),end:e.getBigUint64(s+8,!0)}),s+=16;f!==af&&i.set(f,u)}const c=nt(e.getInt32(s,!0),{format:Qt,field:`linear index size of reference ${o}`,ceiling:lf,available:n(s+4),bytesPerItem:8});s+=4;const l=new BigUint64Array(c);for(let g=0;g<c;g++)l[g]=e.getBigUint64(s,!0),s+=8;r.push({bins:i,linear:l,loffset:null})}return{format:"bai",minShift:rf,depth:of,refs:r}}function If(t){const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=c=>t.byteLength-c,A=nt(e.getInt32(8,!0),{format:Qt,field:"CSI depth",ceiling:gf}),s=nt(e.getInt32(4,!0),{format:Qt,field:"CSI min_shift",ceiling:ff-3*A});let o=16+nt(e.getInt32(12,!0),{format:Qt,field:"auxiliary data length",ceiling:fe,available:n(16)-4});const i=nt(e.getInt32(o,!0),{format:Qt,field:"reference count",ceiling:fe,available:n(o+4),bytesPerItem:4});o+=4;const a=[];for(let c=0;c<i;c++){const l=new Map,g=new Map,f=nt(e.getInt32(o,!0),{format:Qt,field:`bin count of reference ${c}`,ceiling:fe,available:n(o+4),bytesPerItem:16});o+=4;for(let h=0;h<f;h++){const u=e.getUint32(o,!0);o+=4,g.set(u,e.getBigUint64(o,!0)),o+=8;const I=nt(e.getInt32(o,!0),{format:Qt,field:`chunk count of bin ${u}`,ceiling:fe,available:n(o+4),bytesPerItem:16});o+=4;const d=[];for(let C=0;C<I;C++)d.push({begin:e.getBigUint64(o,!0),end:e.getBigUint64(o+8,!0)}),o+=16;l.set(u,d)}a.push({bins:l,linear:null,loffset:g})}return{format:"csi",minShift:s,depth:A,refs:a}}function Je(t,e){return Math.floor(t/2**e)}function df(t,e,n,A){const s=[],r=Math.max(e,n-1);let o=A.minShift+A.depth*3,i=0;for(let a=0;a<=A.depth;a++){const c=i+Je(e,o),l=i+Je(r,o);if(l-c+1>t.bins.size)for(const[g,f]of t.bins)g>=c&&g<=l&&s.push(f);else for(let g=c;g<=l;g++){const f=t.bins.get(g);f!==void 0&&s.push(f)}i+=1<<a*3,o-=3}return s}function Cf(t,e,n){if(t.linear!==null){const r=Je(e,n.minShift);return t.linear.length===0?0n:t.linear[Math.min(r,t.linear.length-1)]}if(t.loffset===null)return 0n;let A=n.minShift,s=0;for(let r=n.depth;r>=0;r--){s=pi(r);const o=t.loffset.get(s+Je(e,A));if(o!==void 0)return o;A+=3}return 0n}function pi(t){let e=0;for(let n=0;n<t;n++)e+=1<<n*3;return e}function Qf(t,e,n){let A=null,s=n.minShift;for(let r=n.depth;r>=0;r--){const o=pi(r),i=1<<r*3,a=Je(Math.max(0,e-1),s)+1;for(let c=0;c<8&&a+c<i;c++){const l=t.bins.get(o+a+c);if(l!==void 0)for(const g of l)(A===null||g.begin<A)&&(A=g.begin)}s+=3}return A??BigInt(Number.MAX_SAFE_INTEGER)<<16n}const Bf=1<<20;function Ef(t,e,n,A,s){const r=t.refs[e];if(r===void 0)return[];const o=Cf(r,Math.max(0,n),t),i=Qf(r,Math.max(1,A),t),a=[];for(const l of df(r,Math.max(0,n),Math.max(1,A),t))for(const g of l)g.end>o&&g.begin<i&&a.push(g);if(a.length===0)return[];a.sort((l,g)=>l.begin<g.begin?-1:l.begin>g.begin?1:0);const c=[];for(const l of a){const g=Number(l.begin>>16n),f=Number(l.begin&0xffffn),h=Number(l.end>>16n),u=Math.min(s,h+Et),I=c[c.length-1];I!==void 0&&g<=I.to+Bf?(I.to=Math.max(I.to,u),I.lastBlock=Math.max(I.lastBlock,h)):c.push({from:g,to:u,lastBlock:h,dataFrom:f})}return c}function yi(t){let e=0;for(const n of t)e+=n.to-n.from;return e}const mf=2*Et,wf=Et,gr=1<<20,pf=4*Et,yf=16384,Nf=1<<24,kf=1<<18,bf=1<<24,pn=18,Pt=[31,139,8,4],Ee=36;function jt(t,e){return t<0?Number.POSITIVE_INFINITY:t*2**32+e+1}class wA extends Error{constructor(e,n){super("The reads are not in coordinate order."),this.before=e,this.after=n,this.name="UnsortedError"}}function fr(t,e){return t.refId<0?"unplaced":`${e[t.refId]?.name??`reference ${t.refId}`}:${(t.pos+1).toLocaleString("en-US")}`}function Df(t,e){const n=e-1;return t>>14===n>>14?32767/7+(t>>14):t>>17===n>>17?4095/7+(t>>17):t>>20===n>>20?511/7+(t>>20):t>>23===n>>23?63/7+(t>>23):t>>26===n>>26?7/7+(t>>26):0}class us{constructor(e,n,A,s){this.handle=e,this.size=n,this.refs=A,this.progress=s,this.lineStart=[];let r=0;for(const o of A)this.lineStart.push(r),r+=Math.max(0,o.length);this.lineLength=r}probes=[];answers=new Map;probing=new Map;lastWalk=null;walking=new Map;bytesRead=0;first=null;lineStart;lineLength;static async open(e,n,A,s,r){const o=new us(e,n,A.refs,s);if(o.first=await o.firstRecord(A.recordsFrom),o.first!==null&&A.sortOrder!=="coordinate")for(const i of[.125,.375,.625,.875])r!==void 0&&await r(),await o.probeAt(Math.floor(n*i));return o}get bytes(){return this.bytesRead}get probeCount(){return this.probes.length}async spansFor(e,n,A,s,r){if(this.first===null||A<=n)return[];const o=await this.locate(e,Math.max(0,n-yf),s);if(o===null||o.key>=jt(e,A))return[];if(r!==void 0&&o.block+r<this.size){s!==void 0&&await s();const c=await this.probeAt(hr(o.block+r,o.block));if(c.key<jt(e,A)){const l=c.block;return[{from:o.block,to:Math.min(this.size,l+Et),lastBlock:l,dataFrom:o.within}]}}const i=await this.locate(e,A,s),a=i===null||i.tail===!0?this.size:i.block;return[{from:o.block,to:Math.min(this.size,a+Et),lastBlock:a,dataFrom:o.within}]}locate(e,n,A){if(this.first===null)return Promise.resolve(null);const s=jt(e,n);if(this.first.key>=s)return Promise.resolve(this.first);const r=this.answers.get(s);if(r!==void 0)return r;const o=this.search(e,n,A).then(i=>(i!==null&&i.tail!==!0&&this.remember(i,!0),i));return this.answers.set(s,o),o.catch(()=>this.answers.delete(s)),o}async search(e,n,A){if(this.first===null)return null;const s=jt(e,n);let r=this.first,o=null;for(const c of this.probes)if(c.key<s)r=c;else{o=c;break}let i=!0;for(;;){const c=o===null?this.size:o.block,l=c-r.block;if(l<=pf)break;A!==void 0&&await A();const g=i?this.guess(r,o,e,n):null,f=await this.probeAt(hr(g??Math.floor((r.block+c)/2),r.block));if(f.block>=c)break;f.key>=s?o=f:r=f,i=(o===null?this.size:o.block)-r.block<=l/2}const a=o===null||o.tail===!0?this.size:Math.min(this.size,o.block+Et);return this.walk(r,a,s)}lineOf(e,n){return(this.lineStart[e]??this.lineLength)+Math.max(0,n)}guess(e,n,A,s){const r=this.lineOf(A,s),o=this.lineOf(e.refId,e.pos),i=n===null||n.tail===!0||n.refId<0?this.lineLength:this.lineOf(n.refId,n.pos);if(i<=o)return null;const a=(r-o)/(i-o);if(!(a>0&&a<1))return null;const c=n===null?this.size:n.block,l=e.block+Math.floor(a*(c-e.block));return Math.min(Math.max(l,e.block+1),c-2*Et)}async walk(e,n,A){if(n<=e.block)return null;let s=this.lastWalk;if(s===null||e.block<s.from||n>s.to){const c=`${e.block}-${n}`;let l=this.walking.get(c);if(l===void 0){l=this.read(n-e.block,e.block).then(async f=>{const{bytes:h,blocks:u}=await pA(f,e.block);return{from:e.block,to:n,bytes:h,blocks:u}}),this.walking.set(c,l);const g=()=>{this.walking.delete(c)};l.then(g,g)}s=await l,this.lastWalk=s}const{bytes:r,blocks:o}=s,i=o.find(c=>c.fileAt===e.block);if(i===void 0)return this.lastWalk=null,this.walk(e,n,A);let a=null;return En(r,i.from+e.within,c=>jt(c.refId,c.pos)<A?!0:(a=yA(o,c.at-4,c.refId,c.pos),!1)),a}probeAt(e){const n=this.probing.get(e);if(n!==void 0)return n;const A=this.probe(e);this.probing.set(e,A);const s=()=>{this.probing.delete(e)};return A.then(s,s),A}async probe(e){let n=mf;for(;;){const A=Math.min(this.size,e+n);if(A<=e)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});const s=await this.read(A-e,e),r=await Ff(s,e,this.refs,this.size);if(r.kind==="record")return this.remember(r.placed);if(r.kind==="end"||A>=this.size)return this.remember({block:e,within:0,refId:-1,pos:-1,key:Number.POSITIVE_INFINITY,tail:!0});if(n>=gr)throw new Error(`no alignment record could be made out within ${gr>>20} MB of byte ${e.toLocaleString("en-US")}`);n*=4}}remember(e,n=!1){let A=this.probes.length;for(;A>0&&this.probes[A-1].block>e.block;)A--;const s=this.probes[A-1];if(s!==void 0&&s.block===e.block&&s.within===e.within)return s;if(n)return this.probes.splice(A,0,e),e;const r=A===0?this.first:this.probes[A-1],o=A<this.probes.length?this.probes[A]:null;if(r!==null&&r.key>e.key)throw new wA(r,e);if(o!==null&&e.key>o.key)throw new wA(e,o);return this.probes.splice(A,0,e),e}async firstRecord(e){let n=kf;for(;;){const A=await this.read(Math.min(n,this.size),0);let s=0,r=0;for(;s+pn<=A.length;){const o=pe(A.subarray(s,Math.min(s+64,A.length)));if(o===null||s+o>A.length)break;const i=Ni(A,s+o-4);if(e<r+i){const{bytes:a,blocks:c}=await pA(A.subarray(s),s),l=e-r;if(l+Ee>a.length){if(A.length>=this.size)return null;break}if(!NA(a,l,this.refs))throw new Error("the first alignment record is not where the header says it begins");const g=new DataView(a.buffer,a.byteOffset,a.byteLength);return yA(c,l,g.getInt32(l+4,!0),g.getInt32(l+8,!0))}r+=i,s+=o}if(A.length>=this.size)return null;if(n>=bf)throw new Error("the header does not end within the first 16 MB");n*=4}}async read(e,n){const A=await this.handle.read(e,n);return this.bytesRead+=A.length,this.progress!==void 0&&this.progress(this.bytesRead),A}}async function pA(t,e){const n=[],A=[];let s=0,r=0,o=!1;for(;r+pn<=t.length;){const c=pe(t.subarray(r,Math.min(r+64,t.length)));if(c===null||r+c>t.length)break;const l=await Ot(t.subarray(r,r+c),0);l.length===0&&(o=!0),A.push({fileAt:e+r,from:s,to:s+l.length}),n.push(l),s+=l.length,r+=c}const i=new Uint8Array(s);let a=0;for(const c of n)i.set(c,a),a+=c.length;return{bytes:i,blocks:A,sawEnd:o}}function yA(t,e,n,A){for(const r of t)if(e>=r.from&&e<r.to)return{block:r.fileAt,within:e-r.from,refId:n,pos:A,key:jt(n,A)};const s=t[t.length-1];return{block:s.fileAt,within:e-s.from,refId:n,pos:A,key:jt(n,A)}}function Mf(t,e,n){for(let A=0;A+pn<=t.length;A++){if(t[A]!==Pt[0]||t[A+1]!==Pt[1]||t[A+2]!==Pt[2]||t[A+3]!==Pt[3])continue;const s=pe(t.subarray(A,Math.min(A+64,t.length)));if(s===null||s>Et||s<pn+8)continue;const r=A+s;if(r>t.length)return e+r===n?A:"more";if(!(Ni(t,r-4)>Et)){if(e+r===n)return A;if(r+3<=t.length){if(t[r]===Pt[0]&&t[r+1]===Pt[1]&&t[r+2]===Pt[2])return A;continue}return"more"}}return"more"}async function Ff(t,e,n,A){const s=Mf(t,e,A);if(s==="more")return e+t.length>=A?{kind:"end"}:{kind:"more"};const{bytes:r,blocks:o,sawEnd:i}=await pA(t.subarray(s),e+s);if(r.length===0)return i||e+t.length>=A?{kind:"end"}:{kind:"more"};const a=Sf(r,n);if(a>=0){const c=new DataView(r.buffer,r.byteOffset,r.byteLength);return{kind:"record",placed:yA(o,a,c.getInt32(a+4,!0),c.getInt32(a+8,!0))}}return i||e+t.length>=A?{kind:"end"}:{kind:"more"}}function Sf(t,e){const n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let A=0;A+Ee<=t.length;A++){if(!NA(t,A,e,n))continue;const s=A+4+n.getInt32(A,!0);if(s+Ee<=t.length){if(NA(t,s,e,n))return A;continue}if(Rf(t,A,n))return A}return-1}function NA(t,e,n,A=new DataView(t.buffer,t.byteOffset,t.byteLength)){if(e+Ee>t.length)return!1;const s=A.getInt32(e,!0);if(s<32||s>Nf)return!1;const r=A.getInt32(e+4,!0);if(r<-1||r>=n.length)return!1;const o=A.getInt32(e+8,!0);if(o<-1||r>=0&&o>n[r].length)return!1;const i=t[e+12];if(i<1)return!1;const a=A.getUint16(e+16,!0),c=A.getInt32(e+20,!0);if(c<0)return!1;const l=A.getInt32(e+24,!0);if(l<-1||l>=n.length||A.getInt32(e+28,!0)<-1||32+i+a*4+(c+1>>1)+c>s)return!1;const g=e+Ee,f=g+i;if(f>t.length||t[f-1]!==0)return!1;for(let h=g;h<f-1;h++){const u=t[h];if(u<33||u>126)return!1}return!0}function Rf(t,e,n){const A=n.getInt32(e+8,!0);if(A<0||A>=1<<29)return!1;const s=e+Ee+t[e+12],r=n.getUint16(e+16,!0);if(s+r*4>t.length)return!1;const o=A+zo(n,s,r);return n.getUint16(e+14,!0)===Df(A,Math.max(o,A+1))}function hr(t,e){const n=t-t%wf;return n>e?n:t}function Ni(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}const kA=62,ur=10;function yn(t){return t.length>0&&t[0]===kA}function Lf(t){const e=new TextDecoder,n=[];t.length>0&&t[0]===kA&&n.push(0);for(let o=1;o<t.length;o++)t[o]===kA&&t[o-1]===ur&&n.push(o);const A=[],s=new Map;let r=0;for(let o=0;o<n.length;o++){const i=n[o];let a=t.indexOf(ur,i);a<0&&(a=t.length);const c=xf(e,t,i+1,a),l=Math.min(a+1,t.length),g=o+1<n.length?n[o+1]:t.length;if(c===""||s.has(c))continue;let f=0;for(let I=l;I<g;I++)t[I]>32&&f++;if(f===0)continue;const h=new Uint8Array(f);let u=0;for(let I=l;I<g;I++){const d=t[I];d>32&&(h[u++]=d)}s.set(c,h),A.push({name:c,length:f}),r+=f}return{contigs:A,bases:s,total:r}}function xf(t,e,n,A){let s=n;for(;s<A&&e[s]>32;)s++;return t.decode(e.subarray(n,s)).trim()}const ye=(()=>{const t=new Uint8Array(256).fill(4),e=(n,A)=>{t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A};return e("A",0),e("C",1),e("G",2),e("T",3),e("U",3),t})(),Gf=25;function Ir(t,e,n,A){const s=Math.max(0,Math.floor(e)),r=Math.min(t.length,Math.ceil(n)),o=Math.max(Gf,Math.round(A)),i=r>s?Math.ceil((r-s)/o):0,a=new Int32Array(i),c=new Int32Array(i),l=new Float32Array(i);for(let g=0;g<i;g++){const f=s+g*o,h=Math.min(r,f+o);let u=0,I=0;for(let d=f;d<h;d++){const C=ye[t[d]];C===1||C===2?u++:(C===0||C===3)&&I++}a[g]=f,c[g]=h,l[g]=u+I>0?u/(u+I):Number.NaN}return{starts:a,ends:c,values:l}}const ki={exclude:Wo,minMapq:0};function Uf(t,e,n,A,s,r,o=ki,i,a,c){const l=s-A;if(r<=0||l<=0)return{depth:new Float32Array(0),variant:null,total:0,kept:0,max:0};const g=l/r,f=new Float64Array(r),h=new Float64Array(r+1),u=i===void 0?null:new Float64Array(r),I=i===void 0?null:new Float64Array(r+1);let d=0,C=0;En(t,e,p=>{if(d++,p.refId===n&&(p.flag&o.exclude)===0&&!(p.mapq<o.minMapq)&&!(p.pos<0||p.end<=A||p.pos>=s)){if(C++,Yf(t,p,(w,y)=>{const N=Math.max(w,A),k=Math.min(y,s);k<=N||dr(f,h,(N-A)/g,(k-A)/g,r)}),a!==void 0){let w=null;Jf(t,p,(y,N)=>{if(N<=A||y>=s)return;w??=$f(t,p);const k=`${y}:${N}:${w}`;a.set(k,(a.get(k)??0)+1)})}if(c!==void 0)for(const w of Xo(t,p)){if(w.pos<A||w.pos>=s)continue;const y=_l(w.prob,c.threshold);if(y<0)continue;let N=c.tally.get(w.code);N===void 0&&(N={calls:new Float64Array(r),modified:new Float64Array(r)},c.tally.set(w.code,N));const k=Math.min(r-1,Math.floor((w.pos-A)/g));N.calls[k]++,y===1&&N.modified[k]++}i===void 0||u===null||I===null||vf(t,p,i,w=>{w<A||w>=s||dr(u,I,(w-A)/g,(w+1-A)/g,r)},[A,s])}});let E=0,B=0;const Q=new Float32Array(r);for(let p=0;p<r;p++){E+=h[p];const w=E+f[p];Q[p]=w,w>B&&(B=w)}let m=null;if(u!==null&&I!==null){m=new Float32Array(r);let p=0;for(let w=0;w<r;w++)p+=I[w],m[w]=p+u[w]}return{depth:Q,variant:m,total:d,kept:C,max:B}}function vf(t,e,n,A,s=[Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY]){const r=new DataView(t.buffer,t.byteOffset,t.byteLength),o=We(t,e),i=o===null?e.cigarOps:o.length,a=f=>o===null?r.getUint32(e.cigarAt+f*4,!0):o[f],c=n.start+n.bases.length;let l=e.pos,g=0;for(let f=0;f<i;f++){const h=a(f),u=h&15,I=h>>>4;if(u===2){const d=Math.max(0,s[0]-l),C=Math.min(I,s[1]-l);for(let E=d;E<C;E++)A(l+E);l+=I;continue}if(mt(u)&&Yt(u)){const d=Math.max(0,n.start-l,s[0]-l),C=Math.min(I,c-l,s[1]-l,e.seqLength-g);for(let E=d;E<C;E++){const B=l+E-n.start,Q=ye[n.bases[B]];if(Q===4)continue;const m=Tf(t,e.seqAt,g+E);m!==4&&m!==Q&&A(l+E)}l+=I,g+=I;continue}mt(u)&&(l+=I),Yt(u)&&(g+=I)}}function Tf(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return ye[os.charCodeAt(s)]}function dr(t,e,n,A,s){const r=Math.min(s-1,Math.max(0,Math.floor(n))),o=Math.min(s-1,Math.max(0,Math.ceil(A)-1));if(!(o<r)){if(r===o){t[r]+=Math.min(A,r+1)-Math.max(n,r);return}t[r]+=r+1-Math.max(n,r),t[o]+=Math.min(A,o+1)-o,o>r+1&&(e[r+1]+=1,e[o]-=1)}}function Jf(t,e,n){const A=We(t,e),s=A===null?e.cigarOps:A.length,r=A===null?new DataView(t.buffer,t.byteOffset,t.byteLength):null;let o=e.pos;for(let i=0;i<s;i++){const a=r===null?A[i]:r.getUint32(e.cigarAt+i*4,!0),c=a&15,l=a>>>4;if(c===3){l>0&&n(o,o+l),o+=l;continue}mt(c)&&(o+=l)}}function $f(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=t[A],o=t[A+1],i=String.fromCharCode(t[A+2]);if(A+=3,i==="A"&&(r===88&&o===83||r===116&&o===115)){const a=t[A]===43?1:t[A]===45?-1:0;return r===88?a:(e.flag&At.REVERSE)!==0?-a:a}if(A=rs(t,A,i,s),A<0)return 0}return 0}function Yf(t,e,n){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=We(t,e),r=s===null?e.cigarOps:s.length,o=l=>s===null?A.getUint32(e.cigarAt+l*4,!0):s[l];let i=e.pos,a=e.pos,c=!1;for(let l=0;l<r;l++){const g=o(l),f=g&15,h=g>>>4;if(f===3){c&&i>a&&n(a,i),c=!1,i+=h,a=i;continue}mt(f)&&(c||(a=i,c=!0),i+=h)}c&&i>a&&n(a,i)}function Of(t,e,n){let A=2166136261;for(let s=e;s<n;s++)A^=t[s],A=Math.imul(A,16777619)>>>0;return A/4294967296}function _f(t,e,n,A,s,r,o){const i=new DataView(t.buffer,t.byteOffset,t.byteLength),a=o.filter;let c=0;const l=[];En(t,e,C=>{Cr(C,A,s,r,a)&&(c++,l.push(Of(t,C.at+32,C.at+32+C.nameBytes-1)))});const g=Math.max(1,Math.min(o.maxReads,o.maxRows*Kf)),f=c<=g?1:g/c,h=f<1,u=[],I=[];let d=0;return En(t,e,C=>{!Cr(C,A,s,r,a)||l[d++]>=f||I.push(qf(t,i,C,o,u))}),{pile:jf(I,n,A,s,r,o),total:c,kept:I.length,capped:h,rows:u.length,usedMd:I.some(C=>C.fromMd),usedCigar:I.some(C=>C.fromCigar)}}const Kf=8;function Cr(t,e,n,A,s){return t.refId!==e||(t.flag&s.exclude)!==0||t.mapq<s.minMapq?!1:t.pos>=0&&t.end>n&&t.pos<A}function qf(t,e,n,A,s){const r=We(t,n),o=r===null?n.cigarOps:r.length,i=h=>r===null?e.getUint32(n.cigarAt+h*4,!0):r[h],a=[];let c=0,l=0;for(let h=0;h<o;h++){const u=i(h);a.push(u);const I=u&15,d=u>>>4;I===4&&(h===0||h===1&&(i(0)&15)===5?c=d:(h===o-1||h===o-2&&(i(o-1)&15)===5)&&(l=d))}const g=Pf(t,n,a,A.reference),f=Wf(s,n.pos-c,n.end+l);return{refStart:n.pos,refEnd:n.end,clipStart:c,clipEnd:l,row:f,flag:n.flag,mapq:n.mapq,mateContig:n.nextRefId,matePos:n.nextPos,tlen:n.tlen,name:Ml(t,n),ops:a,diffPos:g.pos,diffBase:g.base,fromMd:g.fromMd,fromCigar:g.fromCigar,mods:A.colourBy==="basemod"?Xo(t,n,a):null}}const Hf=3;function Wf(t,e,n){for(let A=0;A<t.length;A++)if(t[A]+Hf<=e)return t[A]=n,A;return t.push(n),t.length-1}function bA(t,e,n){const A=t[e+(n>>1)],s=n%2===0?A>>4:A&15;return ye[os.charCodeAt(s)]}function Pf(t,e,n,A){const s={pos:[],base:[],fromMd:!1,fromCigar:!1};if(n.some(o=>(o&15)===8)){let o=e.pos,i=0;for(const a of n){const c=a&15,l=a>>>4;if(c===8){const g=Math.min(l,e.seqLength-i);for(let f=0;f<g;f++)s.pos.push(o+f),s.base.push(bA(t,e.seqAt,i+f))}mt(c)&&(o+=l),Yt(c)&&(i+=l)}return s.fromCigar=!0,s}const r=zf(t,e);if(r!==null)return Xf(t,e,n,r,s),s.fromMd=!0,s;if(A!==void 0){let o=e.pos,i=0;const a=A.start+A.bases.length;for(const c of n){const l=c&15,g=c>>>4;if(mt(l)&&Yt(l)){const f=Math.max(0,A.start-o),h=Math.min(g,a-o,e.seqLength-i);for(let u=f;u<h;u++){const I=o+u-A.start,d=ye[A.bases[I]],C=bA(t,e.seqAt,i+u);d!==C&&d<4&&C<4&&(s.pos.push(o+u),s.base.push(C))}}mt(l)&&(o+=g),Yt(l)&&(i+=g)}}return s}function zf(t,e){let A=e.seqAt+(e.seqLength+1>>1)+e.seqLength;const s=e.at+e.bytes-4;for(;A+3<=s;){const r=String.fromCharCode(t[A],t[A+1]),o=String.fromCharCode(t[A+2]);if(A+=3,r==="MD"&&o==="Z"){let i=A;for(;i<s&&t[i]!==0;)i++;return new TextDecoder().decode(t.subarray(A,i))}if(A=rs(t,A,o,s),A<0)return null}return null}function Xf(t,e,n,A,s){const r=[],o=[];let i=e.pos,a=0;for(const l of n){const g=l&15,f=l>>>4;if(mt(g)&&Yt(g)){const h=Math.min(f,e.seqLength-a);for(let u=0;u<h;u++)r.push(i+u),o.push(a+u)}mt(g)&&(i+=f),Yt(g)&&(a+=f)}let c=0;for(const l of A.match(/(\d+|\^[A-Za-z]+|[A-Za-z])/g)??[]){if(l.charCodeAt(0)===94)continue;const g=Number(l);if(Number.isFinite(g)&&l!==""){c+=g;continue}c<r.length&&(s.pos.push(r[c]),s.base.push(bA(t,e.seqAt,o[c]))),c+=1}}const bi=1e3;function Vf(t,e,n){switch(e){case"strand":return(t.flag&At.REVERSE)!==0?1:0;case"mapq":return t.mapq===0?0:t.mapq<30?1:2;case"pair":return(t.flag&At.PAIRED)===0?0:(t.flag&At.PROPER_PAIR)!==0?1:2;case"mate":return(t.flag&At.PAIRED)===0?0:(t.flag&At.MATE_UNMAPPED)!==0||t.mateContig<0?1:t.mateContig===n?2:3;case"insert":{const A=Math.abs(t.tlen);return(t.flag&At.PAIRED)===0||A===0?0:A>bi?2:1}default:return 0}}function Zf(t){switch(t){case"strand":return["forward","reverse"];case"mapq":return["MAPQ 0","MAPQ < 30","MAPQ ≥ 30"];case"pair":return["unpaired","proper pair","not a proper pair"];case"mate":return["unpaired","mate unmapped","same sequence","another sequence"];case"insert":return["unpaired","ordinary insert",`insert > ${bi}`];case"basemod":return["reads"];default:return["reads"]}}function jf(t,e,n,A,s,r){const o=t.length,i={contig:e,start:A,end:s,length:o,refStart:new Int32Array(o),refEnd:new Int32Array(o),clipStart:new Int32Array(o),clipEnd:new Int32Array(o),row:new Int16Array(o),flags:new Uint16Array(o),mapq:new Uint8Array(o),mateContig:new Int32Array(o),matePos:new Int32Array(o),tlen:new Int32Array(o),group:new Uint8Array(o),mate:new Int32Array(o).fill(-1),opAt:new Int32Array(o+1),opCode:new Uint8Array(t.reduce((l,g)=>l+g.ops.length,0)),opLen:new Int32Array(t.reduce((l,g)=>l+g.ops.length,0)),diffAt:new Int32Array(o+1),diffPos:new Int32Array(t.reduce((l,g)=>l+g.diffPos.length,0)),diffBase:new Uint8Array(t.reduce((l,g)=>l+g.diffPos.length,0)),contigs:[],groups:Zf(r.colourBy),names:[]};let a=0,c=0;for(let l=0;l<o;l++){const g=t[l];i.refStart[l]=g.refStart,i.refEnd[l]=g.refEnd,i.clipStart[l]=g.clipStart,i.clipEnd[l]=g.clipEnd,i.row[l]=g.row,i.flags[l]=g.flag,i.mapq[l]=g.mapq,i.mateContig[l]=g.mateContig,i.matePos[l]=g.matePos,i.tlen[l]=g.tlen,i.opAt[l]=a;for(const f of g.ops)i.opCode[a]=f&15,i.opLen[a]=f>>>4,a++;i.diffAt[l]=c;for(let f=0;f<g.diffPos.length;f++)i.diffPos[c]=g.diffPos[f],i.diffBase[c]=g.diffBase[f],c++;r.withNames&&i.names.push(g.name)}i.opAt[o]=a,i.diffAt[o]=c,r.colourBy==="basemod"&&(i.mods=th(t));for(let l=0;l<o;l++)i.group[l]=Vf(t[l],r.colourBy,n);return eh(i,n,e,r),nh(i,t),i}function th(t){const e=new Map;let n=0;for(const i of t)for(const a of i.mods??[]){const c=e.get(a.code)??[0,0];a.prob>=128&&c[0]++,c[1]++,e.set(a.code,c),n++}const A=[...e.entries()].sort((i,a)=>a[1][0]-i[1][0]||a[1][1]-i[1][1]||(i[0]<a[0]?-1:1)),s=new Map(A.map(([i],a)=>[i,a])),r={at:new Int32Array(t.length+1),pos:new Int32Array(n),code:new Uint8Array(n),prob:new Uint8Array(n),codes:A.map(([i])=>i),counts:A.map(([,[i]])=>i)};let o=0;for(let i=0;i<t.length;i++){r.at[i]=o;for(const a of t[i].mods??[])r.pos[o]=a.pos,r.code[o]=s.get(a.code)??0,r.prob[o]=a.prob,o++}return r.at[t.length]=o,r}function eh(t,e,n,A){const s=new Map;for(let r=0;r<t.length;r++){const o=t.mateContig[r];if(o<0){t.mateContig[r]=-1;continue}let i=s.get(o);i===void 0&&(i=t.contigs.length,t.contigs.push(o===e?n:A.refNameOf?.(o)??""),s.set(o,i)),t.mateContig[r]=i}}function nh(t,e){const n=new Map;for(let A=0;A<e.length;A++){const s=e[A].name;if(s===""||(t.flags[A]&At.SUPPLEMENTARY)!==0)continue;const r=n.get(s);if(r===void 0){n.set(s,A);continue}t.mate[r]===-1&&t.mate[A]===-1&&((t.flags[r]^t.flags[A])&(At.FIRST_IN_PAIR|At.SECOND_IN_PAIR))!==0&&(t.mate[r]=A,t.mate[A]=r)}}function Di(t){const e=t.split(`
10
+ `,200);let n=0;for(const A of e){const s=A.trim();if(s==="")continue;if(/^(fixedStep|variableStep)\b/i.test(s))return"wig";if(/^track\b/i.test(s)){if(/type\s*=\s*"?bedGraph/i.test(s))return"bedgraph";if(/type\s*=\s*"?wiggle_0/i.test(s))return"wig";continue}if(s.startsWith("#")||/^browser\b/i.test(s))continue;const r=s.split(/\t| +/);if(r.length!==4||!S(r[1])||!S(r[2]))return null;const o=Number(r[3]);if(!Number.isFinite(o)||r[3].trim()==="")return null;if(n+=1,n>=4)return"bedgraph"}return n>0?"bedgraph":null}class Is{constructor(e){this.name=e}starts=[];ends=[];values=[];push(e,n,A){this.starts.push(e),this.ends.push(n),this.values.push(A)}get length(){return this.starts.length}finish(){const e=this.starts.length,n=Int32Array.from({length:e},(i,a)=>a);let A=!0;for(let i=1;i<e;i++)if(this.starts[i]<this.starts[i-1]){A=!1;break}A||n.sort((i,a)=>this.starts[i]-this.starts[a]);const s=new Int32Array(e),r=new Int32Array(e),o=new Float32Array(e);for(let i=0;i<e;i++){const a=n[i];s[i]=this.starts[a],r[i]=this.ends[a],o[i]=this.values[a]}return{name:this.name,starts:s,ends:r,values:o}}}function Mi(t){const e=new Map;let n=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,s=0;for(const r of t.split(`
11
+ `)){const o=r.trim();if(o===""||o.startsWith("#")||/^(track|browser)\b/i.test(o))continue;const i=o.split(/\t| +/);if(i.length<4)continue;const a=Number(i[1]),c=Number(i[2]),l=Number(i[3]);if(!Number.isInteger(a)||!Number.isInteger(c)||!Number.isFinite(l)||c<=a)continue;let g=e.get(i[0]);g===void 0&&(g=new Is(i[0]),e.set(i[0],g)),g.push(a,c,l),s+=1,l<n&&(n=l),l>A&&(A=l)}return ds(e,s,n,A)}function Fi(t){const e=new Map;let n=Number.POSITIVE_INFINITY,A=Number.NEGATIVE_INFINITY,s=0,r=null,o="",i=1,a=1,c=0,l=null;const g=(f,h)=>{l===null||!Number.isFinite(h)||(l.push(f,f+i,h),s+=1,h<n&&(n=h),h>A&&(A=h))};for(const f of t.split(`
12
+ `)){const h=f.trim();if(h===""||h.startsWith("#")||/^(track|browser)\b/i.test(h))continue;const u=/^(fixedStep|variableStep)\s+(.*)$/i.exec(h);if(u!==null){r=u[1].toLowerCase()==="fixedstep"?"fixed":"variable";const I=new Map;for(const d of u[2].split(/\s+/)){const C=d.indexOf("=");C>0&&I.set(d.slice(0,C).toLowerCase(),d.slice(C+1))}if(o=I.get("chrom")??"",i=Number(I.get("span")??1)||1,a=Number(I.get("step")??1)||1,c=(Number(I.get("start")??1)||1)-1,o===""){l=null;continue}l=e.get(o)??new Is(o),e.set(o,l);continue}if(!(r===null||l===null))if(r==="fixed")g(c,Number(h)),c+=a;else{const I=h.split(/\t| +/);if(I.length<2)continue;const d=Number(I[0]);if(!Number.isInteger(d))continue;g(d-1,Number(I[1]))}}return ds(e,s,n,A)}function ds(t,e,n,A){const s=[];for(const r of t.values())r.length>0&&s.push(r.finish());return{contigs:s,length:e,min:Number.isFinite(n)?n:0,max:Number.isFinite(A)?A:0}}class Si{constructor(e){this.set=e;for(const n of e.contigs)this.byName.set(n.name,n)}byName=new Map;held(e){const n=this.byName.get(e);if(n!==void 0)return n;const A=Kt(this.set.contigs,e);return A<0?void 0:this.set.contigs[A]}get contigNames(){return this.set.contigs.map(e=>e.name)}get extent(){return{min:this.set.min,max:this.set.max}}get length(){return this.set.length}has(e){return this.held(e)!==void 0}samples(e,n,A,s){const r=this.held(e);if(r===void 0||A<=n)return null;const o=Ah(r.ends,n);let i=o;for(;i<r.starts.length&&r.starts[i]<A;)i+=1;if(i<=o)return{starts:new Int32Array(0),ends:new Int32Array(0),values:new Float32Array(0),min:null,max:null,summary:!1};const a=Math.max(1,s),c=Math.ceil((A-n)/a);if(i-o<=c)return{starts:r.starts.slice(o,i),ends:r.ends.slice(o,i),values:r.values.slice(o,i),min:null,max:null,summary:!1};const l=new Int32Array(c),g=new Int32Array(c),f=new Float32Array(c),h=new Float32Array(c),u=new Float32Array(c),I=new Float64Array(c),d=new Float64Array(c);h.fill(Number.NaN),u.fill(Number.NaN);for(let C=0;C<c;C++)l[C]=Math.round(n+C*a),g[C]=Math.round(Math.min(A,n+(C+1)*a));for(let C=o;C<i;C++){const E=Math.max(r.starts[C],n),B=Math.min(r.ends[C],A);if(B<=E)continue;const Q=r.values[C],m=Math.max(0,Math.floor((E-n)/a)),p=Math.min(c-1,Math.floor((B-1-n)/a));for(let w=m;w<=p;w++){const y=Math.min(B,g[w])-Math.max(E,l[w]);y<=0||(d[w]+=Q*y,I[w]+=y,(Number.isNaN(h[w])||Q<h[w])&&(h[w]=Q),(Number.isNaN(u[w])||Q>u[w])&&(u[w]=Q))}}for(let C=0;C<c;C++)f[C]=I[C]>0?d[C]/I[C]:Number.NaN;return{starts:l,ends:g,values:f,min:h,max:u,summary:!0}}}function Ah(t,e){let n=0,A=t.length;for(;n<A;){const s=n+A>>1;t[s]<=e?n=s+1:A=s}return n}const sh=1<<18,rh=64<<20;class Qr extends No{constructor(e,n,A=sh,s=rh){super(e,n),this.chunkBytes=A,this.budgetBytes=s}chunks=new Map;inflight=new Map;held=0;end=null;fetched=0;requests=0;async read(e,n,A){if(e<=0||this.end!==null&&n>=this.end)return new Uint8Array(0);const s=Math.floor(n/this.chunkBytes),r=Math.floor((n+e-1)/this.chunkBytes),o=[];let i=null;const a=[];for(let g=s;g<=r;g++){const f=this.inflight.get(g);if(this.chunks.has(g)||f!==void 0){f!==void 0&&!o.includes(f)&&o.push(f),i!==null&&a.push([i,g-1]),i=null;continue}i===null&&(i=g)}i!==null&&a.push([i,r]);for(const[g,f]of a){const h=this.fetchRun(g,f,A);for(let I=g;I<=f;I++)this.inflight.set(I,h);const u=()=>{for(let I=g;I<=f;I++)this.inflight.get(I)===h&&this.inflight.delete(I)};h.then(u,u),o.push(h)}await Promise.all(o);const c=new Uint8Array(e);let l=0;for(let g=s;g<=r;g++){const f=this.chunks.get(g);if(f===void 0)break;this.touch(g,f);const h=g*this.chunkBytes,u=Math.max(n,h)-h,I=Math.min(n+e,h+f.length)-h;if(I<=u||(c.set(f.subarray(u,I),Math.max(n,h)-n),l=Math.max(n,h)-n+(I-u),f.length<this.chunkBytes))break}return l===e?c:c.subarray(0,l)}async fetchRun(e,n,A){const s=e*this.chunkBytes;let r=(n-e+1)*this.chunkBytes;if(this.end!==null&&(r=Math.min(r,Math.max(0,this.end-s))),r<=0)return;this.requests+=1;const o=await super.read(r,s,A);this.fetched+=o.length,o.length<r&&(this.end=s+o.length);for(let i=e;i<=n;i++){const a=(i-e)*this.chunkBytes;if(a>=o.length)break;this.store(i,o.slice(a,Math.min(a+this.chunkBytes,o.length)))}}store(e,n){const A=this.chunks.get(e);for(A!==void 0&&(this.held-=A.length),this.chunks.set(e,n),this.held+=n.length;this.held>this.budgetBytes&&this.chunks.size>1;){const s=this.chunks.keys().next().value,r=this.chunks.get(s);this.chunks.delete(s),this.held-=r.length}}touch(e,n){this.chunks.delete(e),this.chunks.set(e,n)}}const oh=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ih=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),yt=64,Ri=32;function pt(t,e){return t>>>e|t<<32-e}function gn(t){const e=new Uint32Array(ih),n=new Uint32Array(64),A=t.length*8,s=new Uint8Array((Math.floor((t.length+8)/yt)+1)*yt);s.set(t),s[t.length]=128;const r=new DataView(s.buffer);r.setUint32(s.length-8,Math.floor(A/4294967296),!1),r.setUint32(s.length-4,A>>>0,!1);for(let a=0;a<s.length;a+=yt){for(let C=0;C<16;C++)n[C]=r.getUint32(a+C*4,!1);for(let C=16;C<64;C++){const E=n[C-15],B=n[C-2],Q=pt(E,7)^pt(E,18)^E>>>3,m=pt(B,17)^pt(B,19)^B>>>10;n[C]=n[C-16]+Q+n[C-7]+m>>>0}let[c,l,g,f,h,u,I,d]=e;for(let C=0;C<64;C++){const E=pt(h,6)^pt(h,11)^pt(h,25),B=h&u^~h&I,Q=d+E+B+oh[C]+n[C]>>>0,m=pt(c,2)^pt(c,13)^pt(c,22),p=c&l^c&g^l&g,w=m+p>>>0;d=I,I=u,u=h,h=f+Q>>>0,f=g,g=l,l=c,c=Q+w>>>0}e[0]=e[0]+c>>>0,e[1]=e[1]+l>>>0,e[2]=e[2]+g>>>0,e[3]=e[3]+f>>>0,e[4]=e[4]+h>>>0,e[5]=e[5]+u>>>0,e[6]=e[6]+I>>>0,e[7]=e[7]+d>>>0}const o=new Uint8Array(Ri),i=new DataView(o.buffer);for(let a=0;a<8;a++)i.setUint32(a*4,e[a],!1);return o}function xe(t,e){const n=new Uint8Array(yt);n.set(t.length>yt?gn(t):t);const A=new Uint8Array(yt+e.length),s=new Uint8Array(yt+Ri);for(let r=0;r<yt;r++)A[r]=n[r]^54,s[r]=n[r]^92;return A.set(e,yt),s.set(gn(A),yt),gn(s)}function Br(t){let e="";for(const n of t)e+=n.toString(16).padStart(2,"0");return e}function te(t){return new TextEncoder().encode(t)}const ah="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",Er="AWS4-HMAC-SHA256",Li="s3",xi="aws4_request";function ch(t){const e=(n,A=2)=>String(n).padStart(A,"0");return`${e(t.getUTCFullYear(),4)}${e(t.getUTCMonth()+1)}${e(t.getUTCDate())}T${e(t.getUTCHours())}${e(t.getUTCMinutes())}${e(t.getUTCSeconds())}Z`}function DA(t){return encodeURIComponent(t).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}function lh(t){return t===""?"/":t.split("/").map(e=>DA(decodeURIComponent(e))).join("/")}function gh(t){const e=[];return t.forEach((n,A)=>e.push([DA(A),DA(n)])),e.sort((n,A)=>n[0]===A[0]?n[1]<A[1]?-1:1:n[0]<A[0]?-1:1),e.map(([n,A])=>`${n}=${A}`).join("&")}let en=null;function fh(t,e,n){const A=`${t}|${e}|${n}`;if(en!==null&&en.id===A)return en.key;const s=xe(te(`AWS4${t}`),te(e)),r=xe(s,te(n)),o=xe(r,te(Li)),i=xe(o,te(xi));return en={id:A,key:i},i}function hh(t){const e=new URL(t.url),n=t.now??new Date,A=ch(n),s=A.slice(0,8),r=t.payloadHash??ah,{credential:o}=t,i=[["host",e.host],["x-amz-content-sha256",r],["x-amz-date",A]];o.sessionToken!==void 0&&o.sessionToken!==""&&i.push(["x-amz-security-token",o.sessionToken]);const a=i.map(([I,d])=>`${I}:${d.trim()}
13
+ `).join(""),c=i.map(([I])=>I).join(";"),l=[t.method.toUpperCase(),lh(e.pathname),gh(e.searchParams),a,c,r].join(`
14
+ `),g=`${s}/${o.region}/${Li}/${xi}`,f=[Er,A,g,Br(gn(te(l)))].join(`
15
+ `),h=Br(xe(fh(o.secretAccessKey,s,o.region),te(f))),u={Authorization:`${Er} Credential=${o.accessKeyId}/${g}, SignedHeaders=${c}, Signature=${h}`,"x-amz-content-sha256":r,"x-amz-date":A};return o.sessionToken!==void 0&&o.sessionToken!==""&&(u["x-amz-security-token"]=o.sessionToken),u}function uh(t){const e={...t.headers};return t.credential===void 0?e:{...e,...hh({method:(t.method??"GET").toUpperCase(),url:t.url,credential:t.credential})}}function Gi(t,e){const n=e.method??Ih(t);return{...t,headers:{...dh(t?.headers),...uh({...e,method:n})}}}function Ih(t){const e=t?.method;return typeof e=="string"&&e!==""?e:"GET"}function dh(t){if(t===void 0)return{};if(typeof Headers<"u"&&t instanceof Headers){const e={};return t.forEach((n,A)=>{e[A]=n}),e}return Array.isArray(t)?Object.fromEntries(t):{...t}}function Ch(t){const e=[],n=new Set,A=s=>{if(!(s===null||typeof s!="object")){if(ArrayBuffer.isView(s)){const r=s.buffer;r instanceof ArrayBuffer&&!n.has(r)&&(n.add(r),e.push(r));return}if(Array.isArray(s)){if(s.length===0||typeof s[0]!="object")return;for(const r of s)A(r);return}for(const r of Object.values(s))A(r)}};return A(t),e}function Cs(){return typeof MessageChannel>"u"?new Promise(t=>{setTimeout(t,0)}):new Promise(t=>{const e=new MessageChannel;e.port1.onmessage=()=>{e.port1.close(),e.port2.close(),t()},e.port2.postMessage(void 0)})}const Qh=200,Bh=3e3,Eh=3e4,mh=1e3;function wh(t=Qh,e=Bh){const n=[];let A=performance.now();const s=setInterval(()=>{const r=performance.now(),o=r-A;for(A=r,o<Eh?n.push({at:r,span:o,late:Math.max(0,o-t)}):n.length=0;n.length>0&&r-n[0].at>e;)n.shift()},t);return{busy(){if(n.length<3)return 0;let r=0,o=0;for(const i of n)r+=i.span,o+=i.late;return r<=0?0:Math.min(1,o/r)},reset(){n.length=0,A=performance.now()},stop(){clearInterval(s)}}}function ph(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#")||/^(track|browser)\b/.test(s))continue;const r=s.split(/\s+/);if(r.length<2)return[];const o=Number(r[1]);if(!Number.isInteger(o)||o<=0)return[];n.has(r[0])||(n.add(r[0]),e.push({name:r[0],length:o}))}return e}function yh(t,e=""){const n=/\.fai$/i.test(e);let A=0;for(const s of t.split(/\r?\n/,200)){const r=s.trim();if(r===""||r.startsWith("#")||/^(track|browser)\b/.test(r))continue;const o=r.split(/\s+/);if((n?o.length<2:o.length!==2)||!/^\d+$/.test(o[1])||Number(o[1])<=0)return!1;A++}return A>0}const Nh=4096;function kh(t,e){const n=Kt(t.contigs,e);return n<0?void 0:t.contigs[n]}function bh(t,e,n){const A=kh(t,e.contig);if(A===void 0||A.bins===0)return null;const s=Math.max(0,Math.floor(e.start)),r=Math.min(A.length,Math.ceil(e.end));if(!(r>s))return null;const o=Math.floor(s/t.binsize),i=Math.min(A.bins-1,Math.floor((r-1)/t.binsize));if(i<o)return null;const a=i-o+1,c=n?1:Math.max(1,Math.ceil(a/Nh)),l=Math.ceil(a/c),g=new Int32Array(l),f=new Int32Array(l),h=new Float32Array(l),u=c>1?new Float32Array(l):null,I=c>1?new Float32Array(l):null;let d=0;for(let C=0;C<l;C++){const E=o+C*c,B=Math.min(i+1,E+c);let Q=0,m=0,p=Number.POSITIVE_INFINITY,w=Number.NEGATIVE_INFINITY;for(let y=E;y<B;y++){const N=A.startBin+y-t.firstBin;if(N<0||N>=t.values.length)continue;const k=t.values[N];Number.isNaN(k)||(Q+=k,m++,k<p&&(p=k),k>w&&(w=k))}m!==0&&(g[d]=E*t.binsize,f[d]=Math.min(A.length,B*t.binsize),h[d]=Q/m,u!==null&&I!==null&&(u[d]=p,I[d]=w),d++)}return d===0?null:{contig:e.contig,start:s,end:r,starts:g.slice(0,d),ends:f.slice(0,d),values:h.slice(0,d),min:u===null?null:u.slice(0,d),max:I===null?null:I.slice(0,d),variant:null,summary:c>1}}function Dh(t,e,n,A=!1){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;for(const i of e){const a=bh(t,i,A);if(a!==null){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push(a)}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}function T(t,e,n){const A=t[e];return typeof A=="number"&&Number.isFinite(A)?A:n}function st(t,e,n){const A=t[e];return typeof A=="string"?A:n}function Lt(t,e,n){const A=t[e];return typeof A=="boolean"?A:n}function Jn(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n!==""?[n]:[]}function $n(t,e){const n=t[e];return Array.isArray(n)?n.filter(A=>typeof A=="string"):typeof n=="string"&&n.trim()!==""?[n.trim()]:null}function at(t,e){const n=t[e];return typeof n=="string"&&n!==""?n:null}function ne(t,e,n){return{value:t?.[n],chosen:at(e,n)!==null}}function Yn(t,e){return t.value!==void 0?null:t.chosen?e.gone:e.unchosen}function Mh(t){let e=0,n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isNaN(s)||(e+=s,n++)}return n===0?Number.NaN:e/n}function Ui(t){const e=Qs(t);return Bs(e,.5)}function Fh(t,e){const n=Qs(t),A=n.length;if(A===0)return Number.NaN;const s=Number.isFinite(e)?Math.min(.5,Math.max(0,e)):0,r=Math.floor(A*s);if(A-2*r<=0)return Bs(n,.5);let o=0;for(let i=r;i<A-r;i++)o+=n[i];return o/(A-2*r)}function Bt(t,e=0,n=t.length-e){if(n<8){let s=0;for(let r=0;r<n;r++)s+=t[e+r];return s}if(n<=128){let s=t[e],r=t[e+1],o=t[e+2],i=t[e+3],a=t[e+4],c=t[e+5],l=t[e+6],g=t[e+7],f=8;for(;f<n-n%8;f+=8){const u=e+f;s+=t[u],r+=t[u+1],o+=t[u+2],i+=t[u+3],a+=t[u+4],c+=t[u+5],l+=t[u+6],g+=t[u+7]}let h=s+r+(o+i)+(a+c+(l+g));for(;f<n;f++)h+=t[e+f];return h}let A=Math.floor(n/2);return A-=A%8,Bt(t,e,A)+Bt(t,e+A,n-A)}function MA(t,e=0,n=t.length-e){return Bt(t,e,n)/n}const Nn=3;function vi(t,e){const n=Math.min(t.length,e.length);let A=0,s=0,r=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];Number.isNaN(f)||Number.isNaN(h)||(s+=f,r+=h,A++)}if(A<Nn)return Number.NaN;const o=s/A,i=r/A;let a=0,c=0,l=0;for(let g=0;g<n;g++){const f=t[g],h=e[g];if(Number.isNaN(f)||Number.isNaN(h))continue;const u=f-o,I=h-i;a+=u*I,c+=u*u,l+=I*I}return c<=0||l<=0?Number.NaN:a/Math.sqrt(c*l)}function Sh(t,e){const n=Math.min(t.length,e.length);let A=0;for(let i=0;i<n;i++)!Number.isNaN(t[i])&&!Number.isNaN(e[i])&&A++;if(A<Nn)return Number.NaN;const s=new Float64Array(A),r=new Float64Array(A);let o=0;for(let i=0;i<n;i++){const a=t[i],c=e[i];Number.isNaN(a)||Number.isNaN(c)||(s[o]=a,r[o]=c,o++)}return vi(mr(s),mr(r))}function mr(t){const e=t.length,n=new Float64Array(e),A=[];for(let r=0;r<e;r++)Number.isNaN(t[r])?n[r]=Number.NaN:A.push(r);A.sort((r,o)=>t[r]-t[o]);let s=0;for(;s<A.length;){let r=s+1;for(;r<A.length&&t[A[r]]===t[A[s]];)r++;const o=(s+r+1)/2;for(let i=s;i<r;i++)n[A[i]]=o;s=r}return n}function Ti(t,e){const n=Math.max(1,Math.trunc(e)),A=Qs(t);if(A.length===0)return new Float64Array(0);const s=new Float64Array(n+1);for(let r=0;r<=n;r++)s[r]=Bs(A,r/n);return s}function Qs(t){let e=0;for(let s=0;s<t.length;s++)Number.isNaN(t[s])||e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++){const r=t[s];Number.isNaN(r)||(n[A]=r,A++)}return n.sort(),n}function Bs(t,e){const n=t.length;if(n===0)return Number.NaN;if(n===1)return t[0];const A=Math.min(1,Math.max(0,e))*(n-1),s=Math.floor(A),r=Math.min(n-1,s+1),o=A-s;return t[s]+o*(t[r]-t[s])}const Rh=2e5,Lh=50,xh=async t=>{const e=Jn(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig and tick it under Tracks."),[];const n=ne(t.inputs.features,t.params,"features"),A=n.value;if(A===void 0)return t.note(Yn(n,{unchosen:"A FRiP needs the features to measure inside, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),[];const s=[];let r=0;for(let B=0;B<A.contigs.length;B++){const Q=A.contigs[B];let m=Number.NaN,p=Number.NaN;const w=()=>{Number.isNaN(m)||(s.push({contig:Q,start:m,end:p}),r+=p-m)};for(let y=A.contigAt[B];y<A.contigAt[B+1];y++){const N=A.start[y],k=A.end[y];k<=N||(Number.isNaN(m)?(m=N,p=k):N<=p?p=Math.max(p,k):(w(),m=N,p=k))}w()}if(s.length===0)return t.note("The feature set covers no bases, so there is nothing to measure inside."),[];const o=t.inputs.contigLengths??{};let i=0;for(const B of Object.values(o))i+=B;i<=0&&t.note("This session knows no sequence lengths, so the fraction of the assembly the set covers cannot be worked out and the enrichment column is left empty. Load a chrom.sizes, or the map itself.");const a=new Float64Array(s.length);for(let B=0;B<s.length;B++)a[B]=s[B].end-s[B].start;const c=Ui(a),l=Math.max(0,Math.round(T(t.params,"resolution",0))),g=l>0?l:Math.max(1,Math.round(c/Lh)),f=i>0?Math.max(1,Math.round(i/Rh)):g,h=[];for(const[B,Q]of Object.entries(o))Q>0&&h.push({contig:B,start:0,end:Q});const u=B=>t.inputs.labels?.[B]??B,I=[],d=[],C=Lt(t.params,"perFeature",!1);for(let B=0;B<e.length;B++){t.throwIfCancelled();const Q=e[B],m=u(Q);t.progress(B,e.length,`${m} · features`);const p=await wr(t,Q,s,g);t.throwIfCancelled(),t.progress(B+.5,e.length,`${m} · assembly`);const w=h.length>0?await wr(t,Q,h,f):{signal:Number.NaN},y=w.signal>0?p.signal/w.signal:Number.NaN,N=i>0?r/i:Number.NaN;if(I.push({track:m,frip:y,covered:N,enrichment:N>0?y/N:Number.NaN,signal:p.signal,totalSignal:w.signal,inFeature:p.span>0?p.covered/p.span:Number.NaN}),C){const k=await Gh(t,Q,A,g);t.throwIfCancelled();for(const b of k)d.push({track:m,...b,share:w.signal>0?Number(b.signal)/w.signal:Number.NaN})}}t.progress(e.length,e.length,"done"),t.note(`Features read at ${g.toLocaleString()} bp and the assembly at ${f.toLocaleString()} bp — a span-weighted sum estimates the same area at either, and the finer one is spent where the boundaries are.`);const E=[{kind:"table",id:"frip",label:`In ${s.length.toLocaleString()} merged feature${s.length===1?"":"s"}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"frip",label:"FRiP",kind:"number",digits:4,hint:"Signal inside over signal everywhere."},{key:"covered",label:"Genome covered",kind:"number",digits:4,hint:"Merged bases of the set over the assembly."},{key:"enrichment",label:"Enrichment",kind:"number",digits:2,hint:"FRiP over the covered fraction. 1 is a track with no preference."},{key:"signal",label:"Signal inside",kind:"number",digits:0},{key:"totalSignal",label:"Signal total",kind:"number",digits:0},{key:"inFeature",label:"Set with data",kind:"number",digits:3,hint:"Of the set’s bases, how many the track has a value for."}],rows:I.sort((B,Q)=>Number(Q.enrichment)-Number(B.enrichment))}];return C&&d.length>0&&E.push({kind:"table",id:"frip-features",label:"Per feature",columns:[{key:"track",label:"Track",kind:"text"},{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},{key:"signal",label:"Signal",kind:"number",digits:2},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"share",label:"Share of total",kind:"number",digits:6,hint:"This feature’s signal over the track’s whole signal."}],rows:d.sort((B,Q)=>Number(Q.signal)-Number(B.signal))}),E};async function wr(t,e,n,A){const s=new Map;for(const a of n){const c=s.get(a.contig);c===void 0?s.set(a.contig,[a]):c.push(a)}let r=0,o=0,i=0;for(const[,a]of s){t.throwIfCancelled();for(const g of a)o+=g.end-g.start;const c=await t.sample(e,a,A),l=new Map;for(const g of a)l.set(kn(g),g);for(const g of c.regions){const f=l.get(kn(g));if(f!==void 0)for(let h=0;h<g.values.length;h++){const u=g.values[h];if(!Number.isFinite(u))continue;const I=Math.max(f.start,g.starts[h]),d=Math.min(f.end,g.ends[h]);d<=I||(r+=u*(d-I),i+=d-I)}}}return{signal:r,span:o,covered:i}}async function Gh(t,e,n,A){const s=[],r=new Map;for(let o=0;o<n.length;o++){const i=n.contigs[n.contig[o]],a=r.get(i);a===void 0?r.set(i,[o]):a.push(o)}for(const[,o]of r){t.throwIfCancelled();const i=o.map(l=>Uh(n,l)),a=await t.sample(e,i,A),c=new Map;for(const l of a.regions)c.set(kn(l),l);for(let l=0;l<o.length;l++){const g=i[l],f=c.get(kn(g));if(f===void 0)continue;let h=0,u=0;for(let I=0;I<f.values.length;I++){const d=f.values[I];if(!Number.isFinite(d))continue;const C=Math.max(g.start,f.starts[I]),E=Math.min(g.end,f.ends[I]);E<=C||(h+=d*(E-C),u+=E-C)}s.push({contig:g.contig,start:g.start,end:g.end,name:n.name[o[l]]??"",signal:h,mean:u>0?h/u:Number.NaN})}}return s}function Uh(t,e){return{contig:t.contigs[t.contig[e]],start:t.start[e],end:t.end[e]}}function kn(t){return`${t.contig}:${t.start}-${t.end}`}function vh(t){return .5*Th(-t/Math.SQRT2)}function Th(t){const e=Math.abs(t),n=e<2?1-Jh(e):$h(e);return t>=0?n:2-n}function Jh(t){let e=t,n=t;for(let A=1;A<200&&(e*=2*t*t/(2*A+1),n+=e,!(e<Math.abs(n)*1e-17));A++);return 2/Math.sqrt(Math.PI)*Math.exp(-t*t)*n}function $h(t){let n=1/t,A=1e300,s=n;for(let r=1;r<300;r++){const o=r/2;n=t+o*n,n===0&&(n=1e-300),A=t+o/A,A===0&&(A=1e-300),n=1/n;const i=A*n;if(s*=i,Math.abs(i-1)<1e-16)break}return Math.exp(-t*t)/Math.sqrt(Math.PI)*s}function Yh(t){const e=t.length,n=new Float64Array(e).fill(Number.NaN),A=[];for(let o=0;o<e;o++)Number.isFinite(t[o])&&A.push(o);A.sort((o,i)=>t[i]-t[o]);const s=A.length;let r=Number.POSITIVE_INFINITY;for(let o=0;o<s;o++){const i=s/(s-o);r=Math.min(r,i*t[A[o]]),n[A[o]]=Math.min(1,r)}return n}function Ji(t){return t.rows[1]<=t.rows[0]&&t.cols[1]<=t.cols[0]}function Ae(t){let e=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&e++;const n=new Float64Array(e);let A=0;for(let s=0;s<t.length;s++)Number.isFinite(t[s])&&(n[A++]=t[s]);return n.sort()}function ve(t,e){const n=t.length;if(n===0)return Number.NaN;const A=Math.min(n-1,Math.max(0,e*(n-1))),s=Math.floor(A),r=Math.min(n-1,s+1);return t[s]+(t[r]-t[s])*(A-s)}function Oh(t){const e=Ae(t),n=e.length;if(n===0)return{n:0,mean:Number.NaN,sd:Number.NaN,median:Number.NaN,q1:Number.NaN,q3:Number.NaN};let A=0;for(let o=0;o<n;o++)A+=e[o];const s=A/n;let r=0;for(let o=0;o<n;o++)r+=(e[o]-s)**2;return{n,mean:s,sd:n>1?Math.sqrt(r/(n-1)):Number.NaN,median:ve(e,.5),q1:ve(e,.25),q3:ve(e,.75)}}function $i(t){const e=t.length,n=Array.from({length:e},(o,i)=>i).sort((o,i)=>t[o]-t[i]),A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o+1<e&&t[n[o+1]]===t[n[r]];)o++;const i=(r+o)/2+1;for(let c=r;c<=o;c++)A[n[c]]=i;const a=o-r+1;a>1&&(s+=a*a*a-a),r=o+1}return{ranks:A,ties:s}}function _h(t,e){const n=Ae(t),A=Ae(e),s=n.length,r=A.length;if(s===0||r===0)return{u:Number.NaN,z:Number.NaN,p:Number.NaN,effect:Number.NaN};const o=new Float64Array(s+r);o.set(n,0),o.set(A,s);const{ranks:i,ties:a}=$i(o);let c=0;for(let C=0;C<s;C++)c+=i[C];const l=c-s*(s+1)/2,g=s+r,f=s*r/2,h=s*r/12*(g+1-a/(g*(g-1))),u=2*l/(s*r)-1;if(!(h>0))return{u:l,z:0,p:1,effect:u};const I=l-f,d=(I-.5*Math.sign(I))/Math.sqrt(h);return{u:l,z:d,p:Math.min(1,2*vh(-Math.abs(d))),effect:u}}function Kh(t){const e=t.map(Ae).filter(g=>g.length>0),n=e.length,A=e.reduce((g,f)=>g+f.length,0);if(n<2||A<2)return{h:Number.NaN,df:Math.max(0,n-1),p:Number.NaN};const s=new Float64Array(A);let r=0;for(const g of e)s.set(g,r),r+=g.length;const{ranks:o,ties:i}=$i(s);let a=0;r=0;for(const g of e){let f=0;for(let h=0;h<g.length;h++)f+=o[r+h];a+=f*f/g.length,r+=g.length}a=12/(A*(A+1))*a-3*(A+1);const c=1-i/(A*A*A-A);if(!(c>0))return{h:Number.NaN,df:n-1,p:Number.NaN};const l=a/c;return{h:l,df:n-1,p:qh(l,n-1)}}function qh(t,e){return!(e>0)||Number.isNaN(t)?Number.NaN:t<=0?1:Hh(e/2,t/2)}function Hh(t,e){const n=Math.exp(-e+t*Math.log(e)-Yi(t));if(e<t+1){let a=1/t,c=a;for(let l=1;l<1e3&&(a*=e/(t+l),c+=a,!(Math.abs(a)<Math.abs(c)*1e-16));l++);return Math.max(0,1-c*n)}const A=1e-300;let s=e+1-t,r=1/A,o=1/s,i=o;for(let a=1;a<1e3;a++){const c=-a*(a-t);s+=2,o=c*o+s,Math.abs(o)<A&&(o=A),r=s+c/r,Math.abs(r)<A&&(r=A),o=1/o;const l=o*r;if(i*=l,Math.abs(l-1)<1e-16)break}return Math.min(1,n*i)}function Yi(t){if(t<.5)return Math.log(Math.PI/Math.sin(Math.PI*t))-Yi(1-t);const e=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,15056327351493116e-23],n=t-1;let A=e[0];const s=n+7.5;for(let r=1;r<9;r++)A+=e[r]/(n+r);return .5*Math.log(2*Math.PI)+(n+.5)*Math.log(s)-s+Math.log(A)}const Wh=1e4,bn=["#0072b2","#d55e00","#009e73","#cc79a7","#e69f00","#56b4e9","#f0e442","#000000"],Ph="#999999",pr="rest of the genome",he=2e4,zh=async t=>{const e=Jn(t.params,"tracks");if(e.length===0)return t.note("No track was chosen. Load a bigWig, or run a task that makes one, and tick it under Tracks."),[];const n=[];for(const[u,I]of Object.entries(t.inputs.contigLengths??{}))I>0&&n.push({name:u,length:I});if(n.length===0)return t.note("This session knows no sequence lengths, so there is no genome to cut into stretches. Load a chrom.sizes, or the map itself."),[];const A=T(t.params,"resolution",0),s=A>0?Math.round(A):t.framing.binsize>0&&!Ji(t.framing)?t.framing.binsize:Wh;let r=st(t.params,"groupBy","features")==="track"?await Vh(t,n,s):Xh(t,n,s);if(r===null)return[];if(r=Zh(r,t),r.stretches.length===0)return t.note("No stretch of the genome fell in any group, so there is nothing to compare."),[];const o=u=>t.inputs.labels?.[u]??u,i=r.names.length,a=[],c=[],l=[];for(let u=0;u<e.length;u++){t.throwIfCancelled();const I=o(e[u]);t.progress(u,e.length,I);const d=await Es(t,e[u],r.stretches),C=r.names.map(()=>[]);for(let m=0;m<r.stretches.length;m++)Number.isFinite(d[m])&&C[r.stretches[m].group].push(d[m]);if(C.every(m=>m.length===0)){t.note(`${I} has no value over any stretch — its sequence names may not be the assembly's.`);continue}let E=0,B=0;for(const m of C){for(const p of m)B+=p;E+=m.length}for(let m=0;m<i;m++){const p=Oh(C[m]),w=E-p.n,y=w>0?(B-p.mean*p.n)/w:Number.NaN;let N=0;for(const k of r.stretches)k.group===m&&(N+=k.end-k.start);a.push({track:I,group:r.names[m],n:p.n,bases:N,mean:p.mean,sd:p.sd,median:p.median,q1:p.q1,q3:p.q3,vsRest:p.n>0?p.mean-y:Number.NaN})}const Q=C.map((m,p)=>({group:m,g:p})).filter(m=>m.group.length>0);if(Q.length>2){const m=Kh(Q.map(p=>p.group));c.push({track:I,test:"Kruskal–Wallis H",a:`all ${Q.length} groups`,b:"",statistic:m.h,effect:Number.NaN,difference:Number.NaN,p:m.p})}for(let m=0;m<Q.length;m++)for(let p=m+1;p<Q.length;p++){const w=Q[m],y=Q[p],N=_h(w.group,y.group);c.push({track:I,test:"Mann–Whitney U",a:r.names[w.g],b:r.names[y.g],statistic:N.u,effect:N.effect,difference:ve(Ae(w.group),.5)-ve(Ae(y.group),.5),p:N.p})}l.push({kind:"curve",id:`groupsignal-${u+1}`,label:`${I} by ${r.of}`,series:C.map((m,p)=>{const w=Au(m);return{name:r.names[p],x:Float64Array.from(w,(y,N)=>N),y:w,colour:r.colours[p],n:m.length,mark:"violin"}}),xLabel:r.of,yLabel:I,xScale:"linear",yScale:"linear"})}if(t.progress(e.length,e.length,"done"),l.length===0)return[];const g=Yh(c.map(u=>Number(u.p)));c.forEach((u,I)=>{u.q=g[I]});const f=l.some(u=>u.series.some(I=>(I.n??0)>he));t.note(`Compared over ${r.stretches.length.toLocaleString()} stretches of at most ${s.toLocaleString()} bp in ${i} groups, each the track's mean over the bases it has a value for.${f?` A violin of more than ${he.toLocaleString()} is drawn from that many, evenly by rank; the tests use every one.`:""}`);const h=[...l];if(h.push({kind:"table",id:"groupsignal-groups",label:`Groups · ${r.of}`,columns:[{key:"track",label:"Track",kind:"text"},{key:"group",label:"Group",kind:"text"},{key:"n",label:"Stretches",kind:"number"},{key:"bases",label:"Bases",kind:"number"},{key:"mean",label:"Mean",kind:"number",digits:4},{key:"sd",label:"SD",kind:"number",digits:4},{key:"median",label:"Median",kind:"number",digits:4},{key:"q1",label:"Q1",kind:"number",digits:4},{key:"q3",label:"Q3",kind:"number",digits:4},{key:"vsRest",label:"Mean − rest",kind:"number",digits:4,hint:"This group’s mean less that of every other stretch."}],rows:a}),h.push({kind:"table",id:"groupsignal-tests",label:"Between groups",columns:[{key:"track",label:"Track",kind:"text"},{key:"test",label:"Test",kind:"text"},{key:"a",label:"Group",kind:"text"},{key:"b",label:"Against",kind:"text"},{key:"difference",label:"Median difference",kind:"number",digits:4},{key:"effect",label:"Effect",kind:"number",digits:3,hint:"Rank-biserial r: +1 where every value of the group is above every value against it."},{key:"statistic",label:"U or H",kind:"number",digits:2},{key:"p",label:"P",kind:"number",digits:4,scientific:!0},{key:"q",label:"q",kind:"number",digits:4,scientific:!0,hint:"Benjamini–Hochberg, over every test of the run."}],rows:c}),r.segments!==void 0&&h.push({kind:"intervals",id:"groupsignal-segments",label:`Groups · ${r.of}`,payload:{kind:"features",data:r.segments},noun:{one:"segment",many:"segments"},display:"lane",look:"corner"}),st(t.params,"groupBy","features")!=="track"&&Lt(t.params,"perFeature",!1)){const u=await nu(t,e,o);u!==null&&h.push(u)}return h};function Xh(t,e,n){const A=ne(t.inputs.features,t.params,"features"),s={chosen:A.chosen,value:A.chosen?A.value:void 0},r=s.value;if(r===void 0)return t.note(Yn(s,{unchosen:"No feature set was chosen to make the groups from.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),null;const o=st(t.params,"split","name"),i=t.inputs.labels?.[at(t.params,"features")??""]??"the set",a=new Array(r.length).fill(null);let c;if(o==="score"){const Q=Oi(t),m=Ti(r.score,Q);if(m.length===0)return t.note(`${i} carries no scores, so it cannot be cut into quantiles of them.`),null;c=Array.from({length:Q},(p,w)=>_i(w,m));for(let p=0;p<r.length;p++){const w=Ki(r.score[p],m);w>=0&&(a[p]=c[w])}}else if(o==="strand"){c=["+ strand","− strand","no strand"];for(let Q=0;Q<r.length;Q++)a[Q]=r.strand[Q]>0?c[0]:r.strand[Q]<0?c[1]:c[2]}else if(o==="none")c=[i],a.fill(i);else{for(let Q=0;Q<r.length;Q++)a[Q]=r.name[Q]===""?"(no name)":r.name[Q];c=[...new Set(a.filter(Q=>Q!==null))].sort((Q,m)=>Q.localeCompare(m,void 0,{numeric:!0}))}const l=c.filter(Q=>a.includes(Q)),g=Lt(t.params,"outside",!0),f=g?[...l,pr]:l,h=new Map(f.map((Q,m)=>[Q,m])),u=Q=>e.find(m=>m.name===Q)?.length??t.lengthOf(Q),I=new Map,d=new Set;for(let Q=0;Q<r.contigs.length;Q++){const m=r.contigs[Q],p=u(m);if(p===void 0){r.contigAt[Q+1]>r.contigAt[Q]&&d.add(m);continue}const w=f.map(()=>[]);for(let y=r.contigAt[Q];y<r.contigAt[Q+1];y++){const N=a[y];if(N===null)continue;const k=Math.max(0,r.start[y]),b=Math.min(p,r.end[y]);b>k&&w[h.get(N)??0].push([k,b])}I.set(m,w.map(yr))}d.size>0&&t.note(`${[...d].slice(0,6).join(", ")}${d.size>6?", …":""} ${d.size===1?"is":"are"} not a sequence of this assembly, so ${d.size===1?"its":"their"} features were left out.`);const C=[],E=new Map;for(const[Q,m]of I)m.forEach((p,w)=>{for(const[y,N]of p)for(const[k,b]of sA(y,N,n))C.push({contig:Q,start:k,end:b,group:w})}),E.set(Q,yr(m.flat()));if(g){const Q=f.length-1;for(const{name:m,length:p}of e){let w=0;for(const[y,N]of E.get(m)??[]){for(const[k,b]of sA(w,y,n))C.push({contig:m,start:k,end:b,group:Q});w=Math.max(w,N)}for(const[y,N]of sA(w,p,n))C.push({contig:m,start:y,end:N,group:Q})}}const B=o==="score"?"score":o==="strand"?"strand":o==="none"?"":"name";return{names:f,colours:f.map((Q,m)=>Q===pr?Ph:bn[m%bn.length]),stretches:C,of:B===""?i:`${i}, by ${B}`}}async function Vh(t,e,n){const A=at(t.params,"groupTrack");if(A===null)return t.note("No track was chosen to group the bins by."),null;const s=t.inputs.labels?.[A]??A,r=[];for(const h of e)for(let u=0;u<h.length;u+=n)r.push({contig:h.name,start:u,end:Math.min(h.length,u+n),group:-1});const o=await Es(t,A,r),i=st(t.params,"cut","sign")==="quantiles"?"quantiles":"sign";let a;if(i==="sign"){a=["above 0","below 0"];for(let h=0;h<r.length;h++)r[h].group=o[h]>0?0:o[h]<0?1:-1}else{const h=Oi(t),u=Ti(o,h);if(u.length===0)return t.note(`${s} has no value over any bin, so there is nothing to cut into quantiles.`),null;a=Array.from({length:h},(I,d)=>_i(d,u));for(let I=0;I<r.length;I++)r[I].group=Ki(o[I],u)}const c=r.filter(h=>h.group>=0);c.length<r.length&&t.note(`${(r.length-c.length).toLocaleString()} of ${r.length.toLocaleString()} bins had no reading of ${s}${i==="sign"?", or read exactly 0,":""} and are in no group.`);const l=new et;let g=null;const f=()=>{g!==null&&l.add(g.contig,g.start,g.end,{name:a[g.group]}),g=null};for(const h of c){if(g!==null&&g.contig===h.contig&&g.group===h.group&&g.end===h.start){g.end=h.end;continue}f(),g={...h}}return f(),{names:a,colours:a.map((h,u)=>bn[u%bn.length]),stretches:c,of:`${s}, ${i==="sign"?"by sign":"in quantiles"}`,segments:l.finish()}}function Zh(t,e){const n=new Array(t.names.length).fill(0);for(const o of t.stretches)n[o.group]++;if(n.every(o=>o>0))return t;const A=t.names.filter((o,i)=>n[i]===0);e.note(`${A.join(", ")} had no stretch in ${A.length===1?"it":"them"}, and ${A.length===1?"is":"are"} left out.`);const s=t.names.map((o,i)=>i).filter(o=>n[o]>0),r=new Map(s.map((o,i)=>[o,i]));return{...t,names:s.map(o=>t.names[o]),colours:s.map(o=>t.colours[o]),stretches:t.stretches.map(o=>({...o,group:r.get(o.group)??0}))}}function Oi(t){return Math.max(2,Math.min(10,Math.round(T(t.params,"quantiles",4))))}function _i(t,e){const n=A=>Math.abs(A)>=100?A.toFixed(0):A.toPrecision(3);return`Q${t+1} (${n(e[t])} to ${n(e[t+1])})`}function Ki(t,e){if(!Number.isFinite(t)||e.length<2)return-1;const n=e.length-1;if(t<e[0]||t>e[n])return-1;for(let A=0;A<n;A++)if(t<e[A+1])return A;return n-1}function yr(t){const e=[...t].sort((A,s)=>A[0]-s[0]),n=[];for(const[A,s]of e){const r=n[n.length-1];r!==void 0&&A<=r[1]?r[1]=Math.max(r[1],s):n.push([A,s])}return n}function sA(t,e,n){if(!(e>t))return[];if(e-t<=n)return[[t,e]];const A=[];let s=t;for(;s<e;){const o=Math.min(e,(Math.floor(s/n)+1)*n);A.push([s,o]),s=o}A.length>1&&A[0][1]-A[0][0]<n/2&&(A[1][0]=A[0][0],A.shift());const r=A.length-1;return r>0&&A[r][1]-A[r][0]<n/2&&(A[r-1][1]=A[r][1],A.pop()),A}const jh=1<<20,tu=4096;async function Es(t,e,n){const A=new Float64Array(n.length).fill(Number.NaN),s=new Map;n.forEach((r,o)=>{const i=s.get(r.contig);i===void 0?s.set(r.contig,[o]):i.push(o)});for(const[r,o]of s){const i=new Map;for(const l of o){const{start:g,end:f}=n[l];i.set(`${g}-${f}`,{contig:r,start:g,end:f})}const a=[...i.values()].sort((l,g)=>l.start-g.start||l.end-g.end),c=new Map;for(let l=0;l<a.length;){t.throwIfCancelled();let g=l+1,f=a[l].end-a[l].start;for(;g<a.length&&g-l<tu&&(f+=a[g].end-a[g].start,!(f>jh));)g++;const h=await t.sample(e,a.slice(l,g),1);for(const u of h.regions)c.set(`${u.start}-${u.end}`,eu(u,u.start,u.end));l=g}for(const l of o){const g=c.get(`${n[l].start}-${n[l].end}`);g!==void 0&&(A[l]=g)}}return A}function eu(t,e,n){let A=0,s=0;for(let r=0;r<t.values.length;r++){const o=t.values[r];if(!Number.isFinite(o))continue;const i=Math.max(e,t.starts[r]),a=Math.min(n,t.ends[r]);a<=i||(A+=o*(a-i),s+=a-i)}return s>0?A/s:Number.NaN}async function nu(t,e,n){const A=ne(t.inputs.features,t.params,"features").value;if(A===void 0)return null;const s=[];for(let i=0;i<A.length;i++)s.push({contig:A.contigs[A.contig[i]],start:A.start[i],end:A.end[i],group:i});const r=e.map((i,a)=>`track${a+1}`),o=s.map(i=>({contig:i.contig,start:i.start,end:i.end,name:A.name[i.group]??""}));for(let i=0;i<e.length;i++)(await Es(t,e[i],s)).forEach((c,l)=>{o[l][r[i]]=c});return{kind:"table",id:"groupsignal-features",label:"Per feature",columns:[{key:"contig",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"name",label:"Name",kind:"text"},...e.map((i,a)=>({key:r[a],label:n(i),kind:"number",digits:4}))],rows:o}}function Au(t){const e=Ae(t);if(e.length<=he)return e;const n=new Float64Array(he);for(let A=0;A<he;A++)n[A]=e[Math.round(A*(e.length-1)/(he-1))];return n}function su(t,e){const n=Math.max(1,Math.round(e.flank/e.step)),A=n*2,s={slots:A,bodyFrom:n,bodyTo:n,flankStep:e.step},r=[];for(const o of t){const i=e.at==="start"?o.strand<0?o.end:o.start:e.at==="end"?o.strand<0?o.start:o.end:o.start+Math.floor((o.end-o.start)/2),a=e.lengthOf(o.contig),c={from:i-n*e.step,to:i+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l))continue;const f=Math.floor((l-c.from)/e.step),h=Math.floor((c.to-g)/e.step),u=o.strand<0?h:f,I=A-(o.strand<0?f:h);if(!(I>u))continue;const d={start:c.from+f*e.step,end:c.to-h*e.step};r.push({contig:o.contig,start:l,end:g,strand:o.strand,slotFrom:u,slotTo:I,...d.start===l&&d.end===g?{}:{span:d}})}return{windows:r,layout:s}}function ru(t,e){const n=Math.max(0,Math.round(e.flank/e.step)),A=e.body+n*2,s={slots:A,bodyFrom:n,bodyTo:n+e.body,flankStep:e.step},r=[];let o=0;for(const i of t){if(i.end-i.start<e.body){o++;continue}const a=e.lengthOf(i.contig),c={from:i.start-n*e.step,to:i.end+n*e.step},l=Math.max(0,c.from),g=Math.min(a,c.to);if(!(g>l)){o++;continue}const f=Math.round((l-c.from)/e.step),h=Math.round((c.to-g)/e.step),u=i.strand<0?h:f,I=A-(i.strand<0?f:h);if(!(I>u)){o++;continue}const d=Math.min(Math.max(i.start,l),g),C=Math.min(Math.max(i.end,d),g),E=Math.min(Math.max(s.bodyFrom,u),I),B=Math.min(Math.max(s.bodyTo,E),I);r.push({contig:i.contig,start:l,end:g,strand:i.strand,slotFrom:u,slotTo:I,body:{start:d,end:C,slotFrom:E,slotTo:B}})}return{windows:r,layout:s,dropped:o}}function ou(t,e,n){const A=new Float64Array(n).fill(Number.NaN),s=e.slotTo-e.slotFrom;if(s<=0||e.end-e.start<=0)return A;const o=new Float64Array(s),i=new Float64Array(s),a=iu(s),{values:c,starts:l,ends:g}=t,f=e.span?.start??e.start,h=e.span?.end??e.end,u=e.strand<0,I=e.body===void 0;for(let d=0;d<c.length;d++){const C=c[d];if(!Number.isFinite(C))continue;const E=Math.max(f,l[d]),B=Math.min(h,g[d]);if(!(B>E))continue;let Q,m;if(I){const y=(E-f)/(h-f),N=(B-f)/(h-f);Q=u?1-N:y,m=u?1-y:N}else{const y=kr(e,E),N=kr(e,B);Q=u?N:y,m=u?y:N}const p=Math.max(0,Math.floor(Q*s)),w=Math.min(s-1,Math.ceil(m*s)-1);for(let y=p;y<=w;y++){const N=Math.min(m,a[y+1])-Math.max(Q,a[y]);N>0&&(o[y]+=C*N,i[y]+=N)}}for(let d=0;d<s;d++)i[d]>0&&(A[e.slotFrom+d]=o[d]/i[d]);return A}const Nr=new Map;function iu(t){let e=Nr.get(t);if(e===void 0){e=new Float64Array(t+1);for(let n=0;n<=t;n++)e[n]=n/t;Nr.set(t,e)}return e}function kr(t,e){const n=t.body;if(n===void 0){const c=t.span?.start??t.start,l=t.span?.end??t.end,g=(e-c)/(l-c);return t.strand<0?1-g:g}const A=t.strand<0,s=A?t.end:t.start,r=A?n.end:n.start,o=A?n.start:n.end,i=A?t.start:t.end;return(t.slotFrom+rA(e,s,r)*(n.slotFrom-t.slotFrom)+rA(e,r,o)*(n.slotTo-n.slotFrom)+rA(e,o,i)*(t.slotTo-n.slotTo)-t.slotFrom)/(t.slotTo-t.slotFrom)}function rA(t,e,n){if(e===n)return 1;const A=(t-e)/(n-e);return A<0?0:A>1?1:A}function au(t,e,n,A){const s=new Float64Array(n).fill(Number.NaN),r=new Float64Array(n).fill(Number.NaN),o=new Float64Array(n).fill(Number.NaN);if(e===0)return{mean:s,low:r,high:o,n:0};const i=new Float64Array(e),a=[i],c=g=>A.average==="median"?Ui(g):A.average==="trimmed"?Fh(g,A.trim):Mh(g);for(let g=0;g<n;g++){for(let f=0;f<e;f++)i[f]=t[f*n+g];if(s[g]=c(i),A.band==="sd"){const f=qi(a,s[g]);Number.isFinite(f)&&(r[g]=s[g]-f,o[g]=s[g]+f)}}if(A.band==="bootstrap"&&e>1){const g=new Float64Array(A.iterations*n),f=new Int32Array(e),h=new Float64Array(e);for(let d=0;d<A.iterations;d++){for(let C=0;C<e;C++)f[C]=Math.floor(A.rng()*e)%e;for(let C=0;C<n;C++){for(let E=0;E<e;E++)h[E]=t[f[E]*n+C];g[d*n+C]=c(h)}}const u=(1-A.level)/2,I=new Float64Array(A.iterations);for(let d=0;d<n;d++){for(let E=0;E<A.iterations;E++)I[E]=g[E*n+d];const C=Array.from(I).filter(Number.isFinite).sort((E,B)=>E-B);C.length!==0&&(r[d]=C[Math.floor(u*(C.length-1))],o[d]=C[Math.ceil((1-u)*(C.length-1))])}}let l=0;for(let g=0;g<e;g++)for(let f=0;f<n;f++)if(Number.isFinite(t[g*n+f])){l++;break}return{mean:s,low:r,high:o,n:l}}function cu(t){const e=lu(t),n=qi(t,e);if(!Number.isFinite(e))return{mean:e,sd:n,scaled:!1};const A=Number.isFinite(n)&&n>0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(s[r]=A?(o-e)/n:o-e)}return{mean:e,sd:n,scaled:A}}function lu(t){let e=0,n=0;for(const A of t)for(let s=0;s<A.length;s++){const r=A[s];Number.isFinite(r)&&(e+=r,n++)}return n===0?Number.NaN:e/n}function qi(t,e){if(!Number.isFinite(e))return Number.NaN;let n=0,A=0;for(const s of t)for(let r=0;r<s.length;r++){const o=s[r];Number.isFinite(o)&&(n+=(o-e)**2,A++)}return A>1?Math.sqrt(n/(A-1)):Number.NaN}function FA(t){const e=new Float64Array(t.slots),n=t.bodyTo>t.bodyFrom;for(let A=0;A<t.slots;A++)e[A]=n?A:(A-t.bodyFrom+.5)*t.flankStep;return{x:e,label:n?"Position (upstream · body · downstream)":"Distance from the anchor (bp)"}}function Hi(t){let e=(Number.isFinite(t)?Math.trunc(t):0)>>>0;return function(){e=e+1831565813>>>0;let A=e;return A=Math.imul(A^A>>>15,A|1),A^=A+Math.imul(A^A>>>7,A|61),((A^A>>>14)>>>0)/4294967296}}function gu(t,e,n){const A=[];for(let s=0;s<t.length;s++)A.push({contig:t.contigs[t.contig[s]],start:t.start[s],end:t.end[s],strand:n?t.strand[s]:1,rank:e===null?0:fu(t,s,e)});return A}function fu(t,e,n){if(n==="score")return t.score[e];for(const A of t.detail[e].split(ct)){const s=A.search(/[=:]/);if(s<0||A.slice(0,s).trim()!==n)continue;const r=Number.parseFloat(A.slice(s+1).trim());return Number.isFinite(r)?r:Number.NaN}return Number.NaN}function hu(t,e){if(e.rankBy===null||e.subset==="all")return[{name:"all",features:t}];const n=[...t].sort((r,o)=>Number.isNaN(r.rank)?Number.isNaN(o.rank)?0:1:Number.isNaN(o.rank)?-1:o.rank-r.rank);if(e.subset==="top")return[{name:`top ${e.count}`,features:n.slice(0,e.count)}];if(e.subset==="bottom")return[{name:`bottom ${e.count}`,features:n.slice(-e.count)}];const A=[],s=Math.ceil(n.length/e.groups);for(let r=0;r<e.groups;r++){const o=n.slice(r*s,(r+1)*s);o.length!==0&&A.push({name:`group ${r+1}`,features:o})}return A}const uu=async t=>{const e=Jn(t.params,"tracks"),n=ne(t.inputs.features,t.params,"features"),A=n.value;if(e.length===0||A===void 0){const b=Yn(n,{unchosen:"No feature set was chosen. Load a BED or a GTF and pick it under Features.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."});return t.note(e.length===0&&b!==null?"A metaplot needs a track to read and a set of positions to read it at, and neither is in hand.":e.length===0?"No track was chosen. Load a bigWig and tick it under Tracks.":b??""),[]}const s=Lt(t.params,"stranded",!0),r=at(t.params,"rankBy"),o=gu(A,r,s),i=hu(o,{rankBy:r,subset:st(t.params,"subset","all"),count:Math.max(1,Math.round(T(t.params,"count",500))),groups:Math.max(2,Math.round(T(t.params,"groups",4)))}),a=Lt(t.params,"zscore",!1),c=Math.max(1,Math.round(T(t.params,"step",50))),l=Math.max(0,Math.round(T(t.params,"flank",2e3))),g=st(t.params,"mode","reference")==="scaled",f=Math.max(10,Math.round(T(t.params,"body",100))),h=b=>t.lengthOf(b)??Number.MAX_SAFE_INTEGER,u=i.map(b=>g?ru(b.features,{body:f,flank:l,step:c,lengthOf:h}):{...su(b.features,{at:st(t.params,"at","start"),flank:l,step:c,lengthOf:h}),dropped:0}),I=u.reduce((b,D)=>b+D.dropped,0),d=[],C=[],E=u.length===0?null:u[0].layout,B=Lt(t.params,"heatmap",!0),Q=[],m=u.map(b=>({total:new Float64Array(b.windows.length),seen:new Float64Array(b.windows.length)})),p=e.length*i.length;let w=0;for(const b of e){const D=[];for(const[F,R]of i.entries()){t.throwIfCancelled(),t.progress(w,p,`${t.inputs.labels?.[b]??b} · ${R.name}`),w++;const v=u[F];v.windows.length!==0&&D.push({group:F,rows:await Cu(t,b,v.windows,v.layout),count:v.windows.length,layout:v.layout})}a&&cu(D.map(F=>F.rows));for(const F of D){const R=au(F.rows,F.count,F.layout.slots,{average:st(t.params,"average","mean"),trim:.1,band:st(t.params,"band","bootstrap"),iterations:Math.max(20,Math.round(T(t.params,"iterations",200))),level:.95,rng:Hi(Math.round(T(t.params,"seed",1)))}),v=t.inputs.labels?.[b]??b,x=i.length===1?v:`${v} · ${i[F.group].name}`;d.push({name:x,x:FA(F.layout).x,y:R.mean,low:R.low,high:R.high,n:R.n}),B&&(Eu(m[F.group],F.rows,F.count,F.layout.slots),Q.push({group:F.group,rows:Float32Array.from(F.rows),count:F.count,name:x}))}}if(t.progress(p,p,"done"),E===null||d.length===0)return t.note("No feature produced a usable window. Check that the track and the set share an assembly."),[];I>0&&t.note(`${I.toLocaleString()} features were dropped: shorter than the body width, or with no window left after clipping to the sequence.`);const y=FA(E);C.push({kind:"curve",id:"metaplot",label:"Metaplot",series:d,xLabel:y.label,yLabel:a?"Signal (z-score, per track)":"Mean signal",xScale:"linear",yScale:"linear"});const N=Q.length===0?[]:m.map(mu),k={zscore:a,tracks:e.length};return Q.forEach((b,D)=>{C.push(wu(b,N[b.group],D,E,y.label,k))}),C},Iu=1<<20,du=4096;async function Cu(t,e,n,A){const s=new Float64Array(n.length*A.slots).fill(Number.NaN),r=new Map;for(let o=0;o<n.length;o++){const i=r.get(n[o].contig);i===void 0?r.set(n[o].contig,[o]):i.push(o)}for(const[o,i]of r){const a=new Map;for(const g of i){const f=`${n[g].start}-${n[g].end}`,h=a.get(f);h===void 0?a.set(f,[g]):h.push(g)}const c=[...a.keys()].map(g=>{const[f,h]=g.split("-").map(Number);return{contig:o,start:f,end:h}}).sort((g,f)=>g.start-f.start||g.end-f.end),l=new Map;for(let g=0;g<c.length;){t.throwIfCancelled();let f=g+1,h=c[g].end-c[g].start;for(;f<c.length&&f-g<du&&(h+=c[f].end-c[f].start,!(h>Iu));)f++;const u=await t.sample(e,c.slice(g,f),1);g=f;for(const I of u.regions)for(const d of a.get(`${I.start}-${I.end}`)??[]){const C=n[d],{body:E,span:B}=C,Q=`${C.start}-${C.end}:${C.strand}:${C.slotFrom}-${C.slotTo}`+(B===void 0?"":`:${B.start}-${B.end}`)+(E===void 0?"":`:${E.start}-${E.end}:${E.slotFrom}-${E.slotTo}`),m=l.get(Q);if(m!==void 0){s.copyWithin(d*A.slots,m*A.slots,(m+1)*A.slots);continue}l.set(Q,d),s.set(ou(I,C,A.slots),d*A.slots)}}}return s}function Qu(t){const e=Math.max(1,Math.floor(t.length/1e5)),n=[];for(let i=0;i<t.length;i+=e){const a=t[i];Number.isFinite(a)&&n.push(a)}if(n.length===0)return null;n.sort((i,a)=>i-a);const A=i=>n[Math.min(n.length-1,Math.floor(i*(n.length-1)))],s=A(.99),r=n[0]>=0?0:-Math.max(Math.abs(A(.01)),Math.abs(s)),o=n[0]>=0?s:Math.max(Math.abs(A(.01)),Math.abs(s));return o>r?[r,o]:null}function Bu(t){const{x:e}=FA(t);if(e.length===0)return[];if(t.bodyTo>t.bodyFrom)return["","","","",""];const A=t.flankStep>0?t.flankStep:1,s=e[0]-A/2,r=e[e.length-1]+A/2;return[0,.25,.5,.75,1].map(o=>{const i=s+o*(r-s);return Math.abs(i)>=1e4?`${Number((i/1e3).toFixed(1))} kb`:String(Math.round(i))})}function Eu(t,e,n,A){for(let s=0;s<n;s++){let r=0,o=0;for(let i=0;i<A;i++){const a=e[s*A+i];Number.isFinite(a)&&(r+=a,o++)}t.total[s]+=r,t.seen[s]+=o}}function mu(t){const e=t.total.length,n=new Float64Array(e);for(let A=0;A<e;A++)n[A]=t.seen[A]===0?Number.NaN:t.total[A]/t.seen[A];return Array.from({length:e},(A,s)=>s).sort((A,s)=>Number.isNaN(n[A])?Number.isNaN(n[s])?0:1:Number.isNaN(n[s])?-1:n[s]-n[A])}function wu(t,e,n,A,s,r){const{rows:o,count:i}=t,a=new Float32Array(i*A.slots);for(let l=0;l<i;l++)a.set(o.subarray(e[l]*A.slots,(e[l]+1)*A.slots),l*A.slots);const c=Qu(a);return{kind:"matrix",id:n===0?"metaplot-heatmap":`metaplot-heatmap-${n+1}`,label:`${t.name} · per feature${r.zscore?", z-scored":""}`,nrows:i,ncols:A.slots,values:a,xLabel:s,yLabel:r.tracks===1?`Features, strongest first (${i.toLocaleString()})`:`Features, strongest first across ${r.tracks} tracks (${i.toLocaleString()})`,xTicks:Bu(A),yTicks:[],colormap:"viridis",...c===null?{}:{range:c},aspect:"fill"}}const Nt=1,kt=2,bt=4,dt=8,pu=Nt|kt|bt|dt,Wi=(()=>{const t=new Uint8Array(256),e={A:Nt,C:kt,G:bt,T:dt,U:dt,R:Nt|bt,Y:kt|dt,S:bt|kt,W:Nt|dt,K:bt|dt,M:Nt|kt,B:kt|bt|dt,D:Nt|bt|dt,H:Nt|kt|dt,V:Nt|kt|bt,N:pu};for(const[n,A]of Object.entries(e))t[n.charCodeAt(0)]=A,t[n.toLowerCase().charCodeAt(0)]=A;return t})(),yu=(()=>{const t=new Uint8Array(16);for(let e=0;e<16;e++){let n=0;(e&Nt)!==0&&(n|=dt),(e&kt)!==0&&(n|=bt),(e&bt)!==0&&(n|=kt),(e&dt)!==0&&(n|=Nt),t[e]=n}return t})();function $e(t){return!(t instanceof Uint8Array)}const br=200;function Ye(t){const e=t.replace(/\s+/g,"");if(e==="")return{reason:"Type a sequence to search for."};if(e.length>br)return{reason:`${e.length} bases is longer than this searches for (${br}). It looks for short motifs, so a query that long is a job for an aligner.`};const n=new Uint8Array(e.length);for(let A=0;A<e.length;A++){const s=Wi[e.charCodeAt(A)]??0;if(s===0)return{reason:`“${e[A]}” is not a IUPAC base. Use A C G T U and the ambiguity codes R Y S W K M B D H V N.`};n[A]=s}return n}function Pi(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=yu[t[t.length-1-n]??0]??0;return e}function Nu(t){const e=Pi(t);for(let n=0;n<t.length;n++)if(t[n]!==e[n])return!1;return!0}function Dr(t,e,n,A){let s=0;for(let r=0;r<e.length;r++){const o=Wi[t[n+r]??0]??0,i=e[r]??0;if((o===0||(o&~i)!==0)&&(s++,s>A))return s}return s}function ms(t,e,n={}){const A=[];if(e.length===0||t.length<e.length)return{hits:A,truncated:!1};const s=n.offset??0,r=n.limit??Number.POSITIVE_INFINITY,o=Math.max(0,Math.min(e.length-1,Math.floor(n.mismatches??0))),i=n.bothStrands===!0,a=i&&Nu(e),c=i&&!a?Pi(e):null,l=a?0:1,g=t.length-e.length;for(let f=0;f<=g;f++){const h=Dr(t,e,f,o);if(h<=o&&(A.push({start:f+s,end:f+e.length+s,strand:l,mismatches:h}),A.length>=r))return{hits:A,truncated:f<g};if(c!==null){const u=Dr(t,c,f,o);if(u<=o&&(A.push({start:f+s,end:f+e.length+s,strand:-1,mismatches:u}),A.length>=r))return{hits:A,truncated:f<g}}}return{hits:A,truncated:!1}}function ku(t){return Math.max(0,t.length-1)}function bu(t){return t>0?"+":t<0?"−":"±"}function Du(t,e){const n=new et,A=e.replace(/\s+/g,"").toUpperCase();for(const s of t.hits)for(let r=0;r<s.starts.length;r++){const o=s.strands[r],i=s.mismatches?.[r];n.add(s.contig,s.starts[r],s.ends[r],{strand:o,name:`${A} ${bu(o)}`,...i===void 0?{}:{score:i,detail:`${i} ${i===1?"mismatch":"mismatches"}`}})}return n.finish()}function zi(t,e,n){const A=[];let s=0;for(const i of e){const a=Math.max(1,Math.ceil(i.length/n));A.push({name:i.name,startBin:s,bins:a,length:i.length}),s+=a}const r=new Float32Array(s),o=new Map(A.map(i=>[i.name,i]));for(const i of t.hits){const a=o.get(i.contig);if(a!==void 0)for(let c=0;c<i.starts.length;c++){const l=Math.min(a.bins-1,Math.floor(i.starts[c]/n));r[a.startBin+l]+=1}}return{binsize:n,firstBin:0,values:r,contigs:A}}function Mu(t,e,n=0){const A=t.replace(/\s+/g,"").toUpperCase(),s=[...e?["both strands"]:[],...n>0?[`≤ ${n} ${n===1?"mismatch":"mismatches"}`]:[]];return s.length===0?A:`${A} (${s.join(", ")})`}const fn=5e5,Fu=16e6;function Su(t){const e=t.pattern;return typeof e=="string"?e.replace(/\s+/g,"").toUpperCase():""}async function Ru(t,e,n){const A=Math.max(1,Math.min(n.limit,fn)),s=n.mismatches??0,r=n.contigs??t.contigs,o=ku(e),i=t.read?.bind(t),a=Math.max(1,Math.floor(n.piece??Fu)),c=[];let l=0,g=!1;const f=r.reduce((u,I)=>u+I.length,0);let h=0;for(const u of r){if(l>=A){g=!0;break}const I=[];let d=!1;const C=(w,y)=>{const N=A-l-I.length,k=ms(w,e,{bothStrands:n.bothStrands,limit:N+1,mismatches:s,offset:y});for(let b=0;b<Math.min(k.hits.length,N);b++)I.push(k.hits[b]);(k.truncated||k.hits.length>N)&&(d=!0)};if(i===void 0){const w=t.bases(u.name);if(w===void 0)continue;C(w,0),h+=u.length,n.progress?.(h,f,u.name)}else for(let w=0;w<u.length&&!d;w+=a){n.throwIfCancelled?.();const y=Math.min(u.length,w+a),N=await i(u.name,w,Math.min(u.length,y+o));if(N===void 0)break;C(N,w),h+=y-w,n.progress?.(h,f,u.name)}d&&(g=!0);const E=I.length;if(E===0){if(d)break;continue}const B=new Int32Array(E),Q=new Int32Array(E),m=new Int8Array(E),p=s>0?new Uint8Array(E):void 0;for(let w=0;w<E;w++){const y=I[w];B[w]=y.start,Q[w]=y.end,m[w]=y.strand,p!==void 0&&(p[w]=y.mismatches)}if(c.push({contig:u.name,starts:B,ends:Q,strands:m,...p===void 0?{}:{mismatches:p}}),l+=E,d)break}return{hits:c,total:l,truncated:g}}function Xi(t,e,n){if(e===null)return[...t.contigs];const A=new Set(e);if(n.length>0&&n.every(r=>A.has(r)))return[...t.contigs];const s=new Set;for(const r of e){const o=Kt(t.contigs,r);o>=0&&s.add(o)}return t.contigs.filter((r,o)=>s.has(o))}const Lu=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to search."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const A=$n(t.params,"sequences");if(A!==null&&A.length===0)return t.note("No sequence is ticked, so there is nothing to search."),[];const s=Object.entries(t.inputs.contigLengths??{}).filter(([,E])=>E>0).map(([E])=>E),r=Xi(n,A,s);if(r.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to search."),[];const o=r.length===n.contigs.length,i=Su(t.params),a=Ye(i);if($e(a))return t.note(a.reason),[];const c=Lt(t.params,"bothStrands",!0),l=Math.min(fn,Math.max(1,Math.round(T(t.params,"limit",fn)))),g=Math.max(0,Math.min(a.length-1,Math.round(T(t.params,"mismatches",0))));t.progress(0,1,r.length===1?`searching ${r[0].name}`:`searching ${r.length.toLocaleString()} sequences`);const f=await Ru(n,a,{bothStrands:c,limit:l,mismatches:g,contigs:r,...n.read===void 0?{}:{progress:(E,B,Q)=>t.progress(E,B,`searching ${Q}`),throwIfCancelled:()=>t.throwIfCancelled()}});t.progress(1,1,"done");const h=xu(Mu(i,c,g),r,o);if(f.total===0)return t.note(o?`No match for ${h} anywhere in this reference.`:`No match for ${h}.`),[];const u=`${f.total.toLocaleString()} site${f.total===1?"":"s"}`;t.note(f.truncated?`${u} — the search stopped at the limit of ${l.toLocaleString()} and there are more. `+(l<fn?"Raise “Most sites”, or narrow the pattern.":r.length>1?"That is the most one run reports, so narrow the pattern or tick fewer sequences.":"That is the most one run reports, so narrow the pattern."):`${u}, on ${f.hits.length.toLocaleString()} ${f.hits.length===1?"sequence":"sequences"}.`);const I=`motif-${i}${c?"-both":""}${g>0?`-mm${g}`:""}`+(o?"":Gu(r)),d=[Uu(f,i,h,I)],C=vu(t,f,h,I);return C!==null&&d.push(C),d};function xu(t,e,n){return n?t:e.length<=3?`${t} on ${e.map(A=>A.name).join(", ")}`:`${t} on ${e.length.toLocaleString()} sequences`}function Gu(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
16
+ `))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Uu(t,e,n,A){return{kind:"intervals",id:A,label:n,payload:{kind:"features",data:Du(t,e)},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function vu(t,e,n,A){const s=t.framing.binsize,r=On(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none — so there is nothing for a density to be per. Open the map and run it again for that half."),null;const o=zi(e,r,s);return{kind:"profile",id:`${A}-density`,label:`${n} density`,values:o.values,extent:[0,o.values.length],binsize:s,unit:"sites"}}function On(t){const e=t.inputs.contigLengths;if(e===void 0)return[];const n=[];for(const[A,s]of Object.entries(e))s>0&&n.push({name:A,length:s});return n}function Vi(t,e){const n=Math.max(1,Math.round(e)),A=t.length===0?0:Math.ceil(t.length/n),s=new Int32Array(A),r=new Int32Array(A),o=new Int32Array(A),i=new Int32Array(A);for(let a=0;a<A;a++){const c=a*n,l=Math.min(t.length,c+n);let g=0,f=0,h=0,u=0;for(let I=c;I<l;I++)switch(ye[t[I]]){case 0:g++;break;case 1:f++;break;case 2:h++;break;case 3:u++;break}s[a]=g,r[a]=f,o[a]=h,i[a]=u}return{step:n,steps:A,a:s,c:r,g:o,t:i}}function Zi(t,e,n){const A=Math.max(0,Math.floor(Math.max(1,Math.round(e))/2)),s=t.steps;if(A===0||s===0)return t;const r=o=>{const i=new Int32Array(s),a=new Float64Array(s+1);for(let g=0;g<s;g++)a[g+1]=a[g]+o[g];const c=a[s],l=g=>{if(!n)return a[Math.max(0,Math.min(s,g))];const f=Math.floor(g/s);return f*c+a[g-f*s]};for(let g=0;g<s;g++){const f=n?g-Math.min(A,Math.floor((s-1)/2)):g-A,h=n?g+Math.min(A,Math.floor((s-1)/2))+1:g+A+1;i[g]=l(h)-l(f)}return i};return{...t,a:r(t.a),c:r(t.c),g:r(t.g),t:r(t.t)}}function Tu(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n],s=A+t.a[n]+t.t[n];e[n]=s>0?A/s:Number.NaN}return e}function SA(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.g[n]+t.c[n];e[n]=A>0?(t.g[n]-t.c[n])/A:Number.NaN}return e}function Ju(t){const e=new Float32Array(t.steps);for(let n=0;n<t.steps;n++){const A=t.a[n]+t.t[n];e[n]=A>0?(t.a[n]-t.t[n])/A:Number.NaN}return e}function ji(t){const e=new Float32Array(t.length);let n=0;for(let A=0;A<t.length;A++){const s=t[A];Number.isFinite(s)&&(n+=s),e[A]=n}return e}const $u=1e4;function Yu(t){return["gc","gcSkew","atSkew","cumulative"].filter(e=>t[e]!==!1)}function Ou(t){return Ji(t.framing)}const Mr={gc:{name:"GC content",unit:""},gcSkew:{name:"GC skew",unit:""},atSkew:{name:"AT skew",unit:""},cumulative:{name:"Cumulative GC skew",unit:""}},_u=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.refusal!==void 0)return t.note(n.refusal),[];const A=Yu(t.params);if(A.length===0)return t.note("No track was ticked, so there is nothing to make."),[];const s=T(t.params,"resolution",0),r=s>0?Math.round(s):t.framing.binsize>0&&!Ou(t)?t.framing.binsize:$u,o=On(t);if(o.length===0)return t.note("There are no sequences to lay the bins out on. Open a map, or load the FASTA itself."),[];const i=Math.max(0,Math.round(T(t.params,"window",0))),a=Math.max(1,Math.round(i/r)),c=a%2===1?a:a+1,l=new Set(t.framing.circular??[]),g=o.reduce((B,Q)=>B+Math.max(1,Math.ceil(Q.length/r)),0),f={gc:new Float32Array(g).fill(Number.NaN),gcSkew:new Float32Array(g).fill(Number.NaN),atSkew:new Float32Array(g).fill(Number.NaN),cumulative:new Float32Array(g).fill(Number.NaN)},h=[],u=[];let I=0;for(let B=0;B<o.length;B++){const Q=o[B],m=Math.max(1,Math.ceil(Q.length/r));t.progress(B,o.length,Q.name);const p=n.bases(Q.name);if(p===void 0){h.push(Q.name),I+=m;continue}p.length!==Q.length&&u.push(Q.name);const w=Vi(p,r),y=c>1?Zi(w,c,l.has(Q.name)):w,N={gc:Tu(y),gcSkew:SA(y),atSkew:Ju(y),cumulative:ji(SA(w))},k=Math.min(m,w.steps);for(const b of A)f[b].set(N[b].subarray(0,k),I);I+=m}if(t.progress(o.length,o.length,"done"),h.length===o.length)return t.note("The reference has none of the map’s sequences under any name this viewer knows, so nothing could be measured."),[];h.length>0&&t.note(`${h.length.toLocaleString()} of the map’s sequences are not in this reference and are gaps on every track: ${h.slice(0,6).join(", ")}${h.length>6?", …":""}.`),u.length>0&&t.note(`${u.slice(0,6).join(", ")}${u.length>6?", …":""} ${u.length===1?"is":"are"} not the length the map says — the reference may be another assembly version. Bins were read from its start.`),c>1&&t.note(`Each bin was read over ${c} bins (${(c*r).toLocaleString()} bp) centred on it; the cumulative skew sums each bin’s own.`);const d=t.inputs.labels?.[e]??"reference",C=c>1?` · ${(c*r).toLocaleString()} bp window`:"";return A.map(B=>({kind:"profile",id:`composition-${B.toLowerCase()}`,label:`${Mr[B].name} · ${d}${B==="cumulative"?"":C}`,values:f[B],extent:[0,g],binsize:r,unit:Mr[B].unit}))},Oe=19,ta=50,Ku=2e6,qu=5e3,Hu=500,Wu=10;function Fr(t){const e=[0];for(const n of t)e.push(e[e.length-1]+n.length);return{names:t.map(n=>n.name),lengths:t.map(n=>n.length),offsets:e}}function Pu(t,e=Ku){return Math.max(1,Math.ceil(2*t/e-1))}const zu=(()=>{const t=new Int8Array(256).fill(-1);for(const[e,n]of[["A",0],["C",1],["G",2],["T",3]])t[e.charCodeAt(0)]=n,t[e.toLowerCase().charCodeAt(0)]=n;return t})();function Xu(t){const e=t>>>0,n=Math.floor(t/4294967296)>>>0;let A=Math.imul(e^Math.imul(n,2654435761),2246822507);return A^=A>>>13,A=Math.imul(A,3266489909),A^=A>>>16,A>>>0}class Vu{hash=new Uint32Array(1024);position=new Uint32Array(1024);strand=new Int8Array(1024);count=0;push(e,n,A){if(this.count===this.hash.length){const s=this.hash.length*2,r=new Uint32Array(s);r.set(this.hash),this.hash=r;const o=new Uint32Array(s);o.set(this.position),this.position=o;const i=new Int8Array(s);i.set(this.strand),this.strand=i}this.hash[this.count]=e,this.position[this.count]=n,this.strand[this.count]=A,this.count++}finish(){return{hash:this.hash.slice(0,this.count),position:this.position.slice(0,this.count),strand:this.strand.slice(0,this.count),count:this.count}}}function Sr(t,e,n,A=Oe){const s=new Vu,r=4**(A-1),o=new Float64Array(n+1),i=new Float64Array(n+1),a=new Int8Array(n+1);for(let c=0;c<t.names.length;c++){const l=e(t.names[c]);if(l===void 0)continue;const g=t.offsets[c];let f=0,h=0,u=0,I=0,d=0,C=-1,E=0;const B=o.length;for(let Q=0;Q<l.length;Q++){const m=zu[l[Q]];if(m<0){u=0,d=0,E=0;continue}if(f=f%r*4+m,h=Math.floor(h/4)+(3-m)*r,u++,u<A)continue;const p=Q-A+1;if(E++,f===h)continue;const w=f<h?1:-1,y=Xu(f<h?f:h);for(;d>0&&o[(I+d-1)%B]>=y;)d--;for(o[(I+d)%B]=y,i[(I+d)%B]=p,a[(I+d)%B]=w,d++;d>0&&i[I]<=p-n;)I=(I+1)%B,d--;if(E<n)continue;const N=i[I];N!==C&&(s.push(o[I],g+N,a[I]),C=N)}}return s.finish()}function Dn(t,e=t.length,n){let A=new Uint32Array(e);if(n===void 0)for(let o=0;o<e;o++)A[o]=o;else A.set(n.subarray(0,e));let s=new Uint32Array(e);const r=new Uint32Array(65537);for(const o of[0,16]){r.fill(0);for(let i=0;i<e;i++)r[(t[A[i]]>>>o&65535)+1]++;for(let i=0;i<65536;i++)r[i+1]+=r[i];for(let i=0;i<e;i++)s[r[t[A[i]]>>>o&65535]++]=A[i];[A,s]=[s,A]}return A}function Zu(t,e,n=ta){const A=Dn(t.hash,t.count),s=Dn(e.hash,e.count);let r=new Uint32Array(1024),o=new Uint32Array(1024),i=new Int8Array(1024),a=0,c=0,l=0,g=0;for(;l<t.count&&g<e.count;){const f=t.hash[A[l]],h=e.hash[s[g]];if(f<h){l++;continue}if(h<f){g++;continue}let u=l;for(;u<t.count&&t.hash[A[u]]===f;)u++;let I=g;for(;I<e.count&&e.hash[s[I]]===h;)I++;if(u-l>n||I-g>n)c++;else for(let d=l;d<u;d++)for(let C=g;C<I;C++){if(a===r.length){const E=r.length*2,B=new Uint32Array(E);B.set(r),r=B;const Q=new Uint32Array(E);Q.set(o),o=Q;const m=new Int8Array(E);m.set(i),i=m}r[a]=t.position[A[d]],o[a]=e.position[s[C]],i[a]=t.strand[A[d]]===e.strand[s[C]]?1:-1,a++}l=u,g=I}return{x:r.slice(0,a),y:o.slice(0,a),strand:i.slice(0,a),count:a,dropped:c}}function ju(t,e=qu,n=Hu,A=Wu,s){const r=[];s?.fill(-1);let o=0;for(let a=0;a<t.count;a++)t.y[a]>o&&(o=t.y[a]);for(const a of[1,-1]){let c=0;for(let B=0;B<t.count;B++)t.strand[B]===a&&c++;const l=new Uint32Array(c),g=new Uint32Array(c),f=new Uint32Array(c),h=Math.ceil(o/n)+1;for(let B=0,Q=0;B<t.count;B++)t.strand[B]===a&&(l[Q]=B,g[Q]=t.x[B],f[Q]=a===1?Math.round((t.x[B]-t.y[B])/n)+h:Math.round((t.x[B]+t.y[B])/n),Q++);const u=Dn(f,c,Dn(g,c)),I=new Uint32Array(c),d=new Uint32Array(c);for(let B=0;B<c;B++)I[B]=l[u[B]],d[B]=f[u[B]];let C=0;const E=B=>{const Q=B-C;if(Q>=A){let m=Number.POSITIVE_INFINITY,p=Number.NEGATIVE_INFINITY,w=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY;for(let N=C;N<B;N++){const k=I[N];m=Math.min(m,t.x[k]),p=Math.max(p,t.x[k]+Oe),w=Math.min(w,t.y[k]),y=Math.max(y,t.y[k]+Oe)}if(s!==void 0)for(let N=C;N<B;N++)s[I[N]]=r.length;r.push({x0:m,x1:p,y0:w,y1:y,strand:a,anchors:Q})}C=B};for(let B=1;B<=I.length;B++){if(B===I.length){E(B);break}const Q=I[B-1],m=I[B];(d[B-1]!==d[B]||t.x[m]-t.x[Q]>e)&&E(B)}}const i=r.map((a,c)=>c).sort((a,c)=>r[a].x0-r[c].x0||r[a].y0-r[c].y0);if(s!==void 0){const a=new Int32Array(r.length);i.forEach((c,l)=>a[c]=l);for(let c=0;c<t.count;c++)s[c]>=0&&(s[c]=a[s[c]])}return i.map(a=>r[a])}const tI=100,eI=4e5;function nI(t,e,n){const A=e.offsets[e.offsets.length-1],s=n.offsets[n.offsets.length-1],r=Math.max(tI,Math.ceil(Math.max(A,s)/eI)),o=new Uint8Array(Math.ceil(A/r)+1),i=new Uint8Array(Math.ceil(s/r)+1),a=(h,u)=>{const I=Math.floor(h/r);return[I,Math.max(I+1,Math.ceil(u/r))]},c=(h,u,I)=>{const[d,C]=a(u,I);let E=0;for(let B=d;B<C;B++)E+=h[B];return E/(C-d)},l=(h,u,I)=>{const[d,C]=a(u,I);h.fill(1,d,C)},g=new Uint8Array(t.length),f=t.map((h,u)=>u).sort((h,u)=>t[u].anchors-t[h].anchors||h-u);for(const h of f){const u=t[h];c(o,u.x0,u.x1)>.5||c(i,u.y0,u.y1)>.5||(g[h]=1,l(o,u.x0,u.x1),l(i,u.y0,u.y1))}return g}function AI(t,e,n,A,s){const r=e.offsets[e.offsets.length-1],o=n.offsets[n.offsets.length-1],i=Math.max(1,Math.ceil(Math.max(r,o)/Math.max(1,A))),a=Math.max(1,Math.ceil(r/i)),c=Math.max(1,Math.ceil(o/i)),l=new Float32Array(a*c);for(let g=0;g<t.count;g++){if(s!==void 0&&s[g]!==1)continue;const f=Math.min(a-1,Math.floor(t.x[g]/i)),h=Math.min(c-1,Math.floor(t.y[g]/i));l[h*a+f]+=t.strand[g]}return{values:l,ncols:a,nrows:c,cellSize:i}}function Rr(t,e){let n=0,A=t.names.length-1;for(;n<A;){const s=n+A+1>>1;t.offsets[s]<=e?n=s:A=s-1}return{sequence:n,at:e-t.offsets[n]}}const Lr=400;function sI(t,e,n,A,s){const r=t.length,o={x:{label:A,names:[...e.names],lengths:[...e.lengths]},y:{label:s,names:[...n.names],lengths:[...n.lengths]},x0:new Float64Array(r),x1:new Float64Array(r),y0:new Float64Array(r),y1:new Float64Array(r),strand:new Int8Array(r),anchors:new Int32Array(r)};return t.forEach((i,a)=>{o.x0[a]=i.x0,o.x1[a]=i.x1,o.y0[a]=i.y0,o.y1[a]=i.y1,o.strand[a]=i.strand,o.anchors[a]=i.anchors}),o}function xr(t,e){return t.names.map((n,A)=>({label:n,from:t.offsets[A]/e,to:t.offsets[A+1]/e}))}const rI=async t=>{const e=at(t.params,"x"),n=at(t.params,"y");if(t.residues===void 0)return t.note("This session cannot read residues, so there is nothing to set against anything."),[];if(e===null||n===null)return t.note("Choose the two sequence sets: one along x, one along y."),[];const A=t.residues(e),s=t.residues(n);if(A===void 0||s===void 0)return t.note("A sequence set chosen is no longer loaded. Drop the FASTA again, or pick another."),[];for(const R of[A,s])if(R.refusal!==void 0)return t.note(R.refusal),[];const r=Fr(A.contigs),o=Fr(s.contigs),i=r.offsets[r.offsets.length-1],a=Pu(i);t.progress(0,4,"minimizers along x");const c=Sr(r,R=>A.bases(R),a);t.throwIfCancelled(),t.progress(1,4,"minimizers along y");const l=Sr(o,R=>s.bases(R),a);t.throwIfCancelled(),t.progress(2,4,"anchors");const g=Zu(c,l);t.throwIfCancelled(),t.progress(3,4,"streaks");const f=new Int32Array(g.count),h=ju(g,void 0,void 0,void 0,f),u=e===n,I=!u&&st(t.params,"streaks","one to one")==="one to one",d=I?nI(h,r,o):new Uint8Array(h.length).fill(1),C=h.filter((R,v)=>d[v]===1),E=new Uint8Array(g.count);for(let R=0;R<g.count;R++)f[R]>=0&&d[f[R]]===1&&(E[R]=1);const B=Math.round(T(t.params,"cells",Lr)),Q=AI(g,r,o,B>0?B:Lr,E);t.progress(4,4);const m=c.count>0?Math.round(i/c.count):0,p=h.length-C.length;t.note(`Exact ${Oe}-mers, one in about ${m.toLocaleString("en-US")} bases; hashes above ${ta} copies on either side dropped (${g.dropped.toLocaleString("en-US")} of them). ${g.count.toLocaleString("en-US")} anchors, ${h.length.toLocaleString("en-US")} streaks`+(I?`, ${C.length.toLocaleString("en-US")} of them one to one — ${p.toLocaleString("en-US")} a stronger streak had taken the stretch of`:"")+(u?", every one drawn, the set against itself":"")+`. Not an alignment, and it writes none: a streak is ten or more shared ${Oe}-mers along one diagonal.`);const w=[];for(const R of Q.values)Math.abs(R)>=3&&w.push(Math.abs(R));w.sort((R,v)=>R-v);const y=w.length===0?3:Math.max(3,w[Math.floor(.5*(w.length-1))]),N={kind:"matrix",id:"dotplot-density",label:I?"Streaks one to one, the same way round (red) and the other (blue)":"Streaks, the same way round (red) and the other (blue)",nrows:Q.nrows,ncols:Q.ncols,values:Q.values,xLabel:"along x",yLabel:"along y",xTicks:[],yTicks:[],colormap:"RdBu_r",centre:0,range:[-y,y],xSegments:xr(r,Q.cellSize),ySegments:xr(o,Q.cellSize),stats:[{label:"anchors",value:g.count},{label:I?"streaks one to one":"streaks",value:C.length},{label:"bases a cell",value:Q.cellSize}],large:!0,streaks:sI(C,r,o,t.inputs.labels?.[e]??"along x",t.inputs.labels?.[n]??"along y")},k=C.map(R=>{const v=Rr(r,R.x0),x=Rr(o,R.y0);return{xSequence:r.names[v.sequence],xStart:v.at,xEnd:v.at+(R.x1-R.x0),ySequence:o.names[x.sequence],yStart:x.at,yEnd:x.at+(R.y1-R.y0),strand:R.strand===1?"+":"-",anchors:R.anchors}}),b={kind:"table",id:"dotplot-streaks",label:"Streaks",columns:[{key:"xSequence",label:"x sequence",kind:"text"},{key:"xStart",label:"x start",kind:"number",coordinate:"start"},{key:"xEnd",label:"x end",kind:"number",coordinate:"end"},{key:"ySequence",label:"y sequence",kind:"text"},{key:"yStart",label:"y start",kind:"number",coordinate:"start"},{key:"yEnd",label:"y end",kind:"number",coordinate:"end"},{key:"strand",label:"strand",kind:"text",hint:"+ the same way round, − the other"},{key:"anchors",label:"anchors",kind:"number"}],rows:k},D=new vn;for(const R of k)D.add(R.xSequence,R.xStart,R.xEnd,R.ySequence,R.yStart,R.yEnd,{score:R.anchors,name:R.strand==="+"?"same way round":"the other way round",detail:`${R.anchors} anchors`});const F={kind:"intervals",id:"dotplot-pairs",label:"Streaks, as pairs",payload:{kind:"pairs",data:D.finish()},noun:{one:"streak",many:"streaks"},display:"overlay"};return[N,b,F]};function RA(t,e,n,A){const s=Math.abs(t-e);return A&&n>0?Math.min(s,n-s%n):s}function oI(t,e,n){if(t.length===0)return Number.NaN;if(!n||!(e>0)){let i=0;for(const a of t)i+=a;return i/t.length}let A=0,s=0;for(const i of t){const a=2*Math.PI*i/e;A+=Math.sin(a),s+=Math.cos(a)}const o=(Math.atan2(A,s)/(2*Math.PI)*e%e+e)%e;return o>=e?0:o}function Gr(t,e,n,A){if(t.length===0)return null;let s=-1,r=0;for(let i=0;i<t.length;i++){let a=0;for(const c of t)RA(t[i],c,e,n)<=A&&a++;a>r&&(r=a,s=i)}const o=t.filter(i=>RA(t[s],i,e,n)<=A);return{centre:oI(o,e,n),count:o.length}}function iI(t,e,n){let A=-1,s=-1;for(let o=0;o<t.length;o++){const i=t[o];Number.isFinite(i)&&((A<0||i<t[A])&&(A=o),(s<0||i>t[s])&&(s=o))}const r=o=>o<0?Number.NaN:Math.min(n-1,Math.floor(o*e+e/2));return{low:r(A),high:r(s)}}const aI=10;function cI(t){const{length:e,circular:n,low:A,high:s}=t,r=e/8,o=Gr(t.matS,e,n,r),i=Gr(t.parS,e,n,r),a=t.minMatS??aI,c=(h,u)=>RA(h,u,e,n);let l=s,g="skew";if(o!==null&&t.matS.length>=a)l=c(A,o.centre)<c(s,o.centre)?A:s,g="matS";else if(i!==null)l=c(A,i.centre)>c(s,i.centre)?A:s,g="parS";else if(t.coverageAt!==void 0){const h=t.coverageAt(A),u=t.coverageAt(s);Number.isFinite(h)&&Number.isFinite(u)&&h!==u&&(l=h<u?A:s,g="coverage")}return{ori:l===s?A:s,ter:l,rule:g,agreesWithSkew:l===s,matS:o,parS:i}}function lI(t,e,n,A,s){const r=Math.max(s?3:1,Math.round(A)),o=s?r:r+3,i=n>0?r/n:0,a=B=>{let Q=B*i;s||(Q=Math.max(0,Math.min(r-1e-9,Q)));const m=Math.floor(Q),p=Q-m,w=[(1-p)**3/6,(3*p**3-6*p**2+4)/6,(-3*p**3+3*p**2+3*p+1)/6,p**3/6];return{first:s?m-1:m,w}},c=B=>s?(B%o+o)%o:B,l=new Float64Array(o*o),g=new Float64Array(o);let f=0;for(let B=0;B<t.length;B++){const Q=e[B];if(!Number.isFinite(Q))continue;f++;const{first:m,w:p}=a(t[B]);for(let w=0;w<4;w++){const y=c(m+w);g[y]+=p[w]*Q;for(let N=0;N<4;N++)l[y*o+c(m+N)]+=p[w]*p[N]}}let h=0,u=0;for(let B=0;B<e.length;B++)Number.isFinite(e[B])&&(h+=e[B],u++);h=u>0?h/u:0;const I=1e-6*Math.max(1,f/o);for(let B=0;B<o;B++)l[B*o+B]+=I,g[B]+=I*h;const d=gI(l,g,o),C=B=>{if(d===null)return Number.NaN;const{first:Q,w:m}=a(B);let p=0;for(let w=0;w<4;w++)p+=m[w]*d[c(Q+w)];return p},E=new Float64Array(t.length);for(let B=0;B<t.length;B++)E[B]=C(t[B]);return{fitted:E,at:C}}function gI(t,e,n){const A=Float64Array.from(t),s=Float64Array.from(e);for(let o=0;o<n;o++){let i=o;for(let a=o+1;a<n;a++)Math.abs(A[a*n+o])>Math.abs(A[i*n+o])&&(i=a);if(Math.abs(A[i*n+o])<1e-300)return null;if(i!==o){for(let c=0;c<n;c++){const l=A[o*n+c];A[o*n+c]=A[i*n+c],A[i*n+c]=l}const a=s[o];s[o]=s[i],s[i]=a}for(let a=o+1;a<n;a++){const c=A[a*n+o]/A[o*n+o];if(c!==0){for(let l=o;l<n;l++)A[a*n+l]-=c*A[o*n+l];s[a]-=c*s[o]}}}const r=new Float64Array(n);for(let o=n-1;o>=0;o--){let i=s[o];for(let a=o+1;a<n;a++)i-=A[o*n+a]*r[a];r[o]=i/A[o*n+o]}return r}function fI(t){let e=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY;for(const s of t)Number.isFinite(s)&&(s>e&&(e=s),s<n&&(n=s));return{ratio:n>0&&Number.isFinite(e)?e/n:Number.NaN,highest:e,lowest:n}}const hI="TGTTNCACGTGNAACA",uI="GTGACRNYGTCAC";function II(t,e){const n=t[e];return n==null?e==="parS"?hI:uI:typeof n=="string"?n.replace(/\s+/g,"").toUpperCase():""}const dI=5e3,oA={matS:"nearest the matS cluster",parS:"farthest from the parS cluster",coverage:"lower coverage",skew:"skew maximum"};function Ur(t,e,n){const A={mids:[],starts:[],ends:[],strands:[],mismatches:[]};if(e===null)return A;for(const s of ms(t,e,{bothStrands:!0,mismatches:n}).hits)A.mids.push((s.start+s.end)/2),A.starts.push(s.start),A.ends.push(s.end),A.strands.push(s.strand),A.mismatches.push(s.mismatches);return A}const CI=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to read."),[];if(e===null)return t.note("No reference was chosen. Load the genome’s FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.refusal!==void 0)return t.note(n.refusal),[];const A={parS:{motif:null,pattern:"",mismatches:0},matS:{motif:null,pattern:"",mismatches:0}};for(const N of["parS","matS"]){const k=II(t.params,N);if(k==="")continue;const b=Ye(k);if($e(b)){t.note(`${N}: ${b.reason} Its step was skipped.`);continue}const D=Math.round(T(t.params,`${N}Mismatches`,N==="parS"?1:0));A[N]={motif:b,pattern:k,mismatches:Math.max(0,Math.min(b.length-1,D))}}const s=Math.max(100,Math.round(T(t.params,"window",5e3))),r=Math.max(10,Math.min(s,Math.round(T(t.params,"step",1e3)))),o=Math.max(4,Math.min(40,Math.round(T(t.params,"knots",10)))),i=at(t.params,"coverage"),a=new Set(t.framing.circular??[]),c=On(t),l=c.length>0?c.map(N=>N.name):n.contigs.map(N=>N.name),g=$n(t.params,"sequences"),f=g===null?l:l.filter(N=>g.includes(N));if(f.length===0)return t.note("No sequence is ticked, so there is nothing to read."),[];const h=new et,u=new et,I=new et;let d=0,C=0;const E=[],B=new Map,Q=[];for(let N=0;N<f.length;N++){const k=f[N];t.progress(N,f.length,k);const b=n.bases(k);if(b===void 0){Q.push(k);continue}const D=b.length;if(D<4*s){Q.push(k);continue}const F=a.has(k),R=Vi(b,r),v=SA(Zi(R,Math.max(1,Math.round(s/r)),F)),x=iI(ji(v),r,D);if(!Number.isFinite(x.low)||!Number.isFinite(x.high)){Q.push(k);continue}const Y=Ur(b,A.parS.motif,A.parS.mismatches),J=Ur(b,A.matS.motif,A.matS.mismatches);let K,V=Number.NaN;if(i!==null){const L=(await t.sample(i,[{contig:k,start:0,end:D}],dI)).regions[0];if(L!==void 0&&L.values.length>3){const $=new Float64Array(L.values.length),Dt=new Float64Array(L.values.length);for(let P=0;P<L.values.length;P++)$[P]=(L.starts[P]+L.ends[P])/2,Dt[P]=L.values[P];const Ut=lI($,Dt,D,o,F);K=Ut.at,B.set(k,Ut.at),V=fI(Ut.fitted).ratio}}const H=cI({length:D,circular:F,low:x.low,high:x.high,parS:Y.mids,matS:J.mids,...K===void 0?{}:{coverageAt:K}}),ht=Math.floor(s/2),Gt=`${oA[H.rule]}${H.agreesWithSkew?"":" · disagrees with the skew"}`;for(const[q,L]of[["ori",H.ori],["ter",H.ter]])h.add(k,Math.max(0,L-ht),Math.min(D,L+ht),{name:q,detail:q==="ter"?`terminus · ${Gt}`:"origin"});for(let q=0;q<Y.starts.length;q++)u.add(k,Y.starts[q],Y.ends[q],{strand:Y.strands[q],name:"parS",score:Y.mismatches[q],detail:`${Y.mismatches[q]} ${Y.mismatches[q]===1?"mismatch":"mismatches"}`});for(let q=0;q<J.starts.length;q++)I.add(k,J.starts[q],J.ends[q],{strand:J.strands[q],name:"matS",score:J.mismatches[q],detail:`${J.mismatches[q]} ${J.mismatches[q]===1?"mismatch":"mismatches"}`});d+=Y.starts.length,C+=J.starts.length,H.agreesWithSkew||t.note(`${k}: the terminus was placed ${oA[H.rule]}, at the cumulative skew’s minimum — which is where the skew alone would put the origin. Check the assembly, or the motifs.`),E.push({sequence:k,length:D,topology:F?"circular":"linear",ori:H.ori+1,ter:H.ter+1,rule:oA[H.rule],parS:Y.starts.length,parSCluster:H.parS?.count??0,matS:J.starts.length,ratio:V})}if(t.progress(f.length,f.length,"done"),Q.length>0&&t.note(`${Q.length.toLocaleString()} ${Q.length===1?"sequence was":"sequences were"} not placed — not in the reference, or shorter than four skew windows: ${Q.slice(0,6).join(", ")}${Q.length>6?", …":""}.`),E.length===0)return[];i===null&&t.note("No coverage track was chosen, so there is no ori/ter ratio and no coverage step.");const m=E.filter(N=>N.topology==="linear").length;m>0&&t.note(`${m.toLocaleString()} ${m===1?"sequence was":"sequences were"} read as linear. A bacterial chromosome is usually circular — tick it in the Chromosomes table and run this again, or the origin at its first base is split between its two ends.`);const w=[{kind:"intervals",id:"oriter-loci",label:`Origin and terminus · ${t.inputs.labels?.[e]??"reference"}`,payload:{kind:"features",data:h.finish()},noun:{one:"locus",many:"loci"},display:"lane",look:"point"}];d>0&&w.push({kind:"intervals",id:"oriter-pars",label:`parS sites · ${A.parS.pattern}`,payload:{kind:"features",data:u.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"}),C>0&&w.push({kind:"intervals",id:"oriter-mats",label:`matS sites · ${A.matS.pattern}`,payload:{kind:"features",data:I.finish()},noun:{one:"site",many:"sites"},display:"lane",look:"point"});const y=t.framing.binsize;if(B.size>0&&y>0&&c.length>0){const N=c.reduce((F,R)=>F+Math.max(1,Math.ceil(R.length/y)),0),k=new Float32Array(N).fill(Number.NaN);let b=0;for(const F of c){const R=Math.max(1,Math.ceil(F.length/y)),v=B.get(F.name);if(v!==void 0)for(let x=0;x<R;x++)k[b+x]=v(Math.min(F.length-1,(x+.5)*y));b+=R}const D=t.inputs.labels?.[i??""]??"coverage";w.push({kind:"profile",id:"oriter-coverage-fit",label:`${D} · spline fit`,values:k,extent:[0,N],binsize:y,unit:""})}return w.push({kind:"table",id:"oriter-table",label:"Origin and terminus per sequence",columns:[{key:"sequence",label:"sequence",kind:"text"},{key:"length",label:"length",kind:"number"},{key:"topology",label:"read as",kind:"text"},{key:"ori",label:"ori",kind:"number",hint:"Centre of the origin locus, 1-based."},{key:"ter",label:"ter",kind:"number",hint:"Centre of the terminus locus, 1-based."},{key:"rule",label:"terminus placed by",kind:"text"},{key:"parS",label:"parS",kind:"number",hint:"Sites found on this sequence."},{key:"parSCluster",label:"in cluster",kind:"number",hint:"parS sites within an eighth of the sequence of the densest one."},{key:"matS",label:"matS",kind:"number",hint:"Sites found on this sequence."},{key:"ratio",label:"ori/ter",kind:"number",digits:2,hint:"Highest over lowest smoothed coverage: copies of the origin per copy of the terminus."}],rows:E}),w};function LA(t,e,n){const A=t.contigs.indexOf(e);if(A<0)return[];const s=[];for(let r=t.contigAt[A];r<t.contigAt[A+1];r++){const o=t.start[r],i=t.end[r];if(i<=o)continue;const a=s[s.length-1];a!==void 0&&o<=a[1]?a[1]=Math.max(a[1],i):s.push([o,i])}return s}function vr(t){let e=0;for(const[n,A]of t)e+=A-n;return e}function QI(t,e){let n=0,A=0,s=0;for(;A<t.length&&s<e.length;){const r=Math.max(t[A][0],e[s][0]),o=Math.min(t[A][1],e[s][1]);o>r&&(n+=o-r),t[A][1]<e[s][1]?A++:s++}return n}function Tr(t,e,n,A){const s=t.contigs.indexOf(e);if(s<0||n.length===0)return 0;let r=0,o=0;for(let i=t.contigAt[s];i<t.contigAt[s+1];i++){const a=t.start[i],c=t.end[i],l=c-a;if(l<=0)continue;for(;o<n.length&&n[o][1]<=a;)o++;let g=0;for(let f=o;f<n.length&&n[f][0]<c;f++)g+=Math.max(0,Math.min(c,n[f][1])-Math.max(a,n[f][0]));g/l>=A&&g>0&&r++}return r}function ea(t,e,n){const A=new Set([...t.contigs,...e.contigs]);let s=0,r=0,o=0,i=0,a=0;for(const l of A){const g=LA(t,l,n.minFraction),f=LA(e,l,n.minFraction);s+=vr(g),r+=vr(f),o+=QI(g,f),i+=Tr(t,l,f,n.minFraction),a+=Tr(e,l,g,n.minFraction)}const c=s+r-o;return{basesA:s,basesB:r,intersection:o,union:c,jaccard:c>0?o/c:Number.NaN,featuresAHit:i,featuresBHit:a,featuresA:t.length,featuresB:e.length}}function BI(t,e,n,A,s){let r=0,o=0,i=0,a=0,c=0,l=Number.NaN,g=Number.NaN;const f=()=>{if(!Number.isNaN(l)){for(o+=g-l;c<A.length&&A[c][1]<=l;)c++;for(let h=c;h<A.length&&A[h][0]<g;h++)r+=Math.min(g,A[h][1])-Math.max(l,A[h][0])}};for(let h=0;h<n.length;h++){const u=n[h],I=t[u],d=I+e[u];for(;a<A.length&&A[a][1]<=I;)a++;let C=0;for(let B=a;B<A.length&&A[B][0]<d;B++)C+=Math.max(0,Math.min(d,A[B][1])-Math.max(I,A[B][0]));const E=d-I;E>0&&C>0&&C/E>=s&&i++,Number.isNaN(l)?(l=I,g=d):I<=g?g=Math.max(g,d):(f(),l=I,g=d)}return f(),{intersection:r,covered:o,hits:i}}function iA(t,e){const n=e.length;let A=0;for(let c=0;c<n;c++)A+=e[c];const s=n>0?A/n:Number.NaN;let r=0;for(let c=0;c<n;c++)r+=(e[c]-s)**2;const o=n>1?Math.sqrt(r/(n-1)):Number.NaN;let i=0,a=0;for(let c=0;c<n;c++)e[c]>=t&&i++,e[c]<=t&&a++;return{observed:t,mean:s,sd:o,z:o>0?(t-s)/o:Number.NaN,fold:s>0?t/s:Number.NaN,pEnriched:(i+1)/(n+1),pDepleted:(a+1)/(n+1)}}function EI(t,e,n){const A=ea(t,e,{minFraction:n.minFraction}),s=[],r=[],o=[];for(const I of t.contigs){const d=t.contigs.indexOf(I),C=[];let E=0;for(let m=t.contigAt[d];m<t.contigAt[d+1];m++){const p=t.end[m]-t.start[m];p<=0||(C.push(p),E=Math.max(E,t.end[m]))}if(C.length===0)continue;let Q=n.lengthOf(I);if(Q===void 0||Q<=0){const m=e.contigs.indexOf(I);let p=E;if(m>=0)for(let w=e.contigAt[m];w<e.contigAt[m+1];w++)p=Math.max(p,e.end[w]);Q=p,r.push(I)}if(!Number.isFinite(Q)||Q<=0){o.push(I);continue}s.push({contig:I,length:Q,lengths:C,runs:LA(e,I)})}if(s.length===0)return null;const i=Math.max(1,Math.trunc(n.iterations)),a=Hi(n.seed),c=new Float64Array(i),l=new Float64Array(i),g=new Float64Array(i);let f=0;for(const I of s)f=Math.max(f,I.lengths.length);const h=new Float64Array(f),u=new Int32Array(f);for(let I=0;I<i;I++){if(n.cancelled?.()===!0)return null;let d=0,C=0,E=0;for(const Q of s){const m=Q.lengths.length;for(let y=0;y<m;y++){const N=Math.max(0,Q.length-Q.lengths[y]);h[y]=Math.floor(a()*(N+1)),u[y]=y}const p=u.subarray(0,m);p.sort((y,N)=>h[y]-h[N]);const w=BI(h,Q.lengths,p,Q.runs,n.minFraction);d+=w.intersection,C+=w.covered,E+=w.hits}l[I]=d,g[I]=E;const B=C+A.basesB-d;c[I]=B>0?d/B:Number.NaN,n.onProgress?.(I+1,i)}return{iterations:i,jaccard:iA(A.jaccard,c),intersection:iA(A.intersection,l),featuresHit:iA(A.featuresAHit,g),assumedLengths:r,droppedContigs:o}}const mI=async t=>{const e=ne(t.inputs.features,t.params,"a"),n=ne(t.inputs.features,t.params,"b"),A=e.value,s=n.value;if(A===void 0||s===void 0){const u=[e,n].filter(d=>d.value===void 0),I=u.filter(d=>d.chosen).length;return t.note(I===u.length?`The interval ${u.length===2?"sets":"set"} chosen ${u.length===2?"are":"is"} no longer loaded. Re-open the file, or pick another.`:`Two interval sets are needed and ${u.length===2&&I===0?"neither has":"one has not"} been chosen. Load two BED files, or a BED and a GTF, and pick one in each box.`),[]}t.progress(0,1,"comparing");const r=ea(A,s,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6)))});t.progress(1,1,"done"),Number.isFinite(r.jaccard)||t.note("Neither set covers any bases, so there is nothing to compare.");const i=[{kind:"table",id:"overlap",label:"Overlap",columns:[{key:"measure",label:"Measure",kind:"text"},{key:"value",label:"Value",kind:"number",digits:4},{key:"note",label:"Note",kind:"text"}],rows:[{measure:"Jaccard (bases)",value:r.jaccard,note:"Symmetric; 1 is identical."},{measure:"Shared bases",value:r.intersection,note:""},{measure:"Bases in either",value:r.union,note:""},{measure:"Bases in the first",value:r.basesA,note:"After merging its own overlaps."},{measure:"Bases in the second",value:r.basesB,note:"After merging its own overlaps."},{measure:"First set hit",value:r.featuresA===0?Number.NaN:r.featuresAHit/r.featuresA,note:`${r.featuresAHit.toLocaleString()} of ${r.featuresA.toLocaleString()} features.`},{measure:"Second set hit",value:r.featuresB===0?Number.NaN:r.featuresBHit/r.featuresB,note:`${r.featuresBHit.toLocaleString()} of ${r.featuresB.toLocaleString()} features.`}]}];if(!Lt(t.params,"shuffle",!1))return i;const a=st(t.params,"shuffleWhich","a")!=="b",c=Math.max(20,Math.trunc(T(t.params,"iterations",1e3)));t.progress(0,c,"shuffling");const l=EI(a?A:s,a?s:A,{minFraction:Math.max(0,Math.min(1,T(t.params,"minFraction",1e-6))),iterations:c,seed:T(t.params,"seed",1),lengthOf:u=>t.lengthOf(u),cancelled:()=>t.cancelled(),onProgress:(u,I)=>t.progress(u,I,"shuffling")});if(t.throwIfCancelled(),l===null)return t.note("The set chosen to move occupies no sequence this session knows a length for, so there was nothing to shuffle it within. Load the assembly — a chrom.sizes, or the map itself."),i;l.assumedLengths.length>0&&t.note(`${l.assumedLengths.length.toLocaleString()} sequence${l.assumedLengths.length===1?" has":"s have"} no known length, so the null was drawn over the furthest position either set reaches there — which is shorter than the sequence and overstates the enrichment. ${l.assumedLengths.slice(0,6).join(", ")}${l.assumedLengths.length>6?", …":""}.`),l.droppedContigs.length>0&&t.note(`${l.droppedContigs.length.toLocaleString()} sequence${l.droppedContigs.length===1?"":"s"} could not be shuffled at all and ${l.droppedContigs.length===1?"is":"are"} left out of the null: ${l.droppedContigs.slice(0,6).join(", ")}${l.droppedContigs.length>6?", …":""}.`);const g=a?"first":"second",f=(u,I,d)=>({measure:u,observed:I.observed,expected:I.mean,fold:I.fold,z:I.z,p:I.observed>=I.mean?I.pEnriched:I.pDepleted,tail:I.observed>=I.mean?"enriched":"depleted",digits:d}),h=[f("Jaccard (bases)",l.jaccard,4),f("Shared bases",l.intersection,0),f(`Features of the ${g} set hit`,l.featuresHit,0)].map(({digits:u,...I})=>I);return i.push({kind:"table",id:"overlap-null",label:`Against ${l.iterations.toLocaleString()} shuffles of the ${g} set`,columns:[{key:"measure",label:"Measure",kind:"text"},{key:"observed",label:"Observed",kind:"number",digits:4},{key:"expected",label:"Expected",kind:"number",digits:4,hint:"Mean of the null."},{key:"fold",label:"Fold",kind:"number",digits:2,hint:"Observed over expected."},{key:"z",label:"z",kind:"number",digits:2},{key:"p",label:"p",kind:"number",digits:5,hint:`Permutation p on the tail the observation fell on, with Phipson and Smyth’s +1: the smallest this run can report is ${(1/(l.iterations+1)).toPrecision(2)}.`},{key:"tail",label:"Tail",kind:"text"}],rows:h}),i},$t={maxIter:3e3,convergenceEps:1e-6,start:[.1,1,.2,.5],pseudoValueEps:1e-8,finalPseudoValueEps:1e-12,emStepsPerRound:30},Ct=[0,.2,.1,.01],ee=[20,20,.99,.99],Jr={min:Ct,max:ee};class se extends Error{constructor(e){super(e),this.name="IdrError"}}const hn=new Float64Array(1),$r=new Int32Array(hn.buffer),na=new Uint8Array(Float64Array.of(1).buffer)[7]===63?1:0,wI=1-na,Yr=.8450629115104675,pI=.1283791670955126,yI=1.0270333367641007,Me=[.12837916709551256,-.3250421072470015,-.02848174957559851,-.005770270296489442,-23763016656650163e-21],Fe=[.39791722395915535,.0650222499887673,.005081306281875766,.00013249473800432164,-3960228278775368e-21],zt=[-.0023621185607526594,.41485611868374833,-.3722078760357013,.31834661990116175,-.11089469428239668,.035478304325618236,-.002166375594868791],ce=[.10642088040084423,.540397917702171,.07182865441419627,.12617121980876164,.01363708391202905,.011984499846799107],Tt=[-.009864944034847148,-.6938585727071818,-10.558626225323291,-62.375332450326006,-162.39666946257347,-184.60509290671104,-81.2874355063066,-9.814329344169145],Jt=[19.651271667439257,137.65775414351904,434.56587747522923,645.3872717332679,429.00814002756783,108.63500554177944,6.570249770319282,-.0604244152148581],Xt=[-.0098649429247001,-.799283237680523,-17.757954917754752,-160.63638485582192,-637.5664433683896,-1025.0951316110772,-483.5191916086514],Vt=[30.33806074348246,325.7925129965739,1536.729586084437,3199.8582195085955,2553.0504064331644,474.52854120695537,-22.44095244658582];function Or(t){hn[0]=t;const e=$r[na],n=e&2147483647;if(n>=2146435072)return 1-(e>>>31<<1)+1/t;if(n<1072365568){if(n<1043333120)return n<8388608?.125*(8*t+yI*t):t+pI*t;const c=t*t,l=Me[0]+c*(Me[1]+c*(Me[2]+c*(Me[3]+c*Me[4]))),g=1+c*(Fe[0]+c*(Fe[1]+c*(Fe[2]+c*(Fe[3]+c*Fe[4])))),f=l/g;return t+t*f}if(n<1072955392){const c=Math.abs(t)-1,l=zt[0]+c*(zt[1]+c*(zt[2]+c*(zt[3]+c*(zt[4]+c*(zt[5]+c*zt[6]))))),g=1+c*(ce[0]+c*(ce[1]+c*(ce[2]+c*(ce[3]+c*(ce[4]+c*ce[5])))));return e>=0?Yr+l/g:-Yr-l/g}if(n>=1075314688)return e>=0?1-1e-300:1e-300-1;const A=Math.abs(t),s=1/(A*A);let r,o;n<1074191214?(r=Tt[0]+s*(Tt[1]+s*(Tt[2]+s*(Tt[3]+s*(Tt[4]+s*(Tt[5]+s*(Tt[6]+s*Tt[7])))))),o=1+s*(Jt[0]+s*(Jt[1]+s*(Jt[2]+s*(Jt[3]+s*(Jt[4]+s*(Jt[5]+s*(Jt[6]+s*Jt[7])))))))):(r=Xt[0]+s*(Xt[1]+s*(Xt[2]+s*(Xt[3]+s*(Xt[4]+s*(Xt[5]+s*Xt[6]))))),o=1+s*(Vt[0]+s*(Vt[1]+s*(Vt[2]+s*(Vt[3]+s*(Vt[4]+s*(Vt[5]+s*Vt[6]))))))),hn[0]=A,$r[wI]=0;const i=hn[0],a=Math.exp(-i*i-.5625)*Math.exp((i-A)*(i+A)+r/o);return e>=0?1-a/A:a/A-1}function un(t,e,n,A){const s=(t-e)/n;return .5*A*Or(s/Math.SQRT2)+.5*(1-A)*Or(t/Math.SQRT2)+.5}function _r(t,e,n,A,s,r,o){let i=0;for(let a=0;a<1e3;a++){i=s+(r-s)/2;const c=un(i,e,n,A);if(Math.abs(c-t)<o)return i;c<t?s=i:r=i}return i}function xA(t,e,n,A,s,r){const o=qr(t.length,n,A,s,r),i=e.length===t.length?o:qr(e.length,n,A,s,r);return[Kr(t,o),Kr(e,i)]}function Kr(t,e){const n=new Float64Array(t.length);for(let A=0;A<t.length;A++)n[A]=e[t[A]];return n}function qr(t,e,n,A,s){const r=new Float64Array(t);if(t===0)return r;const o=t+1,i=1/o;let a=0<=e?0:e;for(;un(a,e,n,A)>i;)a-=1;let c=0>=e?0:e;for(;un(c,e,n,A)<1-i;)c+=1;a=_r(i,e,n,A,a,c,s),r[0]=a;for(let l=1;l<t;l++){const g=(l+1)/o;un(c,e,n,A)<g&&(c+=10);const f=_r(g,e,n,A,a,c,s);r[l]=f,a=f,c=a+2*(f-r[l-1])}return r}class Aa{constructor(e,n){this.z1=e,this.z2=n,this.n=e.length,this.noise=new Float64Array(this.n),this.signal=new Float64Array(this.n),this.terms=new Float64Array(this.n),Hr(0,1,0,e,n,this.noise)}n;noise;signal;terms;at=[Number.NaN,Number.NaN,Number.NaN];logLik(e){this.signalAt(e);const n=e[3];for(let A=0;A<this.n;A++)this.terms[A]=Math.log(n*this.signal[A]+(1-n)*this.noise[A]);return Bt(this.terms)}membership(e){this.signalAt(e);const n=e[3],A=new Float64Array(this.n);for(let s=0;s<this.n;s++){const r=n*this.signal[s];A[s]=r/(r+(1-n)*this.noise[s])}return A}signalAt(e){const n=this.at;e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]||(Hr(e[0],e[1],e[2],this.z1,this.z2,this.signal),this.at=[e[0],e[1],e[2]])}}function Hr(t,e,n,A,s,r){const o=-1.837877-Math.log(e)-Math.log(e)-.5*Math.log(1-n*n),i=2*n,a=2*(1-n*n);for(let c=0;c<A.length;c++){const l=(A[c]-t)/e,g=(s[c]-t)/e;r[c]=Math.exp(o-(l*l-i*l*g+g*g)/a)}}function NI(t,e){const{n,z1:A,z2:s}=t,r=t.membership(e),o=Bt(r),i=new Float64Array(n);for(let I=0;I<n;I++)i[I]=r[I]*A[I];const a=Bt(i)/o;for(let I=0;I<n;I++)i[I]=r[I]*s[I];const c=Bt(i)/o,l=(a+c)/2;for(let I=0;I<n;I++){const d=A[I]-l;i[I]=r[I]*(d*d)}const g=Bt(i);for(let I=0;I<n;I++){const d=s[I]-l;i[I]=r[I]*(d*d)}const f=Bt(i),h=Math.sqrt((g+f)/(2*o));for(let I=0;I<n;I++)i[I]=r[I]*(A[I]-l)*(s[I]-l);const u=2*Bt(i)/(g+f);return[l,h,u,o/n]}function sa(t){const e=[t[0],t[1],t[2],t[3]];let n=!1;return e[0]<Ct[0]&&(e[0]=Ct[0],n=!0),e[1]<Ct[1]&&(e[1]=Ct[1],n=!0),e[2]<Ct[2]?(e[2]=Ct[2],n=!0):e[2]>ee[2]&&(e[2]=ee[2],n=!0),e[3]<Ct[3]?(e[3]=Ct[3],n=!0):e[3]>ee[3]&&(e[3]=ee[3],n=!0),{theta:e,changed:n}}function kI(t,e,n,A){let s=e,r=t.logLik(s),o=[e[0],e[1],e[2],e[3]];for(let i=0;i<n;i++){const a=sa(NI(t,s));o=a.theta;const c=t.logLik(o);if(a.changed)return{theta:o,changed:!0};if(!(c+1e-6>=r))throw new se("An EM step lowered the likelihood, which stops idr’s own fit.");if(c-r<A)return{theta:o,changed:!1};s=o,r=c}return{theta:o,changed:!1}}function bI(t,e,n,A=1e-5,s=500){if(!Number.isFinite(e)||!Number.isFinite(n))throw new se("Optimization bounds must be finite scalars.");if(e>n)throw new se("The lower bound exceeds the upper bound.");const r=Math.sqrt(22e-17),o=.5*(3-Math.sqrt(5));let i=e,a=n,c=i+o*(a-i),l=c,g=c,f=0,h=0,u=g,I=t(u),d=1,C=I,E=I,B=.5*(i+a),Q=r*Math.abs(g)+A/3,m=2*Q;for(;Math.abs(g-B)>m-.5*(a-i);){let p=!0;if(Math.abs(h)>Q){p=!1;let N=(g-l)*(I-C),k=(g-c)*(I-E),b=(g-c)*k-(g-l)*N;if(k=2*(k-N),k>0&&(b=-b),k=Math.abs(k),N=h,h=f,Math.abs(b)<Math.abs(.5*k*N)&&b>k*(i-g)&&b<k*(a-g)){if(f=(b+0)/k,u=g+f,u-i<m||a-u<m){const D=Math.sign(B-g)+(B-g===0?1:0);f=Q*D}}else p=!0}p&&(h=g>=B?i-g:a-g,f=o*h);const w=Math.sign(f)+(f===0?1:0);u=g+w*Math.max(Math.abs(f),Q);const y=t(u);if(d+=1,y<=I?(u>=g?i=g:a=g,c=l,C=E,l=g,E=I,g=u,I=y):(u<g?i=u:a=u,y<=E||l===g?(c=l,C=E,l=u,E=y):(y<=C||c===g||c===l)&&(c=u,C=y)),B=.5*(i+a),Q=r*Math.abs(g)+A/3,m=2*Q,d>=s)break}return g}function DI(t,e,n){const A=[e[0],e[1],e[2],e[3]],s=e[n],r=c=>(A[n]=s+c,-t.logLik(A));if(!(s>=Ct[n])||!(s<=ee[n]))throw new se("A coordinate-ascent step started outside idr’s parameter box.");const o=bI(r,Ct[n]-s,ee[n]-s),i=-r(0),a=-r(o);return a>i?(e[n]+=o,a):i}function MI(t,e,n,A){let s=t.logLik(e),r=[e[0],e[1],e[2],e[3]],o=s;for(let i=0;i<n;i++){for(let c=0;c<4;c++)o=DI(t,r,c);const a=sa(r);if(a.changed)throw new se("Coordinate ascent left idr’s parameter box, which stops idr’s own fit.");if(r=a.theta,!(o+1e-6>=s))throw new se("A coordinate-ascent round lowered the likelihood, which stops idr’s own fit.");if(o-s<A)return r;s=o}return r}async function FI(t,e,n={}){const A=n.eps??$t.convergenceEps,s=n.maxIter??$t.maxIter,r=$t.pseudoValueEps,o=n.start??$t.start;let i=[o[0],o[1],o[2],o[3]],[a,c]=xA(t,e,i[0],i[1],i[3],r),l=!1,g=0;const f=new Float64Array(t.length);for(let h=0;h<s;h++){g=h+1;const u=i,I=new Aa(a,c),d=kI(I,u,$t.emStepsPerRound,A/10);i=d.theta,d.changed&&(l=!0,i=MI(I,u,$t.emStepsPerRound,A/10));const C=Bt([Math.abs(i[0]-u[0]),Math.abs(i[1]-u[1]),Math.abs(i[2]-u[2]),Math.abs(i[3]-u[3])]),E=a,B=c;[a,c]=xA(t,e,i[0],i[1],i[3],r);for(let p=0;p<f.length;p++)f[p]=Math.abs(E[p]-a[p]);const Q=MA(f);for(let p=0;p<f.length;p++)f[p]=Math.abs(B[p]-c[p]);const m=Q+MA(f);if(n.between!==void 0&&await n.between(g),h>3&&C<A&&m<A)break}return{theta:i,rounds:g,coordinateAscent:l}}function SI(t,e,n){const A=$t.finalPseudoValueEps,[s,r]=xA(e,n,t[0],t[1],t[3],A),o=new Aa(s,r).membership(t),i=$t.convergenceEps,a=new Float64Array(o.length);for(let c=0;c<a.length;c++){let l=1-o[c];s[c]+r[c]<0&&(l=1),a[c]=l<i?i:l>1?1:l}return a}function RI(t){const e=t.length,n=Array.from({length:e},(o,i)=>i);n.sort((o,i)=>t[o]-t[i]||o-i);const A=new Float64Array(e);let s=0,r=0;for(;r<e;){let o=r;for(;o<e&&t[n[o]]===t[n[r]];)s+=t[n[o]],o++;const i=s/o;for(let a=r;a<o;a++)A[n[a]]=i;r=o}return A}function GA(t){return-Math.log10(Math.max(1e-5,t))}function Wr(t){const e=t.length,n=Array.from({length:e},(s,r)=>r);n.sort((s,r)=>t[s]-t[r]||s-r);const A=new Int32Array(e);for(let s=0;s<e;s++)A[n[s]]=s;return A}const nn={width:150,times:3,minWidth:75,truncate:1e5},LI=[-1/560,8/315,-1/5,8/5,-205/72,8/5,-1/5,8/315,-1/560],xI=1e6,GI=1e-10;function UI(t,e){let n=Float64Array.from(LI);const A=new Float64Array(t).fill(1/t);for(let o=0;o<e;o++)n=vI(n,A);const s=new Float64Array(n.length);for(let o=0;o<n.length;o++)s[o]=xI*n[n.length-1-o];const r=new Float64Array(s.length+1);for(let o=0;o<s.length;o++)r[o+1]=r[o]+s[o];return{width:t,times:e,values:s,cumulative:r}}function vI(t,e){const n=new Float64Array(t.length+e.length-1);for(let A=0;A<n.length;A++){let s=0;const r=Math.max(0,A-(e.length-1)),o=Math.min(A,t.length-1);for(let i=r;i<=o;i++)s+=t[i]*e[A-i];n[A]=s}return n}function ws(t,e){return Math.min(e,t.values.length)-1>>1}function TI(t,e){const n=ws(t,e);return{left:t.values.length-1-n,right:n}}function JI(t,e,n,A,s){const r=[],o=[],i=[],a=(l,g,f)=>{const h=i.length-1;if(h>=0&&o[h]===l&&ra(i[h],f)){o[h]=g;return}r.push(l),o.push(g),i.push(f)};let c=A;for(let l=0;l<t.length&&c<s;l++){const g=Math.max(t[l],c),f=Math.min(e[l],s);f<=g||(g>c&&a(c,g,Number.NaN),a(g,f,n[l]),c=f)}return c<s&&a(c,s,Number.NaN),{starts:Int32Array.from(r),ends:Int32Array.from(o),values:Float64Array.from(i),length:r.length}}function $I(t,e){return{starts:Int32Array.of(t),ends:Int32Array.of(e),values:Float64Array.of(0),length:1}}function YI(t,e,n){if(t.length===1)return t[0];const A=[],s=[],r=[],o=new Int32Array(t.length);let i=e;for(;i<n;){let a=n,c=0;for(let f=0;f<t.length;f++){const h=t[f];for(;o[f]<h.length&&h.ends[o[f]]<=i;)o[f]++;const u=o[f];if(u>=h.length||h.starts[u]>i)throw new Error(`pooledRuns: a track does not cover ${i}`);c+=h.values[u],h.ends[u]<a&&(a=h.ends[u])}const l=Math.fround(c/t.length),g=r.length-1;g>=0&&ra(r[g],l)?s[g]=a:(A.push(i),s.push(a),r.push(l)),i=a}return{starts:Int32Array.from(A),ends:Int32Array.from(s),values:Float64Array.from(r),length:A.length}}function ra(t,e){return t===e||t!==t&&e!==e}function Pr(t,e,n,A,s,r,o){const i=e.values.length,a=ws(e,n),c=new Float64Array(Math.max(0,s-A));if(o===void 0)zr(t,e,a,A,s,c,A);else{let l=0;for(;l<c.length;){const g=o.indexOf(1,l),f=g<0||g>c.length?c.length:g;if(c.fill(Number.NaN,l,f),f===c.length)break;const h=o.indexOf(0,f),u=h<0||h>c.length?c.length:h;zr(t,e,a,A+f,A+u,c,A),l=u}}if(r!==void 0)for(let l=0;l<t.length;l++){const g=Math.max(A,t.starts[l]-a+i-1),f=Math.min(s-1,t.ends[l]-a-1);g<=f&&r.fill(1,g-A,f-A+1)}return c}function zr(t,e,n,A,s,r,o){const i=e.values.length,a=e.values,c=e.cumulative,l=t.starts,g=t.ends,f=t.values,h=A+n+1,u=s+n,I=-(n+1)-o;let d=0,C=t.length;for(;d<C;){const Q=d+C>>>1;g[Q]>h-i?C=Q:d=Q+1}const E=c[0],B=c[i];for(;d<t.length;d++){const Q=l[d];if(Q+1>u)break;const m=g[d],p=f[d];let w=Q+1>h?Q+1:h,y=m-1<Q+i?m-1:Q+i;if(y>u&&(y=u),w<=y){let k=w;k===Q+1&&(r[I+k]+=p*a[0],k++);for(let b=I+k,D=k-Q,F=I+y;b<=F;b++,D++)r[b]+=p*(c[D]-E)}if(w=m>h?m:h,y=Q+i<u?Q+i:u,w<=y)if(m-Q===1)for(let k=I+w,b=w-1-Q,D=I+y;k<=D;k++,b++)r[k]+=p*a[b];else for(let k=I+w,b=w-Q,D=w-m,F=I+y;k<=F;k++,b++,D++)r[k]+=p*(c[b]-c[D]);if(w=Q+i+1>h?Q+i+1:h,y=m-1<u?m-1:u,w<=y){const k=p*(B-E);for(let b=I+w,D=I+y;b<=D;b++)r[b]+=k}w=m>Q+i+1?m:Q+i+1,w<h&&(w=h);const N=m+i-1;if(y=N<u?N:u,w<=y){const k=I+(y===N?y-1:y);for(let b=I+w,D=w-m;b<=k;b++,D++)r[b]+=p*(B-c[D]);y===N&&(r[I+N]+=p*a[i-1])}}}const OI=65536;function oa(t){return Math.fround(t)<GI}function _I(t){const e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)oa(t[n])&&(e[n]=1);return e}class Xr{constructor(e,n,A){this.contig=e,this.length=n,this.tracks=A.length,this.absent=A,this.scores=A.map(()=>[]),this.held=A.map(()=>new Float64Array(1024))}tracks;absent;starts=[];ends=[];modes=[];flats=[];scores;previous=!1;rose=!1;open=-1;best=Number.NEGATIVE_INFINITY;ties=[];held;heldLength=0;openFlat=0;position=0;feed(e,n,A,s){if(e!==this.position)throw new Error(`ConcaveScan: fed ${e} after ${this.position}`);for(let r=0;r<n.length;r++){const o=e+r,i=Math.fround(n[r]),a=oa(i);if(o===0?a&&this.begin(0):a&&!this.previous?(this.rose=!0,this.begin(o)):!a&&this.previous&&this.close(o),a){const c=-i;c>this.best?(this.best=c,this.ties=[o]):c===this.best&&this.ties.push(o),this.hold(A,r),s!==void 0&&s[r]===1&&(this.openFlat=1)}this.previous=a}this.position=e+n.length}finish(){if(this.open>=0&&this.close(this.length),!this.rose){this.starts=[],this.ends=[],this.modes=[],this.flats=[];for(const e of this.scores)e.length=0}return{contig:this.contig,starts:Int32Array.from(this.starts),ends:Int32Array.from(this.ends),modes:Int32Array.from(this.modes),scores:this.scores.map(e=>Float64Array.from(e)),flat:Uint8Array.from(this.flats)}}begin(e){this.open=e,this.best=Number.NEGATIVE_INFINITY,this.ties=[],this.heldLength=0,this.openFlat=0,this.held[0].length>OI&&(this.held=this.held.map(()=>new Float64Array(1024)))}hold(e,n){this.heldLength===this.held[0].length&&(this.held=this.held.map(A=>{const s=new Float64Array(A.length*2);return s.set(A),s}));for(let A=0;A<this.tracks;A++)this.held[A][this.heldLength]=e[A][n];this.heldLength++}close(e){this.starts.push(this.open),this.ends.push(e),this.flats.push(this.openFlat),this.modes.push(this.ties.length===0?this.open:this.ties[this.ties.length>>1]);for(let n=0;n<this.tracks;n++)this.scores[n].push(this.absent[n]?Number.NEGATIVE_INFINITY:-MA(this.held[n],0,this.heldLength));this.open=-1}}function KI(t){const e=t.length,n=Array.from({length:e},(r,o)=>o);n.sort((r,o)=>t[o]-t[r]||r-o);const A=new Float64Array(e);let s=0;for(;s<e;){let r=s+1;for(;r<e&&t[n[r]]===t[n[s]];)r++;const o=(s+1+r)/2;for(let i=s;i<r;i++)A[n[i]]=o;s=r}return A}function qI(t,e,n,A,s){const r=e.length,o=new Float64Array(r).fill(Number.POSITIVE_INFINITY);for(const l of A){const g=KI(l);for(let f=0;f<r;f++)g[f]<o[f]&&(o[f]=g[f])}const i=(l,g)=>t[l]<t[g]?-1:t[l]>t[g]?1:e[l]-e[g]||n[l]-n[g],a=Array.from({length:r},(l,g)=>g);a.sort((l,g)=>o[l]-o[g]||i(l,g));const c=a.slice(0,Math.max(0,Math.min(r,s)));return c.sort(i),Int32Array.from(c)}class HI{constructor(e,n,A={}){this.tracks=e,this.limit=n,this.scores=Array.from({length:e},()=>new Float64Array(1024)),this.floor=new Float64Array(e).fill(Number.NEGATIVE_INFINITY),A.prune===!1&&(this.holdAll=!0),this.below=A.below===!0?new Float64Array(1024):null}size=0;contigs=[];starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;floor;seen=0;dropped=0;holdAll=!1;below;belowSize=0;add(e,n){this.seen++;let A=this.holdAll;for(let r=0;r<this.tracks;r++){const o=e.scores[r][n];o!==o&&!this.holdAll&&(this.holdAll=!0,A=!0),o>=this.floor[r]&&(A=!0)}if(!A){this.drop(e.scores[0][n],e.flat[n]);return}this.size===this.starts.length&&this.grow();const s=this.size++;this.contigs[s]=e.contig,this.starts[s]=e.starts[n],this.ends[s]=e.ends[n],this.modes[s]=e.modes[n],this.flats[s]=e.flat[n];for(let r=0;r<this.tracks;r++)this.scores[r][s]=e.scores[r][n];!this.holdAll&&this.size>=2*this.tracks*this.limit+1024&&this.prune()}finish(){this.holdAll||this.prune();const e=this.size,n={contig:this.contigs.slice(0,e),starts:this.starts.slice(0,e),ends:this.ends.slice(0,e),modes:this.modes.slice(0,e),flat:this.flats.slice(0,e),scores:this.scores.map(A=>A.slice(0,e))};return{...n,tested:qI(n.contig,n.starts,n.ends,n.scores,this.limit),below:this.below===null?new Float64Array(0):this.below.slice(0,this.belowSize),exact:!(this.holdAll&&this.dropped>0)}}prune(){if(this.seen<this.limit)return;const e=this.size;for(let A=0;A<this.tracks;A++){const s=this.scores[A].slice(0,e).sort();this.floor[A]=s[e-this.limit]}let n=0;for(let A=0;A<e;A++){let s=!1;for(let r=0;r<this.tracks;r++)this.scores[r][A]>=this.floor[r]&&(s=!0);if(!s){this.drop(this.scores[0][A],this.flats[A]);continue}if(n!==A){this.contigs[n]=this.contigs[A],this.starts[n]=this.starts[A],this.ends[n]=this.ends[A],this.modes[n]=this.modes[A],this.flats[n]=this.flats[A];for(let r=0;r<this.tracks;r++)this.scores[r][n]=this.scores[r][A]}n++}this.size=n,this.contigs.length=n}drop(e,n){if(this.dropped++,!(this.below===null||!(e>0)||n===1)){if(this.belowSize===this.below.length){const A=new Float64Array(this.below.length*2);A.set(this.below),this.below=A}this.below[this.belowSize++]=e}}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}function WI(t,e,n,A,s){return A>0?[Math.max(0,n-A),Math.min(s,n+A+1)]:[t,e]}function ia(t){return-(Math.log(t)/Math.log(10))}const aa=[.001,.005,.01,.05,.1,.2],aA="0.05";function ca(t){return typeof t.replicate=="string"&&t.replicate!==""}const PI="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",zI=8,XI=-1,VI=-2;let le;function ZI(){if(le!==void 0)return le;le=null;try{if(typeof WebAssembly>"u")return null;const t=atob(PI),e=new Uint8Array(t.length);for(let n=0;n<t.length;n++)e[n]=t.charCodeAt(n);WebAssembly.validate(e)&&(le=new WebAssembly.Module(e))}catch{le=null}return le}class UA extends Error{constructor(){super("The peak-calling kernel ran out of memory."),this.name="KernelMemoryError"}}class jI{size=0;starts=new Int32Array(1024);ends=new Int32Array(1024);modes=new Int32Array(1024);flats=new Uint8Array(1024);scores;constructor(e){this.scores=Array.from({length:e},()=>new Float64Array(1024))}take(e,n,A){if(A===0)return;for(;this.size+A>this.starts.length;)this.grow();const s=e.buffer,r=n.scan_region_capacity();this.starts.set(new Int32Array(s,n.scan_region_starts()>>>0,A),this.size),this.ends.set(new Int32Array(s,n.scan_region_ends()>>>0,A),this.size),this.modes.set(new Int32Array(s,n.scan_region_modes()>>>0,A),this.size),this.flats.set(new Uint8Array(s,n.scan_region_flats()>>>0,A),this.size);const o=n.scan_regions()>>>0;this.scores.forEach((i,a)=>i.set(new Float64Array(s,o+a*r*8,A),this.size)),this.size+=A}grow(){const e=n=>{const A=new n.constructor(n.length*2);return A.set(n),A};this.starts=e(this.starts),this.ends=e(this.ends),this.modes=e(this.modes),this.flats=e(this.flats),this.scores=this.scores.map(e)}}class ps{constructor(e,n,A,s){this.memory=e,this.exports=n,this.contig=A,this.tracks=s,this.collected=new jI(s)}collected;static open(e,n,A,s,r){const o=ZI();if(o===null||s<1||s>zI)return null;try{const i=new WebAssembly.Memory({initial:2}),c=new WebAssembly.Instance(o,{env:{memory:i}}).exports,l=e.values.length;if(c.scan_open(s,l,ws(e,A),A,r)!==0)return null;const g=c.scan_kernel()>>>0;return new Float64Array(i.buffer,g,l).set(e.values),new Float64Array(i.buffer,g+l*8,l+1).set(e.cumulative),new ps(i,c,n,s)}catch{return null}}window(e,n,A,s,r){let o=0;for(let i=0;i<this.tracks;i++){const a=r[i];if(a===null){o|=1<<i;continue}const c=a.starts.length,l=this.exports.scan_input(i,c)>>>0;if(l===0)throw new UA;const g=this.memory.buffer;new Float64Array(g,l,c).set(a.values),new Int32Array(g,l+c*8,c).set(a.starts),new Int32Array(g,l+c*12,c).set(a.ends)}this.closed(this.exports.scan_window(e,n,A,s,o),e)}lastWindow(e){const n=this.memory.buffer;return{pooled:new Float64Array(n,this.exports.scan_pooled()>>>0,e).slice(),flat:new Uint8Array(n,this.exports.scan_flat()>>>0,e).slice(),own:Array.from({length:this.tracks},(A,s)=>new Float64Array(n,this.exports.scan_own(s)>>>0,e).slice())}}finish(){this.closed(this.exports.scan_finish(),-1);const{collected:e}=this,n=this.exports.scan_rose()===1?e.size:0;return{contig:this.contig,starts:e.starts.slice(0,n),ends:e.ends.slice(0,n),modes:e.modes.slice(0,n),scores:e.scores.map(A=>A.slice(0,n)),flat:e.flats.slice(0,n)}}closed(e,n){if(e===XI)throw new UA;if(e===VI)throw new Error(`ConcaveScan: fed ${n} out of order`);if(e<0)throw new Error(`pooledRuns: a track does not cover a window at ${n}`);this.collected.take(this.memory,this.exports,e)}}const cA=1<<18,Vr=20,An=2e4,Zr=["#0072b2","#009e73"],td="#999999",ed=async t=>{const e=at(t.params,"signal");if(e===null)return t.note("No track was chosen. Load a bigWig and pick it under Track."),[];const n=ca(t.params)?at(t.params,"replicate"):null;if(n===e)return t.note("The replicate chosen is the track being called, and a track cannot test itself. Choose a second track, or none."),[];const A=n===null?[e]:[e,n],s=L=>t.inputs.labels?.[L]??L,r=Se(T(t.params,"width",nn.width),1,2e3),o=Se(T(t.params,"times",nn.times),0,10),i=Se(T(t.params,"minWidth",nn.minWidth),1,1e9),a=Se(T(t.params,"halfWidth",0),0,1e9),c=Se(T(t.params,"truncate",nn.truncate),1,1e9),l=Ad(t),g=t.inputs.contigLengths??{},f=$n(t.params,"sequences"),h=Object.keys(g).filter(L=>g[L]>0&&(f===null||f.includes(L)));if(h.length===0)return t.note(f!==null&&f.length===0?"No sequence is ticked, so there is nothing to call peaks on.":"This session knows no sequence lengths, so there is nothing to scan. Load a chrom.sizes, or the map itself."),[];const u=UI(r,o),I=L=>nd(t,A,h,g,u,{minWidth:i,truncate:c,below:n===null,prune:L});let d=await I(!0);if(typeof d!="string"&&!d.held.exact&&(d=await I(!1)),typeof d=="string")return t.note(d),[];const{held:C,found:E,n:B,perSequence:Q,absentOn:m}=d;for(let L=0;L<A.length;L++){if(m[L].length===h.length)return t.note(`${s(A[L])} has none of the ${h.length===1?"sequence":"sequences"} ticked. Check that it and the assembly name their sequences the same way.`),[];m[L].length>0&&t.note(`${s(A[L])} has no ${gd(m[L])}. yapc reads a track that lacks a sequence as zeros there, so it lowers the mean the regions are called on, and ranks every region there last by it.`)}const p=`${u.values.length}-tap kernel: a ${r.toLocaleString()} bp window, ${o} ${o===1?"pass":"passes"}`;if(B===0)return t.note(`No concave region at least ${i.toLocaleString()} bp wide on ${h.length===1?h[0]:`${h.length} sequences`} (${p}). A wider smoothing window finds broader shapes; a narrower minimum keeps smaller ones.`),[];const{contig:w,starts:y,ends:N,modes:k,flat:b,scores:D,tested:F}=C;t.note(`${E.toLocaleString()} concave ${E===1?"region":"regions"} on ${h.length.toLocaleString()} ${h.length===1?"sequence":"sequences"} (${p}), ${B.toLocaleString()} at least ${i.toLocaleString()} bp wide`+(F.length<B?`, of which the ${F.length.toLocaleString()} strongest by each track’s curvature rank were kept.`:"."));let R=null,v=null,x=null;const Y=new Uint8Array(F.length).fill(1);if(n!==null)if(F.length<Vr)t.note(`IDR needs at least ${Vr} peaks to fit — its own command refuses fewer — and there ${F.length===1?"is 1":`are ${F.length}`}. They are reported untested, ranked by curvature.`);else{const L=Wr(sn(D[0],F)),$=Wr(sn(D[1],F)),Dt=eo(sn(D[0],F))+eo(sn(D[1],F));Dt>0&&t.note(`${Dt.toLocaleString()} ${Dt===1?"score ties":"scores tie"} with another: ranked by position, where yapc breaks a tie at random.`);try{R=await FI(L,$,{between:async P=>{t.progress(0,0,`IDR, round ${P}`),await Cs(),t.throwIfCancelled()}})}catch(P){throw P instanceof se?new Error(`IDR could not fit these two tracks, as idr itself could not: ${P.message}`):P}v=SI(R.theta,L,$),x=RI(v);const Ut=ia(l);for(let P=0;P<F.length;P++)Y[P]=GA(x[P])>=Ut?1:0;t.note(sd(R,F.length,cd(Y),l))}else{let L=0;for(let $=0;$<F.length;$++)b[F[$]]!==0&&(Y[$]=0,L++);L>0&&t.note(`${L.toLocaleString()} of the candidates ${L===1?"is":"are"} flat — the signal constant across a whole kernel’s width inside, which yapc’s test counts as concave — and ${L===1?"is":"are"} left out, as IDR would leave ${L===1?"it":"them"} out of two replicates.`),t.note("One track, so no test of significance: yapc’s cut is IDR between two replicates. These are the strongest concave regions by curvature — choose a replicate to test them, or lower “keep the strongest” to the upper of the two populations in the figure.")}const J=new Map(h.map((L,$)=>[L,$])),K=[];for(let L=0;L<F.length;L++)Y[L]===1&&K.push(L);K.sort((L,$)=>(J.get(w[F[L]])??0)-(J.get(w[F[$]])??0)||y[F[L]]-y[F[$]]);const V=new et;let H=0,ht=0;for(const L of K){const $=F[L],[Dt,Ut]=WI(y[$],N[$],k[$],a,g[w[$]]);a>0&&(Dt!==k[$]-a||Ut!==k[$]+a+1)&&H++;const P=[`summit ${(k[$]+1).toLocaleString("en-US")}`];P.push(`curvature ${A.map((LQ,ec)=>no(D[ec][$])).join(" / ")}`),x!==null&&P.push(`IDR ${no(x[L])}`),V.add(w[$],Dt,Ut,{name:`peak_${++ht}`,score:x!==null?GA(x[L]):D[0][$],cds:[k[$],k[$]+1],detail:P.join(ct)})}H>0&&t.note(`${H.toLocaleString()} ${H===1?"peak reaches":"peaks reach"} past a sequence end at this half-width and ${H===1?"is":"are"} cut at it; yapc writes the coordinate past the end.`),K.length===0&&t.note(`No peak passes IDR ≤ ${l}. A looser threshold keeps more; two tracks that are not replicates of one experiment will pass few at any.`);const Gt=[];K.length>0&&Gt.push({kind:"intervals",id:`peaks-${A.map(L=>L.replace(/[^A-Za-z0-9_]+/g,"_")).join("-")}`,label:n===null?`Peaks · ${s(e)} · no IDR`:`Peaks · ${s(e)} + ${s(n)} · IDR ≤ ${l}`,payload:{kind:"features",data:V.finish()},noun:{one:"peak",many:"peaks"},lane:{under:{entry:e}},display:"lane",look:"point"});const q=rd(A.map(s),D,F,Y,n!==null,b,C.below);return q!==null&&Gt.push(q),Gt.push(od(h,g,Q,K.map(L=>w[F[L]]))),R!==null&&x!==null&&Gt.push(id(x,l)),Lt(t.params,"perPeak",!1)&&Gt.push(ad({names:A.map(s),contig:w,starts:y,ends:N,modes:k,scores:D,tested:F,passes:Y,local:v,global:x,replicate:n!==null})),t.progress(1,1,"done"),Gt};async function nd(t,e,n,A,s,r){const o=n.reduce((h,u)=>h+A[u],0);let i=0;const a=new HI(e.length,r.truncate,{prune:r.prune,below:r.below}),c=e.map(()=>[]),l=new Map;let g=0,f=0;for(const h of n){const u=await la(t,e,h,A[h],s,C=>{i+=C,t.progress(i,o,h)});if(typeof u=="string")return u;const{regions:I}=u;let d=0;for(let C=0;C<I.starts.length;C++)I.ends[C]-I.starts[C]<r.minWidth||(d++,a.add(I,C));g+=I.starts.length,f+=d,l.set(h,{regions:I.starts.length,wide:d}),u.absent.forEach((C,E)=>{C&&c[E].push(h)})}return{held:a.finish(),found:g,n:f,perSequence:l,absentOn:c}}async function la(t,e,n,A,s,r,o="auto"){const{left:i,right:a}=TI(s,A),c=e.map(()=>!1),l=o==="js"?null:ps.open(s,n,A,e.length,cA);let g=null,f=0;try{for(let h=0;h<A;h+=cA){const u=Math.min(A,h+cA),I=Math.max(0,h-i),d=Math.min(A,u+a),C=[];for(let E=0;E<e.length;E++){if(c[E]){C.push(null);continue}const B=await t.sample(e[E],[{contig:n,start:I,end:d}],1);if(B.note!==void 0)return B.note;const Q=B.regions[0];Q===void 0&&(c[E]=!0),C.push(Q??null)}if(l!==null)l.window(h,u,I,d,C);else{const E=C.map(w=>w===null?$I(I,d):JI(w.starts,w.ends,w.values,I,d));g??=new Xr(n,A,c);const B=new Uint8Array(u-h),Q=Pr(YI(E,I,d),s,A,h,u,B),m=e.length===1?null:_I(Q),p=m===null?[Q]:E.map(w=>Pr(w,s,A,h,u,void 0,m));g.feed(h,Q,p,B)}r(u-h),f+=u-h,await Cs(),t.throwIfCancelled()}}catch(h){if(!(h instanceof UA))throw h;return r(-f),la(t,e,n,A,s,r,"js")}return l!==null?{regions:l.finish(),absent:c}:{regions:(g??new Xr(n,A,c)).finish(),absent:c}}function Ad(t){const e=Number(st(t.params,"idr",aA));return aa.includes(e)?e:(ca(t.params)&&t.note(`An IDR threshold of ${st(t.params,"idr","")} is not one yapc writes; ${aA} was used.`),Number(aA))}const jr=["mean","spread","correlation","reproducible share"];function sd(t,e,n,A){const[s,r,o,i]=t.theta,a=`IDR fitted over ${e.toLocaleString()} peaks in ${t.rounds.toLocaleString()} rounds: μ ${s.toFixed(2)}, σ ${r.toFixed(2)}, ρ ${o.toFixed(2)}, reproducible share ${i.toFixed(2)}; ${n.toLocaleString()} pass IDR ≤ ${A}.`,c=[],l=g=>Number.isInteger(g)?String(g):g.toFixed(2);return t.theta.forEach((g,f)=>{const[h,u]=[Jr.min[f],Jr.max[f]];g<=h+1e-4*Math.max(1,h)?c.push(`the ${jr[f]} at its floor of ${l(h)}`):g>=u-1e-4*Math.max(1,u)&&c.push(`the ${jr[f]} at its ceiling of ${l(u)}`)}),c.length===0?a:`${a} The fit ended at the edge of IDR’s parameter box — ${c.join(", ")} — which is where two tracks that do not rank their peaks like replicates of one experiment put it. Read these IDRs as that, not as reproducibility.`}function rd(t,e,n,A,s,r,o){const i=[],a=new Uint8Array(r.length);for(const f of n)a[f]=1;for(let f=0;f<e.length;f++){const h=[],u=[];if(n.forEach((E,B)=>{const Q=e[f][E];!(Q>0)||!s&&r[E]===1||(A[B]===1?h.push(Q):u.push(Q))}),!s){for(let E=0;E<r.length;E++)a[E]===0&&e[f][E]>0&&r[E]===0&&u.push(e[f][E]);for(const E of o)u.push(E)}const I=e.length===1?"":`${t[f]} · `,d=s?`${I}passes IDR`:`${I}peaks`,C=s?`${I}fails IDR`:`${I}below the cut`;h.length>0&&i.push(to(d,h,Zr[f]??Zr[0])),u.length>0&&i.push(to(C,u,td))}if(i.length===0)return null;const c=i.flatMap(f=>Array.from(f.y)),l=ld(c,.01);let g=Number.NEGATIVE_INFINITY;for(const f of c)f>g&&(g=f);return{kind:"curve",id:"peaks-curvature",label:"Curvature of every candidate",series:i,xLabel:"",yLabel:"Curvature (yapc score)",xScale:"linear",yScale:"log",...Number.isFinite(l)&&l>0&&g>l?{yDomain:[10**Math.floor(Math.log10(l)),10**Math.ceil(Math.log10(g))]}:{}}}function to(t,e,n){const A=Float64Array.from(e).sort();let s=A;if(A.length>An){s=new Float64Array(An);for(let r=0;r<An;r++)s[r]=A[Math.round(r*(A.length-1)/(An-1))]}return{name:t,x:Float64Array.from(s,(r,o)=>o),y:s,colour:n,n:e.length,mark:"violin"}}function od(t,e,n,A){const s=new Map;for(const r of A)s.set(r,(s.get(r)??0)+1);return{kind:"table",id:"peaks-sequences",label:"Per sequence",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"length",label:"Length",kind:"number"},{key:"regions",label:"Concave regions",kind:"number"},{key:"wide",label:"Wide enough",kind:"number"},{key:"peaks",label:"Peaks",kind:"number"},{key:"density",label:"Peaks per Mb",kind:"number",digits:1}],rows:t.map(r=>{const o=n.get(r)??{regions:0,wide:0},i=s.get(r)??0;return{sequence:r,length:e[r],regions:o.regions,wide:o.wide,peaks:i,density:i/e[r]*1e6}})}}function id(t,e){const n=t.length;return{kind:"table",id:"peaks-idr",label:"IDR thresholds",columns:[{key:"threshold",label:"IDR ≤",kind:"text"},{key:"peaks",label:"Peaks",kind:"number"},{key:"share",label:"Share of tested",kind:"number",digits:3},{key:"drawn",label:"Drawn",kind:"text"}],rows:aa.map(A=>{const s=ia(A);let r=0;for(let o=0;o<n;o++)GA(t[o])>=s&&r++;return{threshold:String(A),peaks:r,share:r/n,drawn:A===e?"yes":""}})}}function ad(t){const{names:e,contig:n,starts:A,ends:s,modes:r,scores:o,tested:i,passes:a,local:c,global:l}=t,g=[];return i.forEach((f,h)=>{const u={sequence:n[f],start:A[f],end:s[f],summit:r[f],width:s[f]-A[f]};o.forEach((I,d)=>{u[`curvature${d}`]=I[f]}),c!==null&&l!==null&&(u.local=c[h],u.idr=l[h],u.passes=a[h]===1?"yes":"no"),g.push(u)}),l!==null?g.sort((f,h)=>Number(f.idr)-Number(h.idr)):g.sort((f,h)=>Number(h.curvature0)-Number(f.curvature0)),{kind:"table",id:"peaks-list",label:t.replicate?"Every peak tested":"Every peak",columns:[{key:"sequence",label:"Sequence",kind:"text"},{key:"start",label:"Start",kind:"number",coordinate:"start"},{key:"end",label:"End",kind:"number",coordinate:"end"},{key:"summit",label:"Summit",kind:"number",coordinate:"start",hint:"The most concave base."},{key:"width",label:"Width",kind:"number"},...e.map((f,h)=>({key:`curvature${h}`,label:e.length===1?"Curvature":`Curvature · ${f}`,kind:"number",digits:2})),...c!==null?[{key:"local",label:"Local IDR",kind:"number",digits:4,scientific:!0},{key:"idr",label:"IDR",kind:"number",digits:4,scientific:!0},{key:"passes",label:"Passes",kind:"text"}]:[]],rows:g}}function Se(t,e,n){return Math.min(n,Math.max(e,Math.round(t)))}function sn(t,e){const n=new Float64Array(e.length);for(let A=0;A<e.length;A++)n[A]=t[e[A]];return n}function cd(t){let e=0;for(const n of t)e+=n;return e}function eo(t){const e=Float64Array.from(t).sort();let n=0;for(let A=1;A<e.length;A++)e[A]===e[A-1]&&n++;return n}function ld(t,e){if(t.length===0)return Number.NaN;const n=Float64Array.from(t).sort(),A=e*(n.length-1),s=Math.floor(A),r=Math.min(n.length-1,s+1);return n[s]+(A-s)*(n[r]-n[s])}function no(t){return Number.isFinite(t)?Number(t.toPrecision(4)).toLocaleString("en-US",{maximumSignificantDigits:4}):t>0?"∞":t<0?"−∞":"—"}function gd(t){return t.length===1?t[0]:t.length<=3?`${t.slice(0,-1).join(", ")} and ${t[t.length-1]}`:`${t.slice(0,3).join(", ")} and ${(t.length-3).toLocaleString()} more`}const ga=[{name:"DpnII",site:"GATC",cut:0},{name:"HindIII",site:"AAGCTT",cut:1},{name:"NcoI",site:"CCATGG",cut:1},{name:"EcoRI",site:"GAATTC",cut:1},{name:"BglII",site:"AGATCT",cut:1},{name:"HinfI",site:"GANTC",cut:1},{name:"DdeI",site:"CTNAG",cut:1},{name:"MseI",site:"TTAA",cut:1},{name:"NlaIII",site:"CATG",cut:4},{name:"CviQI",site:"GTAC",cut:1},{name:"AluI",site:"AGCT",cut:2}],fd={MboI:"DpnII",Sau3AI:"DpnII",Csp6I:"CviQI"},Mn={Arima:["DpnII","HinfI"]},hd=(()=>{const t=new Map;for(const e of ga)t.set(e.name.toLowerCase(),e);for(const[e,n]of Object.entries(fd)){const A=t.get(n.toLowerCase());A!==void 0&&t.set(e.toLowerCase(),A)}return t})();function rn(t){return hd.get(t.trim().toLowerCase())}function Fn(t){const e=t.trim().toLowerCase();return Object.keys(Mn).find(n=>n.toLowerCase()===e)}function fa(t){return`${t.site.slice(0,t.cut)}^${t.site.slice(t.cut)}`}function ud(t){return t.site.length-2*t.cut}const Id=1/256,Ao=255;function so(t){let e=1;for(const n of t){let A=0;for(let s=n;s!==0;s&=s-1)A++;e*=A/4}return e}function dd(t){const e=t.toUpperCase().replace(/U/g,"T"),n=e.indexOf("^"),A=e.replace("^","");if(n<0){const r=Ye(A);return{refusal:$e(r)?`“${t}” is neither an enzyme this knows nor a site in IUPAC letters with a ^ where it cuts.`:`“${t}” needs a ^ where the enzyme cuts the top strand, as in ^GATC or G^ANTC.`}}if(A.includes("^"))return{refusal:`“${t}” has more than one ^, and a site is cut in one place.`};const s=Ye(A);return $e(s)?{refusal:s.reason}:so(s)>Id?{refusal:`“${t}” would cut every ${Math.round(1/so(s))} bases or so; a site needs at least the specificity of a four-base cutter.`}:{name:`${e.slice(0,n)}^${e.slice(n+1)}`,site:A,cut:n}}function Cd(t,e){const n=t.trim();if(n===""||n==="none")return[];if(n!=="custom"){const i=Fn(n);if(i!==void 0)return Mn[i].map(c=>rn(c));const a=rn(n);return a===void 0?{refusal:`“${n}” is not an enzyme or a kit this knows. Pick one, or type its site under custom.`}:[a]}const A=e.split(/[\s,;]+/).filter(i=>i!=="");if(A.length===0)return{refusal:"Type an enzyme or a site, such as DpnII or G^ANTC."};const s=[],r=new Set,o=i=>{const a=`${i.site}^${i.cut}`;r.has(a)||(r.add(a),s.push(i))};for(const i of A){const a=Fn(i);if(a!==void 0){for(const g of Mn[a])o(rn(g));continue}const c=rn(i);if(c!==void 0){o(c);continue}const l=dd(i);if("refusal"in l)return l;o(l)}return s.length>Ao?{refusal:`That is ${s.length} enzymes, and one digest takes ${Ao} at most.`}:s}function Qd(t){return t.map(e=>e.name).join("+")}function Bd(t){let e=0;for(const n of t)e=Math.max(e,n.site.length);return Math.max(0,e-1)}const ro=new Map;function Ed(t){const e=`${t.site}^${t.cut}`,n=ro.get(e);if(n!==void 0)return n;const A=Ye(t.site);if($e(A))throw new Error(`${t.name}: ${A.reason}`);const s={motif:A,offset:t.cut};return ro.set(e,s),s}const Ce=256;function ha(t,e,n,A,s){const r=t.subarray(0,e).sort();let o=0,i=Number.NaN;for(let c=0;c<r.length;c++){const l=Math.floor(r[c]/Ce);l===i||!(l>A&&l<s)||(i=l,r[o++]=r[c])}const a={top:new Int32Array(o),bottom:new Int32Array(o),enzyme:new Uint8Array(o)};for(let c=0;c<o;c++){const l=Math.floor(r[c]/Ce),g=r[c]-l*Ce;a.top[c]=l,a.bottom[c]=l+n[g],a.enzyme[c]=g}return a}function md(t,e,n=0){let A=new Float64Array(Math.max(16,t.length>>7)),s=0;e.forEach((o,i)=>{const a=Ed(o),{hits:c}=ms(t,a.motif,{bothStrands:!0,offset:n});if(s+c.length>A.length){const l=new Float64Array(Math.max(A.length*2,s+c.length));l.set(A.subarray(0,s)),A=l}for(const l of c)A[s++]=(l.start+a.offset)*Ce+i});const r=Int32Array.from(e,ud);return ha(A,s,r,Number.NEGATIVE_INFINITY,Number.POSITIVE_INFINITY)}function wd(t,e){let n=0;for(const o of t)n+=o.top.length;const A=new Float64Array(n),s=new Int32Array(Ce);let r=0;for(const o of t)for(let i=0;i<o.top.length;i++)A[r++]=o.top[i]*Ce+o.enzyme[i],s[o.enzyme[i]]=o.bottom[i]-o.top[i];return ha(A,r,s,0,e)}const pd=16e6;[...ga.map(t=>({value:t.name,label:`${t.name} (${fa(t)})`})),...Object.entries(Mn).map(([t,e])=>({value:t,label:`${t} (${e.join(" + ")})`}))];function yd(t){const e=typeof t.enzyme=="string"?t.enzyme:"none",n=typeof t.sites=="string"?t.sites:"";return{choice:e,sites:n}}async function Nd(t,e,n={}){const A=n.contigs??t.contigs,s=Bd(e),r=Math.max(1,Math.floor(n.piece??pd)),o=t.read?.bind(t),i=A.reduce((l,g)=>l+g.length,0);let a=0;const c=[];for(const l of A){const g=o===void 0?t.bases(l.name):void 0;if(o===void 0&&g===void 0)continue;const f=g?.length??l.length,h=[];let u=!0;for(let I=0;I<f;I+=r){n.throwIfCancelled?.();const d=Math.min(f,I+r),C=Math.min(f,d+s),E=g!==void 0?g.subarray(I,C):await o?.(l.name,I,C);if(E===void 0){u=!1;break}h.push(md(E,e,I)),a+=d-I,n.progress?.(a,i,l.name)}u&&c.push({contig:l.name,length:f,cuts:wd(h,f)})}return c}function kd(t,e){const n=Qd(e),A=Fn(t);return A===void 0?n:`${A} (${n})`}function bd(t,e){const n=Fn(t);return n!==void 0?n.replace(/[^A-Za-z0-9]/g,""):e.map(A=>A.name.replace(/\^/g,"_").replace(/[^A-Za-z0-9_]/g,"")).join("-")}const Dd=async t=>{const e=at(t.params,"sequence");if(t.residues===void 0)return t.note("This session cannot read residues, so there is no reference to cut."),[];if(e===null)return t.note("No reference was chosen. Load a FASTA and pick it under Reference."),[];const n=t.residues(e);if(n===void 0)return t.note("The reference chosen is no longer loaded. Drop the FASTA again, or pick another."),[];if(n.read===void 0&&n.refusal!==void 0)return t.note(n.refusal),[];const{choice:A,sites:s}=yd(t.params),r=Cd(A,s);if(!Array.isArray(r))return t.note(r.refusal),[];if(r.length===0)return t.note("No enzyme was chosen, so there is nothing to cut."),[];const o=$n(t.params,"sequences");if(o!==null&&o.length===0)return t.note("No sequence is ticked, so there is nothing to cut."),[];const i=Object.entries(t.inputs.contigLengths??{}).filter(([,Q])=>Q>0).map(([Q])=>Q),a=Xi(n,o,i);if(a.length===0)return t.note("None of the ticked sequences is in this reference, so there is nothing to cut."),[];const c=a.length===n.contigs.length;t.progress(0,1,a.length===1?`cutting ${a[0].name}`:`cutting ${a.length.toLocaleString()} sequences`);const l=await Nd(n,r,{contigs:a,progress:(Q,m,p)=>t.progress(Q,m,`cutting ${p}`),throwIfCancelled:()=>t.throwIfCancelled()});if(t.progress(1,1,"done"),l.length===0)return t.note("None of the ticked sequences could be read from this reference."),[];const g=kd(A,r),f=c?g:a.length<=3?`${g} on ${a.map(Q=>Q.name).join(", ")}`:`${g} on ${a.length.toLocaleString()} sequences`;let h=0,u=0;for(const Q of l)h+=Q.cuts.top.length,u+=Q.length;const I=h+l.length;t.note(h===0?`No ${g} site anywhere in ${c?"this reference":"the sequences ticked"}, so each sequence is one fragment.`:`${h.toLocaleString()} ${g} ${h===1?"cut":"cuts"} on ${l.length.toLocaleString()} ${l.length===1?"sequence":"sequences"}: ${I.toLocaleString()} fragments, ${Math.round(u/I).toLocaleString()} bp long on average.`);const d=`restriction-${bd(A,r)}${c?"":Md(a)}`,C=Fd(l,r),E=[Sd(C,f,d)],B=Rd(t,C,f,d);return B!==null&&E.push(B),E};function Md(t){const e=t.map(A=>A.name);if(e.length<=3)return`-on-${e.map(A=>A.replace(/[^A-Za-z0-9]/g,"")).join("-")}`;let n=5381;for(const A of e.join(`
17
+ `))n=(n*33^A.charCodeAt(0))>>>0;return`-on${e.length}-${n.toString(36)}`}function Fd(t,e){let n=0;for(const i of t)n+=i.cuts.top.length;const A=e.map(i=>i.name),s=e.map(i=>`${i.name} cuts ${fa(i)}`),r={contigs:t.map(i=>i.contig),length:n,contig:new Int32Array(n),start:new Int32Array(n),end:new Int32Array(n),strand:new Int8Array(n),score:new Float32Array(n).fill(Number.NaN),name:new Array(n),id:new Array(n).fill(""),detail:new Array(n),exonAt:new Int32Array(n+1),exonStart:new Int32Array(0),exonEnd:new Int32Array(0),cdsStart:new Int32Array(n).fill(-1),cdsEnd:new Int32Array(n).fill(-1),contigAt:new Int32Array(t.length+1),maxSpan:new Int32Array(t.length)};let o=0;return t.forEach((i,a)=>{const{top:c,enzyme:l}=i.cuts;r.contigAt[a]=o,r.contig.fill(a,o,o+c.length),r.start.set(c,o);for(let g=0;g<c.length;g++)r.end[o+g]=c[g]+1,r.name[o+g]=A[l[g]],r.detail[o+g]=s[l[g]];c.length>0&&(r.maxSpan[a]=1),o+=c.length}),r.contigAt[t.length]=o,r}function Sd(t,e,n){return{kind:"intervals",id:n,label:`${e} sites`,payload:{kind:"features",data:t},noun:{one:"site",many:"sites"},display:"lane",look:"point"}}function Rd(t,e,n,A){const s=t.framing.binsize,r=On(t);if(!(s>0)||r.length===0)return t.note("The sites are a lane; the density is not. A per-bin track needs the bin grid of an open contact map, and this session has none. Open the map and run it again for that half."),null;const o=e.contigs.map((a,c)=>{const l=e.contigAt[c],g=e.contigAt[c+1];return{contig:a,starts:e.start.subarray(l,g),ends:e.end.subarray(l,g),strands:e.strand.subarray(l,g)}}),i=zi({hits:o,total:e.length},r,s);return{kind:"profile",id:`${A}-density`,label:`${n} site density`,values:i.values,extent:[0,i.values.length],binsize:s,unit:"sites"}}const Ld=async t=>{const e=Jn(t.params,"tracks");if(e.length<2)return t.note(e.length===0?"No tracks were chosen. Load two or more bigWigs and tick them under Tracks.":"Only one track was chosen, and a correlation needs two."),[];const n=I=>t.inputs.labels?.[I]??I,A=e.map(n),s=await xd(t);if(s.count===0)return t.note("No unit to compare over. Check that the tracks and the assembly share contig names."),[];const r=[];for(let I=0;I<e.length;I++)t.throwIfCancelled(),t.progress(I,e.length,A[I]),r.push(await Ud(t,e[I],s));t.progress(e.length,e.length,"correlating");const o=vd(r),i=s.kind==="bins"?"windows":"features";if(o<Nn)t.note(`Fewer than ${Nn} of the ${s.count.toLocaleString()} ${i} have a value in every track, so no pair has a coefficient. Check that the tracks cover the same sequences.`);else if(o<s.count){const I=s.count-o,d=I===1;t.note(`${I.toLocaleString()} of the ${s.count.toLocaleString()} ${i} ${d?"has":"have"} no value in at least one track, and ${d?"is":"are"} left out of every pair: every coefficient is over the other ${o.toLocaleString()}.`)}const a=st(t.params,"method","spearman"),c=e.length,l=new Float32Array(c*c),g=[];for(let I=0;I<c;I++){l[I*c+I]=1;for(let d=I+1;d<c;d++){const C=a==="pearson"?vi(r[I],r[d]):Sh(r[I],r[d]);l[I*c+d]=C,l[d*c+I]=C,g.push({a:A[I],b:A[d],r:C})}}const f={kind:"matrix",id:"trackcorr",label:`Track correlation · ${a}`,nrows:c,ncols:c,values:l,xLabel:"",yLabel:"",xTicks:A,yTicks:A,colormap:yl,centre:0,stats:[{label:"units",value:s.count,digits:0},{label:"compared",value:o,digits:0,hint:"Units every track has a value for: the ones every pair is correlated over."}]},h={kind:"table",id:"trackcorr-table",label:"Pairs",columns:[{key:"a",label:"Track",kind:"text"},{key:"b",label:"Track",kind:"text"},{key:"r",label:a==="pearson"?"Pearson r":"Spearman ρ",kind:"number",digits:3}],rows:g.sort((I,d)=>Number(d.r)-Number(I.r))};return[f,h]};async function xd(t){if(st(t.params,"over","bins")==="features"){const s=ne(t.inputs.features,t.params,"features"),r=s.value;if(r===void 0)return t.note(Yn(s,{unchosen:"Correlating over features needs a feature set, and none was chosen.",gone:"The feature set chosen is no longer loaded. Re-open the file, or pick another."})??""),{kind:"features",regions:[],count:0};const o=[];for(let i=0;i<r.length;i++)o.push({contig:r.contigs[r.contig[i]],start:r.start[i],end:r.end[i]});return{kind:"features",regions:o,count:o.length}}const e=Math.max(1,Math.round(T(t.params,"binsize",100))),n=[];let A=0;for(const[s,r]of Object.entries(t.inputs.contigLengths??{})){const o=Math.floor(r/e);o!==0&&(n.push({contig:s,count:o,offset:A}),A+=o)}return{kind:"bins",size:e,tilings:n,count:A}}const Gd=1<<20,oo=4096;async function Ud(t,e,n){const A=new Float64Array(n.count),s=new Float64Array(n.count),r=(o,i,a,c,l,g)=>{const f=Math.min(l,a)-Math.max(c,i);f>0&&(A[o]+=g*f,s[o]+=f)};if(n.kind==="bins"){const{size:o}=n,i=Math.max(1,Math.floor(Gd/o))*o;for(const a of n.tilings){const c=a.count*o;for(let l=0;l<c;l+=i){t.throwIfCancelled();const g=Math.min(c,l+i),f=await t.sample(e,[{contig:a.contig,start:l,end:g}],1);for(const h of f.regions)for(let u=0;u<h.values.length;u++){const I=h.values[u];if(!Number.isFinite(I))continue;const d=Math.max(l,h.starts[u]),C=Math.min(g,h.ends[u]);for(let E=Math.floor(d/o);E*o<C;E++)r(a.offset+E,E*o,(E+1)*o,d,C,I)}}}}else{const o=new Map;n.regions.forEach((i,a)=>{const c=o.get(i.contig);c===void 0?o.set(i.contig,[a]):c.push(a)});for(const[,i]of o)for(let a=0;a<i.length;a+=oo){t.throwIfCancelled();const c=i.slice(a,a+oo),l=await t.sample(e,c.map(f=>n.regions[f]),1),g=new Map;for(const f of l.regions)g.set(`${f.contig}:${f.start}-${f.end}`,f);for(const f of c){const h=n.regions[f],u=g.get(`${h.contig}:${h.start}-${h.end}`);if(u!==void 0)for(let I=0;I<u.values.length;I++){const d=u.values[I];Number.isFinite(d)&&r(f,h.start,h.end,u.starts[I],u.ends[I],d)}}}}for(let o=0;o<A.length;o++)A[o]=s[o]>0?A[o]/s[o]:Number.NaN;return A}function vd(t){const e=t.length===0?0:t[0].length;let n=0;for(let A=0;A<e;A++)if(t.every(s=>!Number.isNaN(s[A])))n++;else for(const s of t)s[A]=Number.NaN;return n}const Td={motif:Lu,restriction:Dd,peaks:ed,composition:_u,dotplot:rI,oriter:CI,metaplot:uu,trackcorr:Ld,frip:xh,groupsignal:zh,overlap:mI},Jd="0.17.0",$d="faa252c";function Yd(t){const e=[],n=new Set;for(const A of t.split(/\r?\n/)){const s=A.trim();if(s===""||s.startsWith("#"))continue;const r=s.split(/\s+/);if(r.length<5)return[];const[o,i,a,c,l]=[r[0],Number(r[1]),Number(r[2]),Number(r[3]),Number(r[4])];if([i,a,c,l].some(f=>!Number.isInteger(f)||f<0))return[];if(c===0||l<c)return[];n.has(o)||(n.add(o),e.push({name:o,length:i,offset:a,lineBases:c,lineWidth:l}))}return e}function Od(t){return t.map(e=>({name:e.name,length:e.length}))}function on(t,e){const n=Math.floor(e/t.lineBases);return t.offset+n*t.lineWidth+(e-n*t.lineBases)}function _d(t,e,n){const A=Math.max(0,Math.min(t.length,Math.floor(e))),s=Math.max(A,Math.min(t.length,Math.ceil(n)));return s<=A?{from:on(t,A),to:on(t,A)}:{from:on(t,A),to:on(t,s-1)+1}}function Kd(t){let e=0;for(let s=0;s<t.length;s++)t[s]>32&&e++;if(e===t.length)return t;const n=new Uint8Array(e);let A=0;for(let s=0;s<t.length;s++)t[s]>32&&(n[A++]=t[s]);return n}const ua=/\.(fa|fasta|fna|fas)$/i;function qd(t){if(/\.b?gz$/i.test(t))return`${t}.tbi`;if(/\.bam$/i.test(t))return`${t}.bai`;if(ua.test(t))return`${t}.fai`}const vA=18,Hd=4,Wd=/\.(biginteract|interact)(\.b?gz)?$/i;function Pd(t){return t!==void 0&&t!==""&&Number.isFinite(Number(t))}function io(t){return t==="+"||t==="-"||t==="."||t===""}function Ia(t,e=""){const n=Wd.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<Hd;){let o=t.indexOf(`
18
+ `,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!zd(c,n))return!1;A++}return A>0}function zd(t,e){if(e?t.length<vA:t.length!==vA)return!1;for(const n of[1,2,9,10,14,15])if(!S(t[n]))return!1;return!S(t[4])||!Pd(t[5])||!e&&!(io(t[12])&&io(t[17]))?!1:e||Xd(t)}function Xd(t){const e=t[0],n=Number(t[1]),A=Number(t[2]);if(!(A>n))return!1;let s=!1;for(const[r,o,i]of[[8,9,10],[13,14,15]])if(t[r]===e&&(s=!0,Number(t[o])<n||Number(t[i])>A))return!1;return s}function da(t){const e=new vn;let n=0;if(wt(t,A=>{if(A.length<vA){n++;return}const s=A[9],r=A[10],o=A[14],i=A[15];if(!S(s)||!S(r)||!S(o)||!S(i)){n++;return}const a=In(A[11]),c=In(A[16]);e.add(A[8]??"",Number(s),Number(r),A[13]??"",Number(o),Number(i),{score:jd(A[5]),name:In(A[3])||Zd(a,c),detail:Vd(A,a,c)})}),e.length===0)throw new Error(`No usable rows: all ${n} lines failed the eighteen-column test an interact file is made of. UCSC writes BED5+13 — chrom, start, end, name, score, value, exp, colour, then the source and target triples and their strands.`);return e.finish()}function Vd(t,e,n){const A=[],s=In(t[6]);s!==""&&A.push(`exp ${s}`);const r=t[4];r!==void 0&&r!==""&&r!=="0"&&A.push(`score ${r}`),(e!==""||n!=="")&&A.push(`${e||"?"} → ${n||"?"}`);const o=`${ao(t[12])}${ao(t[17])}`;return o!==".."&&A.push(`strands ${o}`),A.join(ct)}function Zd(t,e){return t===""&&e===""?"":`${t||"?"}/${e||"?"}`}function In(t){return t===void 0||t==="."?"":t}function ao(t){return t==="+"||t==="-"?t:"."}function jd(t){return t===void 0||t===""||t==="."?Number.NaN:Number(t)}function tC(t){return/\bsourceChrom\b/.test(t)&&/\btargetChrom\b/.test(t)}function eC(t){let e=0;for(let A=0;A<t.length;A++)t.contig1[A]!==t.contig2[A]&&e++;const n=[`${t.length.toLocaleString()} interaction${t.length===1?"":"s"}`];return e>0&&n.push(`${e.toLocaleString()} between sequences`),n.join(" · ")}const Ca=/^([^\s:]+):(\d+)-(\d+)(?:,(.+))?$/,nC=4,AC=/\.(longrange|longtabix)(\.(bed|txt))?(\.b?gz)?$/i;function Qa(t,e=""){const n=AC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<nC;){let o=t.indexOf(`
19
+ `,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!n&&c.length!==4||!S(c[1])||!S(c[2])||c[3]===void 0||!Ca.test(c[3]))return!1;A++}return A>0}function Ba(t){const e=new vn,n=new Set;let A=0,s=0;if(wt(t,o=>{if(o.length<4||!S(o[1])||!S(o[2])){A++;return}const i=Ca.exec(o[3]??"");if(i===null){A++;return}const a={contig:o[0]??"",start:Number(o[1]),end:Number(o[2])},c={contig:i[1],start:Number(i[2]),end:Number(i[3])},l=i[4]===void 0||i[4]===""?Number.NaN:Number(i[4]),[g,f]=a.contig<c.contig||a.contig===c.contig&&a.start<=c.start?[a,c]:[c,a],h=`${g.contig}:${g.start}-${g.end}|${f.contig}:${f.start}-${f.end}|${i[4]??""}`;if(n.has(h)){s++;return}n.add(h),e.add(a.contig,a.start,a.end,c.contig,c.start,c.end,{score:l,detail:Number.isFinite(l)?`score ${i[4]}`:""})}),e.length===0)throw new Error(`No usable rows: all ${A} lines failed the "contig, start, end, chrom:start-end,score" test a longrange file is made of.`);const r=e.finish();return Ea.set(r,s),r}const Ea=new WeakMap;function sC(t){const e=[`${t.length.toLocaleString()} interaction${t.length===1?"":"s"}`],n=Ea.get(t)??0;n>0&&e.push(`${n.toLocaleString()} reciprocal lines folded in`);let A=0;for(let s=0;s<t.length;s++)t.contig1[s]!==t.contig2[s]&&A++;return A>0&&e.push(`${A.toLocaleString()} between sequences`),e.join(" · ")}const rC=10,oC=11,lA=10,iC=4,aC=/(\.(genepred|genepredext|refflat)(\.txt)?(\.gz)?|refgene\.txt(\.gz)?)$/i;function ma(t){for(const e of[0,1,2])if(!(t.length<e+rC)&&cC(t,e))return e;return-1}function cC(t,e){const n=t[e+2];if(n!=="+"&&n!=="-")return!1;for(const l of[3,4,5,6,7])if(!S(t[e+l]))return!1;const A=Number(t[e+3]),s=Number(t[e+4]),r=Number(t[e+5]),o=Number(t[e+6]),i=Number(t[e+7]);if(!(s>A)||i<1||r<A||o>s||o<r)return!1;const a=Sn(t[e+8]),c=Sn(t[e+9]);if(a===null||c===null||a.length!==i||c.length!==i||a[0]!==A||c[i-1]!==s)return!1;for(let l=0;l<i;l++)if(c[l]<a[l]||l>0&&a[l]<c[l-1])return!1;return!0}function Sn(t){if(t===void 0||t==="")return null;const e=t.split(",").filter(A=>A!=="");if(e.length===0)return null;const n=[];for(const A of e){if(!S(A))return null;const s=Number(A);if(s<0)return null;n.push(s)}return n}function wa(t,e=""){const n=aC.test(e);let A=0,s=0;const r=t.length;let o=-1;for(;s<r&&A<iC;){let i=t.indexOf(`
20
+ `,s);i<0&&(i=r);let a=i;a>s&&t.charCodeAt(a-1)===13&&a--;const c=t.slice(s,a);if(s=i+1,c===""||c.charCodeAt(0)===35||c.startsWith("track ")||c.startsWith("browser "))continue;const l=c.includes(" ")?c.split(" "):c.trim().split(/\s+/),g=ma(l);if(g<0||o>=0&&g!==o&&!n)return!1;o=g,A++}return A>0}function pa(t){const e=new et;let n=0,A=0;if(wt(t,r=>{const o=ma(r);if(o<0){n++;return}const i=Number(r[o+3]),a=Number(r[o+4]),c=Number(r[o+5]),l=Number(r[o+6]),g=Sn(r[o+8])??[],f=Sn(r[o+9])??[],h=[];for(let d=0;d<g.length;d++)h.push(g[d],f[d]);const u=fC(r[o]),I=lC(r,o);l>c&&A++,e.add(r[o+1]??"",i,a,{strand:r[o+2]==="+"?1:-1,score:o+lA<r.length&&S(r[o+lA])?Number(r[o+lA]):Number.NaN,name:I===""?u:I,id:u,detail:gC(r,o,I,u,g.length),...h.length===0?{}:{exons:h},...l>c?{cds:[c,l]}:{}})}),e.length===0)throw new Error(`No usable rows: all ${n} lines failed the genePred test — a name, a contig, a strand, four coordinates, an exon count and two comma-separated lists of that length.`);const s=e.finish();return ya.set(s,A),s}function lC(t,e){const n=t[e+oC];if(n!==void 0&&n!==""&&n!==".")return n;if(e===0)return"";const A=t[e-1];return A===void 0||A===""||A==="."||S(A)?"":A}function gC(t,e,n,A,s){const r=[`${s} exon${s===1?"":"s"}`];n!==""&&n!==A&&r.push(`gene ${n}`);const o=t[e+12],i=t[e+13];return o!==void 0&&/^(cmpl|incmpl|none|unk)$/.test(o)&&r.push(`cds ${o}/${i??"?"}`),r.join(ct)}function fC(t){return t===void 0||t==="."?"":t}const ya=new WeakMap;function hC(t){return/\bcdsStartStat\b/.test(t)&&/\bexonFrames\b/.test(t)}function ys(t){const e=t.exonStart.length,n=[`${t.length.toLocaleString()} transcript${t.length===1?"":"s"}`,`${e.toLocaleString()} exons`],A=ya.get(t);return A!==void 0&&A<t.length&&n.push(`${A.toLocaleString()} coding`),n.join(" · ")}const co=/^(gneg|gpos\d{0,3}|acen|gvar|stalk)$/,TA="stain",uC=8;function Na(t){return!S(t[1])||!S(t[2])?null:t.length===5&&co.test(t[4])?{name:t[3],stain:t[4]}:t.length===4&&co.test(t[3])?{name:"",stain:t[3]}:null}function ka(t){let e=0,n=0;const A=t.length;for(;n<A&&e<uC;){let s=t.indexOf(`
21
+ `,n);s<0&&(s=A);let r=s;r>n&&t.charCodeAt(r-1)===13&&r--;const o=t.slice(n,r);if(n=s+1,o===""||o.charCodeAt(0)===35||o.startsWith("track ")||o.startsWith("browser "))continue;const i=o.includes(" ")?o.split(" "):o.trim().split(/\s+/);if(Na(i)===null)return!1;e++}return e>0}function IC(t){if(t==="gneg")return 0;if(t.startsWith("gpos")){const e=t.slice(4);if(e==="")return 100;const n=Number(e);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):100}return Number.NaN}function dC(t){const e=t.indexOf(`${TA} `);if(e<0)return"";const n=e+TA.length+1,A=t.indexOf(" ",n);return A<0?t.slice(n):t.slice(n,A)}function ba(t){const e=new et;let n=0;if(wt(t,A=>{const s=Na(A);if(s===null){n++;return}e.add(A[0],Number(A[1]),Number(A[2]),{name:s.name,score:IC(s.stain),detail:`${TA} ${s.stain}`})}),e.length===0&&n>0)throw new Error(`No usable rows: all ${n} lines failed the "sequence, start, end, band, stain" test a cytoBand is made of.`);return e.finish()}function CC(t){const e=[];for(let n=0;n<t.contigs.length;n++){const A=t.contigAt[n],s=t.contigAt[n+1];if(s<=A)continue;let r=0;for(let o=A;o<s;o++){if(t.start[o]!==r)return null;r=t.end[o]}e.push({name:t.contigs[n],length:r})}return e.length>0?e:null}function Da(t){let e=0,n=0;for(let r=0;r<t.length;r++)dC(t.detail[r])==="acen"&&e++,t.name[r]!==""&&n++;const A=t.contigAt.reduce((r,o,i)=>i<t.contigs.length&&t.contigAt[i+1]>t.contigAt[i]?r+1:r,0),s=[`${G.int(t.length)} band${t.length===1?"":"s"}`,`${G.int(A)} sequence${A===1?"":"s"}`];return n<t.length&&s.push(`${G.int(n)} named`),e>0&&s.push(`${G.int(e)} centromeric`),s.join(" · ")}const QC=["non-canonical","GT/AG","GT/AG","GC/AG","GC/AG","AT/AC","AT/AC"],BC="multi",EC="motif",JA="annotated",mC="overhang",wC="anchors",pC=8;function yC(t){const e=[];let n=!1,A=0;const s=t.length;for(;A<s&&e.length<pC;){let r=t.indexOf(`
22
+ `,A);r<0&&(r=s);let o=r;o>A&&t.charCodeAt(o-1)===13&&o--;const i=t.slice(A,o);if(A=r+1,!(i===""||i.charCodeAt(0)===35)){if(i.startsWith("track ")){/junction/i.test(i)&&(n=!0);continue}i.startsWith("browser ")||e.push(i.includes(" ")?i.split(" "):i.trim().split(/\s+/))}}return{rows:e,declared:n}}function Ma(t){if(t.length!==9)return!1;for(let s=1;s<9;s++)if(!S(t[s]))return!1;const e=Number(t[3]),n=Number(t[4]),A=Number(t[5]);return Number(t[2])>=Number(t[1])&&e>=0&&e<=2&&n>=0&&n<=6&&(A===0||A===1)}function Fa(t){if(t.length<12||!S(t[1])||!S(t[2])||t[9]!=="2")return null;const e=t[10].split(",").filter(a=>a!==""),n=t[11].split(",").filter(a=>a!=="");if(e.length!==2||n.length!==2||!e.every(S)||!n.every(S))return null;const A=Number(t[1]),s=Number(t[2]),r=Number(e[0]),o=Number(e[1]),i=Number(n[1]);return Number(n[0])!==0||A+i+o!==s||r<=0||o<=0||i<=r?null:[A+r,i-r,o]}function Sa(t){return t.length===6&&S(t[1])&&S(t[2])&&S(t[4])&&(t[5]==="+"||t[5]==="-"||t[5]===".")}function Ns(t,e=""){const{rows:n,declared:A}=yC(t);if(n.length===0)return null;if(n.every(Ma))return"star";const s=/junc|(^|[._-])sj([._-]|$)/i.test(e.replace(/\.b?gz$/i,"")),r=n.every(o=>/^JUNC/i.test(o[3]??""));return(s||A||r)&&n.every(o=>Fa(o)!==null)?"bed":/\.junc(\.b?gz)?$/i.test(e)&&n.every(Sa)?"junc":null}function lo(t){return t==="+"?1:t==="-"?-1:0}function NC(t){if(t===void 0||t===""||t===".")return Number.NaN;const e=Number(t);return Number.isFinite(e)?e:Number.NaN}function Ra(t,e="",n){const A=Ns(t,e);if(A===null)throw new Error("This is not a junction file STAR, regtools or leafcutter wrote.");const s=new et;let r=0;if(wt(t,o=>{if(A==="star"){if(!Ma(o)){r++;return}const i=Number(o[3]),a=Number(o[4]),c=[`${BC} ${o[7]}`,`${EC} ${QC[a]}`,`${JA} ${o[5]==="1"?"yes":"no"}`,`${mC} ${o[8]}`].join(ct);s.add(o[0],Number(o[1])-1,Number(o[2]),{strand:i===1?1:i===2?-1:0,score:Number(o[6]),detail:c});return}if(A==="bed"){const i=Fa(o);if(i===null){r++;return}const[a,c,l]=i,g=a-Number(o[1]),f=o[3]!==void 0&&o[3]!=="."?o[3]:"";s.add(o[0],a,a+c,{strand:lo(o[5]),score:NC(o[4]),name:f,detail:`${wC} ${g}/${l}`});return}if(!Sa(o)){r++;return}s.add(o[0],Number(o[1]),Number(o[2]),{strand:lo(o[5]),score:Number(o[4]),name:o[3]!=="."?o[3]:""})}),s.length===0&&r>0)throw new Error(`No usable rows: all ${r} lines failed the junction test for this file's shape.`);return s.finish()}function La(t){let e=0,n=0,A=!1;for(let r=0;r<t.length;r++){const o=t.score[r];Number.isFinite(o)&&(e+=o);const i=t.detail[r];i.includes(`${JA} `)&&(A=!0,i.includes(`${JA} yes`)&&n++)}const s=[`${G.int(t.length)} junction${t.length===1?"":"s"}`,`${G.int(e)} read${e===1?"":"s"}`];return A&&s.push(`${G.int(n)} annotated`),s.join(ct)}const $A=11,Rn=9,YA=10,kC=4,bC=/\.(bedmethyl|bigmethyl|bed ?methyl)(\.b?gz)?$/i;function xa(t,e=""){const n=bC.test(e);let A=0,s=0;const r=t.length;for(;s<r&&A<kC;){let o=t.indexOf(`
23
+ `,s);o<0&&(o=r);let i=o;i>s&&t.charCodeAt(i-1)===13&&i--;const a=t.slice(s,i);if(s=o+1,a===""||a.charCodeAt(0)===35||a.startsWith("track ")||a.startsWith("browser "))continue;const c=a.includes(" ")?a.split(" "):a.trim().split(/\s+/);if(!DC(c,n))return!1;A++}return A>0}function DC(t,e){if(t.length<$A||!S(t[1])||!S(t[2]))return!1;const n=Number(t[YA]);if(t[YA]===""||!Number.isFinite(n))return!1;if(e)return!0;if(!S(t[Rn])||Number(t[Rn])<0||n<0||n>100)return!1;const A=t[5];return A!=="+"&&A!=="-"&&A!=="."?!1:Number(t[2])-Number(t[1])===1}function Ga(t){const e=new Map;fo(t,c=>{if(c.length<$A||!S(c[1])||!S(c[2]))return;const l=go(c[3]);e.set(l,(e.get(l)??0)+1)});const n=[...e.entries()].map(([c,l])=>({code:c,label:ql(c),rows:l})).sort((c,l)=>l.rows-c.rows||c.code.localeCompare(l.code));if(n.length===0)throw new Error("This looks like a bedMethyl but holds no usable rows.");const A=n[0].code,s=new Map;let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,i=0,a=0;if(fo(t,c=>{if(c.length<$A||!S(c[1])||!S(c[2])||go(c[3])!==A)return;const l=Number(c[1]),g=Number(c[2]);if(g<=l)return;const f=Number(c[YA]);if(!Number.isFinite(f))return;const h=S(c[Rn])?Number(c[Rn]):0;if(h<=0)return;const u=c[0]??"";let I=s.get(u);I===void 0&&(I=new Is(u),s.set(u,I)),I.push(l,g,f),i++,a+=h,f<r&&(r=f),f>o&&(o=f)}),i===0)throw new Error("This looks like a bedMethyl but every row rests on zero reads, so there is no measurement to draw.");return{signal:ds(s,i,r,o),codes:n,drawn:A,meanCoverage:a/i}}function go(t){return t===void 0||t===""||t==="."?"?":t}function fo(t,e){for(const n of t.split(`
24
+ `)){let A=n;A.endsWith("\r")&&(A=A.slice(0,-1)),!(A===""||A.charCodeAt(0)===35)&&(A.startsWith("track ")||A.startsWith("browser ")||e(A.includes(" ")?A.split(" "):A.trim().split(/\s+/)))}}function MC(t){return/\b(percentMod|percentMeth|fractionModified)\b/.test(t)&&/\b(validCov|coverage|Nvalid_cov)\b/.test(t)}function FC(t){const e=t.codes.find(s=>s.code===t.drawn),n=[`${t.signal.length.toLocaleString()} ${e?.label??t.drawn} calls`,`${t.meanCoverage.toFixed(1)}× mean depth`],A=t.codes.filter(s=>s.code!==t.drawn);return A.length>0&&n.push(`not drawn: ${A.map(s=>`${s.label} (${s.rows.toLocaleString()})`).join(", ")}`),n.join(" · ")}const Ln=440477507,xn=".2bit",Ua=16,SC=new Uint8Array([84,67,65,71]),RC=78;function va(t){if(t.length<4)return!1;const e=new DataView(t.buffer,t.byteOffset,4);return e.getUint32(0,!0)===Ln||e.getUint32(0,!1)===Ln}function LC(t){if(t.length<Ua)throw new Error("This file starts like a .2bit and is too short to hold one.");const e=new DataView(t.buffer,t.byteOffset,t.byteLength),n=e.getUint32(0,!0)===Ln;if(!n&&e.getUint32(0,!1)!==Ln)throw new Error("This is not a .2bit: its first four bytes are not the format’s signature.");const A=e.getUint32(4,n);if(A!==0)throw new Error(`This is a .2bit of version ${A}. This viewer reads version 0 — the ordinary one, with 32-bit offsets. Version 1 is the “long” variant for files past 4 GB, whose offsets and sizes are 64-bit, and reading one as though it were version 0 would return wrong residues rather than fail. Convert it with \`twoBitToFa\` and \`faToTwoBit\`.`);const s=e.getUint32(8,n);if(s===0)throw new Error("This .2bit declares no sequences.");return{littleEndian:n,version:A,count:s}}function ho(t,e,n=Ua){const A=new DataView(t.buffer,t.byteOffset,t.byteLength),s=[];let r=n;const o=new TextDecoder;for(;s.length<e.count&&!(r+1>t.length);){const i=t[r];if(r+1+i+4>t.length)break;const a=o.decode(t.subarray(r+1,r+1+i)),c=A.getUint32(r+1+i,e.littleEndian);s.push({name:a,offset:c}),r+=1+i+4}return{entries:s,complete:s.length===e.count,consumed:r}}function uo(t,e,n,A={}){if(e+8>t.length)return 8;const s=new DataView(t.buffer,t.byteOffset,t.byteLength),r=Ta(s,e,n,A),o=e+8+r*8;return o+4>t.length?o+4-e:null}function Ta(t,e,n,A){return nt(t.getUint32(e+4,n),{format:xn,field:`N-block count${A.name===void 0?"":` of ${A.name}`}`,ceiling:t.getUint32(e,n),...A.fileLeft===void 0?{}:{available:A.fileLeft-8-4},bytesPerItem:8})}function xC(t,e,n,A,s=0,r){const o=new DataView(e.buffer,e.byteOffset,e.byteLength),i=o.getUint32(n,A),a=Ta(o,n,A,{name:t,fileLeft:e.length-n}),c=new Int32Array(a),l=new Int32Array(a),g=n+8,f=g+a*4;for(let d=0;d<a;d++){const C=o.getUint32(g+d*4,A);c[d]=C,l[d]=C+o.getUint32(f+d*4,A)}const h=f+a*4,u=nt(o.getUint32(h,A),{format:xn,field:`mask-block count of ${t}`,ceiling:i,...r===void 0?{}:{available:r-(s+h+4)-4},bytesPerItem:8}),I=s+h+4+u*8+4;return r!==void 0&&ns(I,Math.ceil(i/4),{format:xn,field:`packed bases of ${t}`,size:r}),{name:t,length:i,nStarts:c,nEnds:l,dnaAt:I}}const GC=8192;function UC(t,e,n){const A=Math.max(0,Math.min(e,t.length)),s=Math.max(A,Math.min(n,t.length)),r=Math.floor(A/4),o=Math.ceil(s/4);return{from:t.dnaAt+r,to:t.dnaAt+o,firstBase:r*4}}function vC(t,e,n,A,s){const r=Math.max(0,Math.min(A,n.length)),o=Math.max(r,Math.min(s,n.length)),i=new Uint8Array(o-r);for(let a=r;a<o;a++){const c=a-e,l=t[c>>2];if(l===void 0)break;const g=6-((c&3)<<1);i[a-r]=SC[l>>g&3]}for(let a=0;a<n.nStarts.length;a++){const c=n.nStarts[a];if(c>=o)break;const l=n.nEnds[a];l<=r||i.fill(RC,Math.max(r,c)-r,Math.min(o,l)-r)}return i}function TC(t){return t.map(e=>({name:e.name,length:e.length}))}const Io=65536,Co=1e5;async function JC(t,e){let n=await t(Io,0);const A=LC(n);if(A.count>Co)throw new Error(`This .2bit declares ${A.count.toLocaleString()} sequences, which is past the ${Co.toLocaleString()} this viewer will open one record at a time. A file that says this is far more likely to be truncated than to be an assembly.`);let s=ho(n,A);for(;!s.complete;){const a=await t(Io,n.length);if(a.length===0)throw new Error(`This .2bit ends part-way through its index: it declares ${A.count.toLocaleString()} sequences and names ${s.entries.length.toLocaleString()}. The file is truncated.`);const c=new Uint8Array(n.length+a.length);c.set(n),c.set(a,n.length),n=c,s=ho(n,A)}const r=new Map,o=[];let i=0;for(const a of s.entries){e!==void 0&&ns(a.offset,8,{format:xn,field:`index entry for ${a.name}`,size:e});const c={name:a.name,...e===void 0?{}:{fileLeft:e-a.offset}};let l=await t(GC,a.offset),g=uo(l,0,A.littleEndian,c);for(;g!==null;){const h=await t(g,a.offset);if(h.length<=l.length)throw new Error(`This .2bit ends part-way through the record for ${a.name}.`);l=h,g=uo(l,0,A.littleEndian,c)}const f=xC(a.name,l,0,A.littleEndian,a.offset,e);r.set(f.name,f),o.push(f),i+=f.length}return{ordered:o,records:r,total:i}}const $C=2291137574,YC=2273964779,Qo=[137,72,68,70,13,10,26,10];function OC(t){return t.length<Qo.length?!1:Qo.every((e,n)=>t[n]===e)}function Ja(t){if(t.length<4)return null;const e=new DataView(t.buffer,t.byteOffset,4);for(const n of[!0,!1]){const A=e.getUint32(0,n);if(A===$C)return"bigwig";if(A===YC)return"bigbed"}return null}function ft(t,e){const n=we(nl(t),e);for(let A=0;A<n.names.length;A++)t[A]=n.names[A];return n}function Z(t,e,n){const A=Cl(t,Oa(e)),s=_C(t,e),r=n?.contested??[];return{...A,...s===null?{}:{genomes:s},...r.length===0?{}:{contested:r.slice(0,4).map(o=>`${o.asked} → ${o.name}`)}}}function _C(t,e){const n=new Set;for(const r of e)r.genome!==void 0&&r.genome!==""&&n.add(r.genome);if(n.size===0)return null;const A=new Set(t),s=new Set;for(const r of e)r.genome===void 0||r.genome===""||A.has(r.name)&&s.add(r.genome);return{matched:s.size,total:n.size,named:[...s].slice(0,4)}}function _n(t,e){const n=t.bases.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.bases.get(t.contigs[A].name)}function ks(t,e){const n=t.records.get(e);if(n!==void 0)return n;const A=Kt(t.contigs,e);return A<0?void 0:t.records.get(t.contigs[A].name)}async function $a(t,e,n,A,s){const r=ks(t,e);if(r===void 0)return;const o=Math.max(0,Math.floor(n)),i=Math.min(r.length,Math.ceil(A));if(!(i>o))return new Uint8Array(0);const a=t.held.get(r.name);if(a!==void 0&&a.start<=o&&a.start+a.bases.length>=i)return a.bases.subarray(o-a.start,i-a.start);const c=await Ya(t,r,o,i,s);return t.held.set(r.name,{start:o,bases:c}),c}async function Ya(t,e,n,A,s){const r=s===void 0?{}:{onProgress:s};if(_t(t)){const i=e,a=UC(i,n,A),c=await t.handle.read(a.to-a.from,a.from,r);return vC(c,a.firstBase,i,n,A)}const o=_d(e,n,A);return Kd(await t.handle.read(o.to-o.from,o.from,r))}function Oa(t){return t.map(e=>e.name)}const bs=new Map,Kn=new Map;function Ds(t){return t.indexed===!0}function _t(t){return t.twobit===!0}function me(t){return Ds(t)||_t(t)}const re=new Map,OA=new Map,qn=new Map,Gn=new Map;function KC(t,e){return`${tt(t)}|${tt(e)}`}const Bo=8<<20,Ms=3e8,_A=64e6,Eo=4e6;let Mt=null,oe=null;function tt(t){return t.kind==="local"?`${t.name}|${t.file.size}`:t.url}self.onmessage=t=>{HC(t.data)};const qC=wh();setInterval(()=>{const t={type:"busy",fraction:qC.busy()};self.postMessage(t)},mh);const Hn=new Set,KA=new Set;let qA=0;function HA(t){return Hn.has(t)}async function Fs(t){return await Cs(),!Hn.has(t)}function Pe(){const t=new Error("cancelled");return t.name="AbortError",t}async function HC(t){KA.add(t.id);try{const e=await WC(t);if(HA(t.id))throw Pe();const n={type:"result",id:t.id,payload:e};self.postMessage(n,Ch(e))}catch(e){const n={type:"error",id:t.id,message:e instanceof Error?e.message:String(e),...e instanceof Error&&e.name==="AbortError"?{cancelled:!0}:{}};self.postMessage(n)}finally{KA.delete(t.id),Hn.delete(t.id),t.id>qA&&(qA=t.id)}}function dn(t){return(e,n)=>{const A={type:"progress",id:t,done:e,total:n??0};self.postMessage(A)}}async function WC(t){switch(t.kind){case"load":return eQ(t.entry,t.source,t.mapContigs,dn(t.id));case"sample":return Xa(t.entry,t.regions,t.basesPerPixel,t.reads,t.id,t.exact===!0);case"register":return OA.set(t.entry,t.vector),null;case"run":return PC(t);case"bases":return hQ(t.entry,t.regions,dn(t.id));case"assembly":return zC(t.source,dn(t.id));case"reads":return FQ(t.entry,t.regions,t.maxRows,t.basesPerPixel,t.reads,t.id);case"cancel":return(KA.has(t.target)||t.target>qA)&&Hn.add(t.target),null;case"drop":{bs.delete(t.entry);const e=re.get(t.entry);e!==void 0&&oe?.store===e&&(oe=null),re.delete(t.entry),OA.delete(t.entry),Kn.delete(t.entry),qn.delete(t.entry);for(const[n,A]of Gn)if(A.holders.delete(t.entry)){A.holders.size===0&&Gn.delete(n);break}return null}}}async function PC(t){const e=Td[t.task];if(e===void 0)throw new Error(`no track analysis runner is registered for the task ${t.task}`);const n=[],A=performance.now(),s={params:t.params,framing:t.framing,inputs:t.inputs,cancelled:()=>HA(t.id),throwIfCancelled:()=>{if(HA(t.id))throw Pe()},progress:(o,i,a)=>{const c={type:"progress",id:t.id,done:o,total:i,...a===void 0?{}:{note:a}};self.postMessage(c)},note:o=>{n.push(o)},sample:(o,i,a)=>Xa(o,i,a,void 0,t.id),lengthOf:o=>t.inputs.contigLengths?.[o],residues:o=>{const i=re.get(o);if(i!==void 0)return me(i)?{contigs:i.contigs,bases:()=>{},read:async(a,c,l)=>{const g=ks(i,a);if(g===void 0)return;const f=Math.max(0,Math.floor(c)),h=Math.min(g.length,Math.ceil(l));return h>f?Ya(i,g,f,h):new Uint8Array(0)},refusal:_t(i)?`This .2bit is read by range rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(_A/1e6)} MB is held whole (\`twoBitToFa\`).`:`This FASTA is read by range from its index rather than held, so its sequences are not here whole to read. A FASTA under ${G.int(_A/1e6)} MB is held whole.`}:{contigs:i.contigs,bases:a=>_n(i,a)}}};return{outputs:await e(s),provenance:{task:t.task,taskVersion:0,params:t.params,framing:t.framing,app:[Jd,$d].filter(o=>o!=="").join(" "),createdAt:new Date().toISOString()},notes:n,ms:performance.now()-A}}async function zC(t,e){const n=xt(t),A=await n.read(64,0);if(OC(A))return{format:"hdf5",contigs:[],origin:"features",exact:!0};const s=Ja(A);if(s!==null){const h=await(s==="bigwig"?new Go({filehandle:xt(t)}):new vo({filehandle:xt(t)})).getHeader();return{format:s,contigs:Ss(h),origin:s,exact:!0}}if(He(A)){const f=await Ne(n,t),h=await Va(n,f??Number.MAX_SAFE_INTEGER);if(h!==null)return{format:"bam",contigs:h.refs.map(u=>({name:u.name,length:u.length})),origin:"bam",exact:!0}}if(yn(A))return{format:"fasta",contigs:(await Wa(t,n,e)).contigs,origin:"fasta",exact:!0};if(va(A))return{format:"twobit",contigs:(await Pa(t,n,e)).contigs,origin:"twobit",exact:!0};const r=await n.readFile({onProgress:e}),o=await as(r);if(yn(o))return{format:"fasta",contigs:Ls(t,o).contigs,origin:"fasta",exact:!0};const i=new TextDecoder().decode(o);if(i.trim()==="")throw new Error("This file is empty.");if(yh(i,t.name))return Mt={key:tt(t),format:"sizes",features:null},{format:"sizes",contigs:ph(i),origin:"sizes",exact:!0};if(Vo(i)){const f=ng(i);if(f.length>0)return{format:"vcf",contigs:f,origin:"vcf",exact:!0};const h=ti(i),u=new Map;for(let I=0;I<h.length;I++)lt(u,h.contigs[h.contig[I]],h.end[I]);return{format:"vcf",contigs:It(u),origin:"features",exact:!1}}if(hs(A)){const f=await Ha(n),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(mA(i,t.name)||EA(i,t.name)||hi(i,t.name)){const f=mA(i,t.name)?Ei(i,t.name):EA(i,t.name)?di(i,t.name):Ci(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"structure",contigs:It(h),origin:"features",exact:!1}}if(ii(i,t.name)){const f=li(i,t.name),h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"barchart",contigs:It(h),origin:"features",exact:!1}}if(ka(i)){const f=ba(i);Mt={key:tt(t),format:"cytoband",features:f};const h=CC(f);if(h!==null)return{format:"cytoband",contigs:h,origin:"cytoband",exact:!0};const u=new Map;for(let I=0;I<f.length;I++)lt(u,f.contigs[f.contig[I]],f.end[I]);return{format:"cytoband",contigs:It(u),origin:"features",exact:!1}}if(Ns(i,t.name)!==null){const f=Ra(i,t.name);Mt={key:tt(t),format:"junctions",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"junctions",contigs:It(h),origin:"features",exact:!1}}if(Ia(i,t.name)){const f=da(i);return{format:"interact",contigs:gA(f),origin:"features",exact:!1}}if(Qa(i,t.name)){const f=Ba(i);return{format:"longrange",contigs:gA(f),origin:"features",exact:!1}}if(wa(i,t.name)){const f=pa(i);Mt={key:tt(t),format:"genepred",features:f};const h=new Map;for(let u=0;u<f.length;u++)lt(h,f.contigs[f.contig[u]],f.end[u]);return{format:"genepred",contigs:It(h),origin:"features",exact:!1}}if(xa(i,t.name)){const{signal:f}=Ga(i),h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:"bedmethyl",contigs:It(h),origin:"features",exact:!1}}const a=Di(i);if(a!==null){const f=a==="wig"?Fi(i):Mi(i);Mt={key:tt(t),format:a,features:null};const h=new Map;for(const u of f.contigs){let I=0;for(const d of u.ends)d>I&&(I=d);lt(h,u.name,I)}return{format:a,contigs:It(h),origin:"features",exact:!1}}const c=ei(i,t.name);if(c==="bedpe"){const f=oi(i);return Mt={key:tt(t),format:c,features:null},{format:c,contigs:gA(f),origin:"features",exact:!1}}const l=c==="gtf"?si(i):ls(i,t.name);Mt={key:tt(t),format:c,features:l};const g=new Map;for(let f=0;f<l.length;f++)lt(g,l.contigs[l.contig[f]],l.end[f]);return{format:c,contigs:It(g),origin:"features",exact:!1}}function Ss(t){return Object.values(t.refsByNumber).sort((e,n)=>e.id-n.id).map(e=>({name:e.name,length:e.length}))}function lt(t,e,n){const A=t.get(e);(A===void 0||n>A)&&t.set(e,n)}function gA(t){const e=new Map;for(let n=0;n<t.length;n++)lt(e,t.contigs[t.contig1[n]],t.end1[n]),lt(e,t.contigs[t.contig2[n]],t.end2[n]);return It(e)}function It(t){const e=[];for(const[n,A]of t){const s=10**Math.max(0,Math.floor(Math.log10(Math.max(1,A)))-2);e.push({name:n,length:(Math.floor(A/s)+1)*s})}return e}const Zt=new Map,XC=8;function xt(t){if(t.kind==="local")return new Ac(t.file);const{credential:e,headers:n}=t,A=`${t.url}|${e===void 0?"":JSON.stringify(e)}|${n===void 0?"":JSON.stringify(n)}`,s=Zt.get(A);if(s!==void 0)return Zt.delete(A),Zt.set(A,s),s;const r=e===void 0&&n===void 0?new Qr(t.url):new Qr(t.url,{fetch:(o,i)=>{const a=typeof o=="string"?o:o.url;return fetch(o,Gi(i,{url:a,...n===void 0?{}:{headers:n},...e===void 0?{}:{credential:e}}))}});for(Zt.set(A,r);Zt.size>XC;){const o=Zt.keys().next().value;Zt.delete(o)}return r}async function VC(t,e,n,A){const s=Rs(t);if(s===null||!He(n))return null;try{const r=await Ot(await xt(s).readFile()),o=ul(r),i=await Ne(e,t);if(i===null)return null;const a=Il(o,dl(o,Oa(A)),i);if(a.length===0||a.reduce((f,h)=>f+(h.to-h.from),0)>i*.8)return null;const l=[];for(const f of a){const h=await e.read(f.to-f.from,f.from),u=new TextDecoder().decode(await Ot(h,f.lastBlock-f.from));l.push(ZC(u,f.from===0,tQ(h,f,i)))}const g=l.join("");return g===""?null:g}catch{return null}}function ZC(t,e,n){let A=t;if(!e){const s=A.indexOf(`
25
+ `);A=s<0?"":A.slice(s+1)}if(!n&&!A.endsWith(`
26
+ `)){const s=A.lastIndexOf(`
27
+ `);A=s<0?"":A.slice(0,s+1)}return A}const jC=28;function tQ(t,e,n){if(e.to<n)return!1;const A=e.lastBlock-e.from;if(A<0||A>=t.length)return!1;const s=pe(t.subarray(A,Math.min(A+64,t.length)));return s===null||A+s>t.length?!1:t.length-(A+s)<=jC}function Rs(t){return t.kind==="local"?t.index===void 0?null:{kind:"local",file:t.index,name:t.index.name}:t.index===void 0?null:{kind:"remote",url:t.index,name:t.index,...t.credential===void 0?{}:{credential:t.credential},...t.headers===void 0?{}:{headers:t.headers}}}async function Ne(t,e){const n=t.stat;if(typeof n=="function")try{const A=(await n.call(t)).size;if(Number.isFinite(A)&&A>0)return A}catch{}if(e===void 0||e.kind!=="remote")return null;try{const{credential:A,headers:s}=e,r=await fetch(e.url,Gi({method:"HEAD",mode:"cors"},{url:e.url,method:"HEAD",...s===void 0?{}:{headers:s},...A===void 0?{}:{credential:A}}));if(!r.ok)return null;const o=Number(r.headers.get("Content-Length")??Number.NaN);return Number.isFinite(o)&&o>0?o:null}catch{return null}}async function eQ(t,e,n,A){const s=xt(e),r=await s.read(64,0),o=Ja(r);if(o==="bigwig")return IQ(t,e,n);if(o==="bigbed")return uQ(t,e,n);if(He(r)){const I=await Ne(s,e),d=await Va(s,I??Number.MAX_SAFE_INTEGER);if(d!==null){if(I===null)throw new Error(`${e.name} cannot be measured — its host states neither Content-Range nor Content-Length to a page — and a BAM is read by byte range.`);return BQ(t,e,s,n,d,I,A)}}if(yn(r))return hA(t,await Wa(e,s,A),n);if(va(r))return hA(t,await Pa(e,s,A),n);if(hs(r))return iQ(s,n);const i=Mt;if(i!==null&&i.key===tt(e)&&i.features!==null)return Mt=null,WA(i.format,i.features,n);const a=await VC(e,s,r,n),c=a===null?await as(await s.readFile({onProgress:A})):null;if(c!==null&&yn(c))return hA(t,Ls(e,c),n);const l=a??new TextDecoder().decode(c);if(l.trim()==="")throw new Error("This file is empty.");if(Vo(l))return nQ(l,n);if(mA(l,e.name))return fA(l,e.name,n,Ei);if(EA(l,e.name))return fA(l,e.name,n);if(hi(l,e.name))return fA(l,e.name,n,Ci);if(ii(l,e.name))return qa(l,e.name,n);if(ka(l))return rQ(l,n);if(Ns(l,e.name)!==null)return oQ(l,e.name,n);if(Ia(l,e.name))return _a(l,n);if(Qa(l,e.name))return AQ(l,n);if(wa(l,e.name))return sQ(l,n);if(xa(l,e.name))return Ka(t,l,n);const f=Di(l);if(f!==null)return dQ(t,f,l,n);const h=ei(l,e.name);if(h==="bedpe"){const I=oi(l),d=ft(I.contigs,n);return{format:h,contigs:I.contigs,overlap:Z(I.contigs,n,d),summary:`${G.int(I.length)} pair${I.length===1?"":"s"}`,payload:{kind:"pairs",data:I}}}const u=h==="gtf"?si(l):ls(l,e.name);return WA(h,u,n)}function nQ(t,e){const n=ti(t),A=ft(n.contigs,e),s=tg(t);return{format:"vcf",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:`${G.int(n.length)} variant${n.length===1?"":"s"}`+(s===0?"":` · ${G.int(s)} sample${s===1?"":"s"} not drawn`),payload:{kind:"features",data:n}}}function _a(t,e){const n=da(t),A=ft(n.contigs,e);return{format:"interact",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:eC(n),payload:{kind:"pairs",data:n}}}function AQ(t,e){const n=Ba(t),A=ft(n.contigs,e);return{format:"longrange",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:sC(n),payload:{kind:"pairs",data:n}}}function sQ(t,e){const n=pa(t),A=ft(n.contigs,e);return{format:"genepred",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:ys(n),payload:{kind:"features",data:n}}}function Ka(t,e,n){const A=Ga(e),s=A.signal,r=we(s.contigs.map(a=>({name:a.name})),n);s.contigs.forEach((a,c)=>{a.name=r.names[c]});const o=new Si(s);Kn.set(t,o);const i=o.contigNames;return{format:"bedmethyl",contigs:i,overlap:Z(i,n,r),summary:FC(A),fileExtent:{min:0,max:100}}}function qa(t,e,n){const A=li(t,e),s=ft(A.contigs,n);return{format:"barchart",contigs:A.contigs,overlap:Z(A.contigs,n,s),summary:Gg(A),payload:{kind:"features",data:A}}}function rQ(t,e){const n=ba(t),A=ft(n.contigs,e);return{format:"cytoband",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:Da(n),payload:{kind:"features",data:n}}}function oQ(t,e,n){const A=Ra(t,e),s=ft(A.contigs,n);return{format:"junctions",contigs:A.contigs,overlap:Z(A.contigs,n,s),summary:La(A),payload:{kind:"features",data:A}}}function fA(t,e,n,A=di){const s=A(t,e),r=ft(s.contigs,n);return{format:"structure",contigs:s.contigs,overlap:Z(s.contigs,n,r),summary:Bi(s),payload:{kind:"features",data:s}}}async function Ha(t){const e=(o,i)=>t.read(o,i),n=await Ne(t),A=await Zg(e,n??void 0),s=Math.min(...A.resolutions),r=await jg(e,A,s);return Object.assign(r,{header:A})}async function iQ(t,e){const n=await Ha(t),A=ft(n.contigs,e),s=n.header.resolutions.filter(o=>o!==n.model?.width),r=[Bi(n),tf(n.header),...s.length===0?[]:[`also at ${s.join(", ")} bp`]].join(ct);return{format:"structure",contigs:n.contigs,overlap:Z(n.contigs,e,A),summary:r,payload:{kind:"features",data:n}}}function WA(t,e,n){const A=e.exonStart.length,s=ft(e.contigs,n);return{format:t,contigs:e.contigs,overlap:Z(e.contigs,n,s),summary:t==="gtf"?`${G.int(e.length)} transcripts · ${G.int(A)} exons`:t==="genepred"?ys(e):t==="cytoband"?Da(e):t==="junctions"?La(e):`${G.int(e.length)} feature${e.length===1?"":"s"}`,payload:{kind:"features",data:e}}}async function Wa(t,e,n){const A=oe;if(A!==null&&A.key===tt(t))return A.store;const s=t.kind==="local"?t.file.size:await Ne(e,t),r=s!==null&&s>0;if(r&&s<=_A)return mo(t,e,n);const o=await aQ(t,e);if(o!==null)return oe={key:tt(t),store:o},o;if(r&&s>Ms)throw za(s,t);return mo(t,e,n)}async function mo(t,e,n){return Ls(t,await as(await e.readFile({onProgress:n})))}async function aQ(t,e){const n=t.index!==void 0?t:t.kind==="remote"&&ua.test(t.url)?{...t,index:qd(t.url)}:null,A=n===null?null:Rs(n);if(A===null)return null;try{const s=Yd(new TextDecoder().decode(await xt(A).readFile()));return s.length===0?null:{indexed:!0,contigs:Od(s),records:new Map(s.map(r=>[r.name,r])),handle:e,total:s.reduce((r,o)=>r+o.length,0),held:new Map}}catch{return null}}async function Pa(t,e,n){const A=oe;if(A!==null&&A.key===tt(t)&&_t(A.store))return A.store;const s=await Ne(e),r=await JC((i,a)=>e.read(i,a,{onProgress:n}),s??void 0),o={twobit:!0,contigs:TC(r.ordered),records:r.records,handle:e,total:r.total,held:new Map};return oe={key:tt(t),store:o},o}function Ls(t,e){if(e.length>Ms)throw za(e.length,t);const n=Lf(e);if(n.contigs.length===0)throw new Error("This looks like a FASTA but holds no sequences.");return oe={key:tt(t),store:n},n}function za(t,e){const n=e.name.replace(/[#?].*$/,"")||"genome.fa";return new Error(`This FASTA is ${G.int(Math.round(t/1e6))} MB and has no index. It would be read whole and held whole — which is what makes panning free — so anything over ${G.int(Ms/1e6)} MB is refused rather than allowed to take the tab with it. Index it (\`samtools faidx ${n}\`) and ${e.kind==="local"?"drop the .fai with it":"publish the .fai beside it, or name it with #index=<url>"}: an indexed FASTA opens at once and is read by range.`)}function hA(t,e,n){const A=lQ(e,n);re.set(t,e);const s=e.contigs.map(r=>r.name);return{format:_t(e)?"twobit":"fasta",contigs:s,overlap:Z(s,n,A),summary:`${xs(s.length)} · ${G.bp(e.total)}`+(_t(e)?" · read by range, two bits a base":Ds(e)?" · read by range from its index":""),...me(e)?{byRange:{bases:e.total,bytesPerBase:cQ(e)}}:{}}}function cQ(t){if(_t(t))return .25;let e=0,n=0;for(const A of t.records.values())e+=A.length*A.lineWidth/A.lineBases,n+=A.length;return n>0?e/n:1}function lQ(t,e){const n=we(t.contigs,e);if(n.renamed===0)return n;if(_t(t)||Ds(t))return t.records=wo(t.records,t.contigs,n.names),t.held.clear(),n;const A=new Map;return t.contigs.forEach((s,r)=>{const o=t.bases.get(s.name);s.name=n.names[r],o!==void 0&&A.set(s.name,o)}),t.bases=A,n}function wo(t,e,n){const A=new Map;return e.forEach((s,r)=>{const o=t.get(s.name);s.name=n[r],o!==void 0&&A.set(s.name,{...o,name:s.name})}),A}async function gQ(t,e,n,A){const s=[];let r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;if(me(t)&&e.reduce((a,c)=>a+Math.max(0,c.end-c.start),0)>Eo)return{basesPerPixel:n,regions:[],extent:null,note:`GC under ${G.int(Eo/1e6)} Mb, letters at base resolution — zoom in`};for(const i of e){if(!(i.end>i.start))continue;let a;if(me(t)){const c=Math.max(0,Math.floor(i.start)),l=await $a(t,i.contig,c,i.end,A);if(l===void 0||l.length===0)continue;a=Ir(l,0,l.length,n);for(let g=0;g<a.starts.length;g++)a.starts[g]+=c,a.ends[g]+=c}else{const c=_n(t,i.contig);if(c===void 0)continue;a=Ir(c,i.start,i.end,n)}if(a.values.length!==0){for(const c of a.values)Number.isFinite(c)&&(c<r&&(r=c),c>o&&(o=c));s.push({contig:i.contig,start:i.start,end:i.end,starts:a.starts,ends:a.ends,values:a.values,min:null,max:null,variant:null,summary:!0})}}return{basesPerPixel:n,regions:s,extent:r<=o?{min:r,max:o}:null}}const fQ=4e5;async function hQ(t,e,n){const A=re.get(t);if(A===void 0)throw new Error("This sequence is no longer open. Drop the file again.");const s=[];let r=fQ;for(const o of e){const i=Math.max(0,Math.floor(o.start));if(me(A)){const l=await $a(A,o.contig,i,Math.min(Math.ceil(o.end),i+r),n);if(l===void 0||l.length===0)continue;if(r-=l.length,s.push({contig:o.contig,start:i,end:i+l.length,bases:l.slice()}),r<=0)break;continue}const a=_n(A,o.contig);if(a===void 0)continue;const c=Math.min(a.length,Math.ceil(o.end),i+r);if(c>i&&(r-=c-i,s.push({contig:o.contig,start:i,end:c,bases:a.slice(i,c)}),r<=0))break}return{regions:s}}const PA=1e6;async function uQ(t,e,n){const A=new vo({filehandle:xt(e)}),s=await A.getHeader(),r=Ss(s),o=[];let i=!1;for(const f of r){if(o.length>=PA){i=!0;break}const h=await A.getFeatures(f.name,0,f.length);for(const u of h){if(o.length>=PA){i=!0;break}const I=typeof u.rest=="string"&&u.rest!==""?` ${u.rest}`:"";o.push(`${f.name} ${u.start} ${u.end}${I}`)}}const a=o.join(`
28
+ `),c=s.autoSql??"";if(xg(c)){const f=qa(a,e.name,n);return i?{...f,summary:Re(f.summary)}:f}if(tC(c)){const f=_a(a,n);return i?{...f,summary:Re(f.summary)}:f}if(MC(c)){const f=Ka(t,a,n);return i?{...f,summary:Re(f.summary)}:f}const l=ls(a,e.name);if(hC(c)){const f=ft(l.contigs,n),h={format:"genepred",contigs:l.contigs,overlap:Z(l.contigs,n,f),summary:ys(l),payload:{kind:"features",data:l}};return i?{...h,summary:Re(h.summary)}:h}const g=WA("bigbed",l,n);return{...g,summary:i?Re(g.summary):g.summary}}function Re(t){return`${t} · cut off at ${G.int(PA)}`}async function IQ(t,e,n){const A=new Go({filehandle:xt(e)}),s=await A.getHeader(),r=we(Ss(s),n),o=r.names;bs.set(t,{bigwig:A,refOf:r.sourceOf,refNames:Object.keys(s.refsByName)});const i=s.totalSummary,a=i!==void 0&&Number.isFinite(i.scoreMin)&&Number.isFinite(i.scoreMax)&&i.scoreMax>i.scoreMin;return{format:"bigwig",contigs:o,overlap:Z(o,n,r),summary:xs(o.length)+(a?` · ${ie(i.scoreMin)}–${ie(i.scoreMax)}`:""),...a?{fileExtent:{min:i.scoreMin,max:i.scoreMax}}:{}}}function dQ(t,e,n,A){const s=e==="wig"?Fi(n):Mi(n);if(s.length===0)throw new Error(`This looks like a ${e==="wig"?"wig":"bedGraph"} but holds no usable intervals.`);const r=we(s.contigs.map(g=>({name:g.name})),A);s.contigs.forEach((g,f)=>{g.name=r.names[f]});const o=new Si(s);Kn.set(t,o);const i=o.contigNames,{min:a,max:c}=o.extent,l=Number.isFinite(a)&&Number.isFinite(c)&&c>a;return{format:e,contigs:i,overlap:Z(i,A,r),summary:`${G.int(o.length)} intervals · ${xs(i.length)}`+(l?` · ${ie(a)}–${ie(c)}`:""),...l?{fileExtent:{min:a,max:c}}:{}}}function CQ(t,e,n){const A=[];let s=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY;for(const o of e){if(!t.has(o.contig)||o.end<=o.start)continue;const i=t.samples(o.contig,o.start,o.end,n);if(i!==null){for(const a of i.values)Number.isFinite(a)&&(a<s&&(s=a),a>r&&(r=a));A.push({contig:o.contig,start:o.start,end:o.end,variant:null,...i})}}return{basesPerPixel:n,regions:A,extent:s<=r?{min:s,max:r}:null}}async function Xa(t,e,n,A,s,r=!1){const o=qn.get(t);if(o!==void 0)return NQ(s,o,e,n,A);const i=re.get(t);if(i!==void 0)return gQ(i,e,n,dn(s));const a=Kn.get(t);if(a!==void 0)return CQ(a,e,n);const c=OA.get(t);if(c!==void 0)return Dh(c,e,n,r);const l=bs.get(t);if(l===void 0)throw new Error("This track is no longer open. Drop the file again.");const g=C=>{const E=l.refOf.get(C);if(E!==void 0)return E;const B=Kt(l.refNames,C);if(!(B<0))return l.refOf.set(C,l.refNames[B]),l.refNames[B]},f=e.filter(C=>g(C.contig)!==void 0&&C.end>C.start);if(f.length===0)return{basesPerPixel:n,regions:[],extent:null};const h=await l.bigwig.getFeaturesAsArraysMulti(f.map(C=>({refName:g(C.contig)??C.contig,start:Math.max(0,Math.floor(C.start)),end:Math.ceil(C.end)})),{basesPerSpan:Math.max(1,n)}),u=[];let I=Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY;for(let C=0;C<f.length;C++){const E=h.regionOffsets[C],B=h.regionOffsets[C+1],Q=h.scores.slice(E,B);for(let m=0;m<Q.length;m++){const p=Q[m];Number.isFinite(p)&&(p<I&&(I=p),p>d&&(d=p))}u.push({contig:f[C].contig,start:f[C].start,end:f[C].end,starts:h.starts.slice(E,B),ends:h.ends.slice(E,B),values:Q,min:h.isSummary?h.minScores.slice(E,B):null,max:h.isSummary?h.maxScores.slice(E,B):null,variant:null,summary:h.isSummary})}return{basesPerPixel:n,regions:u,extent:I<=d?{min:I,max:d}:null}}const QQ=1<<18,po=1<<24;async function Va(t,e){const n=Number.isFinite(e)&&e>0?e:Number.MAX_SAFE_INTEGER;let A=QQ;for(;;){let s;try{s=await Ot(await t.read(Math.min(A,n),0))}catch{return null}if(!Po(s))return null;const r=Nl(s);if(r!==null)return r;if(A>=n||A>=po)throw new Error("This BAM's header is truncated: its reference table does not end.");A=Math.min(A*4,po)}}async function BQ(t,e,n,A,s,r,o){if(s.sortOrder==="queryname"||s.sortOrder==="unsorted")throw new Error(`${e.name} is sorted by ${s.sortOrder==="queryname"?"read name":"nothing"}, and reads are drawn by region. Run \`samtools sort -o sorted.bam ${e.name}\` and index the result.`);const i=Rs(e),a=i===null?`${tt(e)}|search`:KC(e,i),c=Gn.get(a);let l=null,g=null,f="";if(c!==void 0)l=c.open.index,g=c.open.search,f=c.open.searched;else{if(i===null)f="no index dropped with it";else try{l=await hf(await xt(i).readFile({onProgress:o}))}catch(C){const E=C instanceof Error?C.message:String(C);f=i.kind==="remote"?`no ${i.url.split("?")[0].split("/").pop()??"index"} beside it`:`${i.name} could not be read (${E})`}if(l===null){if(!Number.isFinite(r)||r<=0)throw new Error(`${e.name} has ${f}, and its length could not be learnt, so its reads cannot be located by search either. A BAM is read by region: publish its index beside it, or name one with \`${e.kind==="remote"?e.url:e.name}#index=<url of the .bai>\`.`);try{g=await us.open(n,r,s,C=>o(C,0))}catch(C){if(C instanceof wA)throw new Error(EQ(e.name,s,C));const E=C instanceof Error?C.message:String(C);throw new Error(`${e.name} has ${f} and could not be read by search: ${E}. A BAM is read by region; run \`samtools index ${e.name}\` and publish the index beside it, or name one with \`#index=<url of the .bai>\`.`)}}}const h=we(s.refs,A),u=h.names,I=new Map;for(let C=0;C<u.length;C++)I.set(u[C],C);for(let C=0;C<s.refs.length;C++)I.has(s.refs[C].name)||I.set(s.refs[C].name,C);const d=c?.open??{handle:n,header:s,index:l,search:g,searched:f,size:r,refIdOf:I,refNames:s.refs.map(C=>C.name)};return c===void 0?Gn.set(a,{open:d,holders:new Set([t])}):c.holders.add(t),qn.set(t,d),{format:"bam",contigs:u,overlap:Z(u,A,h),summary:`${G.int(s.refs.length)} reference${s.refs.length===1?"":"s"} · ${l!==null?l.format.toUpperCase():`${f} — reads located by search`}`}}function EQ(t,e,n){const A=e.sortOrder==="coordinate"?"its header says SO:coordinate, but":"its header has no @HD line to say so, and";return`${t} is not in coordinate order — ${A} the reads at byte ${G.int(n.before.block)} are on ${fr(n.before,e.refs)} while those at byte ${G.int(n.after.block)}, later in the file, are on ${fr(n.after,e.refs)}. Reads are drawn by region, which needs the file sorted and indexed: run \`samtools sort -o sorted.bam ${t}\` and \`samtools index sorted.bam\`. The alignment file a Hi-C pipeline writes is in read-pair order for its pairs step and is not made for browsing; its .pairs or its contact map is the file to open.`}const mQ=4e6;function wQ(t,e){if(t.search===null)return null;const n=e.reduce((A,s)=>A+(s.end-s.start),0);return e.length>1||n>mQ?`${pQ(n)} without an index — zoom in`:null}function pQ(t){return t>=1e6?`${ie(t/1e6)} Mb`:`${ie(t/1e3)} kb`}async function Za(t,e,n,A,s){const r=Math.max(0,Math.floor(n.start)),o=Math.ceil(n.end);return t.index!==null?Ef(t.index,e,r,o,t.size):t.search===null?[]:t.search.spansFor(e,r,o,async()=>{if(!await Fs(A))throw Pe()},s)}function ja(t){return t===void 0?ki:{exclude:Wo|(t.hideDuplicates?At.DUPLICATE:0),minMapq:t.minMapq}}function yQ(t){const e=ja(t);return t.splits?{...e,exclude:e.exclude&-2049}:e}async function NQ(t,e,n,A,s){const r=I=>{const d=e.refIdOf.get(I);if(d!==void 0)return d;const C=Kt(e.refNames,I);if(!(C<0))return e.refIdOf.set(I,C),C},o=n.filter(I=>r(I.contig)!==void 0&&I.end>I.start);if(o.length===0)return{basesPerPixel:A,regions:[],extent:null};const i=wQ(e,o);if(i!==null)return{basesPerPixel:A,regions:[],extent:null,note:i};const a=[];for(const I of o){const d=r(I.contig);a.push({region:I,refId:d,spans:await Za(e,d,I,t,Bo)})}const c=a.reduce((I,d)=>I+yi(d.spans),0);if(c>Bo)return{basesPerPixel:A,regions:[],extent:null,note:`${G.bytes(c)} of reads — zoom in`};const l=[];let g=Number.POSITIVE_INFINITY,f=Number.NEGATIVE_INFINITY;const h=s?.modFraction===!0,u=[];for(const I of a){const d=I.region.end-I.region.start,C=Math.max(1,Math.min(4096,Math.round(d/Math.max(1,A)))),E=new Float64Array(C),B=new Map;u.push(B);const Q=A<=RQ?tc(I.region):void 0,m=Q===void 0?null:new Float64Array(C),p=new Map;for(const D of I.spans){if(!await Fs(t))throw Pe();const F=await e.handle.read(D.to-D.from,D.from),R=await Ot(F,D.lastBlock-D.from),v=Uf(R,D.dataFrom,I.refId,Math.floor(I.region.start),Math.ceil(I.region.end),C,ja(s),Q,p,h?{tally:B,threshold:s.modThreshold}:void 0);for(let x=0;x<C;x++)E[x]+=v.depth[x];if(m!==null&&v.variant!==null)for(let x=0;x<C;x++)m[x]+=v.variant[x]}const w=new Int32Array(C),y=new Int32Array(C),N=new Float32Array(C),k=m===null?null:new Float32Array(C),b=d/C;for(let D=0;D<C;D++)w[D]=Math.round(I.region.start+D*b),y[D]=Math.round(I.region.start+(D+1)*b),N[D]=E[D],k!==null&&m!==null&&(k[D]=m[D]),E[D]<g&&(g=E[D]),E[D]>f&&(f=E[D]);l.push({contig:I.region.contig,start:I.region.start,end:I.region.end,starts:w,ends:y,values:N,variant:k,junctions:bQ(p),min:null,max:null,summary:!1})}return h?kQ(A,l,u,s.modCode):{basesPerPixel:A,regions:l,extent:g<=f&&f>0?{min:0,max:f}:null}}function kQ(t,e,n,A){const s=new Map;for(const c of n)for(const[l,g]of c){const f=s.get(l)??[0,0];f[0]+=g.modified.reduce((h,u)=>h+u,0),f[1]+=g.calls.reduce((h,u)=>h+u,0),s.set(l,f)}const r=[...s.entries()].sort((c,l)=>l[1][0]-c[1][0]||l[1][1]-c[1][1]).map(([c])=>c),o=A!==""?A:r[0]??"";let i=!1;const a=e.map((c,l)=>{const g=n[l].get(o),f=new Float32Array(c.values.length).fill(Number.NaN);if(g!==void 0)for(let h=0;h<f.length;h++)g.calls[h]<=0||(f[h]=100*g.modified[h]/g.calls[h],i=!0);return{...c,values:f,variant:null,junctions:void 0}});return{basesPerPixel:t,regions:a,extent:i?{min:0,max:100}:null,mods:{code:o,codes:r},...r.length===0?{note:"no MM/ML modification calls here"}:{}}}function bQ(t){const e=[];for(const[s,r]of t){const[o,i,a]=s.split(":").map(Number);e.push([o,i,a,r])}e.sort((s,r)=>s[0]-r[0]||s[1]-r[1]||s[2]-r[2]);const n=e.length,A={starts:new Int32Array(n),ends:new Int32Array(n),counts:new Float32Array(n),strands:new Int8Array(n)};return e.forEach(([s,r,o,i],a)=>{A.starts[a]=s,A.ends[a]=r,A.strands[a]=o,A.counts[a]=i}),A}const yo=4<<20,DQ=2e5,MQ=40;async function FQ(t,e,n,A,s,r){const o=qn.get(t);if(o===void 0)throw new Error("This track is no longer open. Drop the file again.");const i={piles:[],total:0,kept:0,capped:!1,rows:0,diffs:"none"},a=m=>{const p=o.refIdOf.get(m);if(p!==void 0)return p;const w=Kt(o.refNames,m);if(!(w<0))return o.refIdOf.set(m,w),w},c=e.filter(m=>a(m.contig)!==void 0&&m.end>m.start);if(c.length===0)return i;const l=c.reduce((m,p)=>m+(p.end-p.start),0);if(l>DQ)return{...i,note:`${ie(l/1e3)} kb — too wide to draw reads`};const g=[];for(const m of c){const p=a(m.contig);g.push({region:m,refId:p,spans:await Za(o,p,m,r,yo)})}const f=g.reduce((m,p)=>m+yi(p.spans),0);if(f>yo)return{...i,note:`${G.bytes(f)} of reads here — zoom in`};const h=[];let u=0,I=0,d=!1,C=0,E=!1,B=!1,Q=!1;for(const m of g){const p=tc(m.region);p!==void 0&&(Q=!0);for(const w of m.spans){if(!await Fs(r))throw Pe();const y=await o.handle.read(w.to-w.from,w.from),N=await Ot(y,w.lastBlock-w.from),k=_f(N,w.dataFrom,m.region.contig,m.refId,Math.floor(m.region.start),Math.ceil(m.region.end),{filter:yQ(s),maxRows:n,maxReads:SQ,colourBy:s.colourBy,withNames:A<=MQ,refNameOf:b=>o.refNames[b],...p===void 0?{}:{reference:p}});u+=k.total,I+=k.kept,d=d||k.capped,C=Math.max(C,k.rows),E=E||k.usedMd,B=B||k.usedCigar,(k.pile.length>0||h.length===0)&&h.push(k.pile)}}return{piles:h,total:u,kept:I,capped:d,rows:C,diffs:B?"cigar":E?"md":Q?"reference":"none"}}const SQ=2e4,RQ=16;function tc(t){const e=Math.max(0,Math.floor(t.start));for(const n of re.values()){if(me(n)){const r=ks(n,t.contig),o=r===void 0?void 0:n.held.get(r.name);if(o===void 0)continue;const i=Math.min(o.start+o.bases.length,Math.ceil(t.end));if(o.start>e||i<=e)continue;return{start:e,bases:o.bases.subarray(e-o.start,i-o.start)}}const A=_n(n,t.contig);if(A===void 0)continue;const s=Math.min(A.length,Math.ceil(t.end));if(!(s<=e))return{start:e,bases:A.subarray(e,s)}}}function xs(t){return`${G.int(t)} sequence${t===1?"":"s"}`}function ie(t){if(!Number.isFinite(t))return"—";const e=Math.abs(t);return e===0?"0":e>=1e3?G.int(Math.round(t)):e>=1?t.toFixed(2).replace(/\.?0+$/,""):t.toPrecision(2)}