@webarkit/jsartoolkit-nft
Version:
Emscripten port of ARToolKit5 to JavaScript. It is a lighter version of Jsartoolkit5 with only NFT markerless support
1 lines • 764 kB
JavaScript
var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";var ENVIRONMENT_IS_PTHREAD=ENVIRONMENT_IS_WORKER&&self.name?.startsWith("em-pthread");if(ENVIRONMENT_IS_NODE){var worker_threads=require("worker_threads");global.Worker=worker_threads.Worker;ENVIRONMENT_IS_WORKER=!worker_threads.isMainThread;ENVIRONMENT_IS_PTHREAD=ENVIRONMENT_IS_WORKER&&worker_threads["workerData"]=="em-pthread"}(function(){"use strict";let scope;if(typeof window!=="undefined"){scope=window}else if(typeof global!=="undefined"){scope=global}else{scope=self}const ARControllerNFT=function(width,height,cameraPara,internalLuma){this.id=undefined;const w=width,h=height;this.listeners={};this.width=w;this.height=h;this.nftMarkerCount=0;this.nftMarkers={};this.transform_mat=new Float32Array(16);this.transformGL_RH=new Float64Array(16);this.videoWidth=w;this.videoHeight=h;this.videoSize=this.videoWidth*this.videoHeight;this.framepointer=null;this.framesize=null;this.dataHeap=null;this.videoLuma=null;this.videoLumaInternal=internalLuma;this.camera_mat=null;this.videoLumaPointer=null;this._bwpointer=undefined;this._lumaCtx=undefined;this.version="1.7.4";console.info("JsartoolkitNFT ",this.version);console.warn("This library is deprecated, use the ES6 version instead!! It will be removed in a future release.");if(typeof cameraPara==="string"){this.cameraParam=new ARCameraParamNFT(cameraPara,function(){this._initialize()}.bind(this),function(err){console.error("ARControllerNFT: Failed to load ARCameraParamNFT",err);this.onload(err)}.bind(this))}else{this.cameraParam=cameraPara;this._initialize()}};ARControllerNFT.prototype.dispose=function(){if(this.id>-1){artoolkitNFT.teardown(this.id)}for(const t in this){this[t]=null}};ARControllerNFT.prototype.process=function(image){this._copyImageToHeap(image);let k,o;for(k in this.nftMarkers){o=this.nftMarkers[k];o.inPrevious=o.inCurrent;o.inCurrent=false}const nftMarkerCount=this.nftMarkerCount;this.detectNFTMarker();const MARKER_LOST_TIME=200;for(let i=0;i<nftMarkerCount;i++){const nftMarkerInfo=this.getNFTMarker(i);const markerType=artoolkitNFT.NFT_MARKER;if(nftMarkerInfo.found){self.markerFound=i;self.markerFoundTime=Date.now();const visible=this.trackNFTMarkerId(i);visible.matrix.set(nftMarkerInfo.pose);visible.inCurrent=true;this.transMatToGLMat(visible.matrix,this.transform_mat);this.transformGL_RH=this.arglCameraViewRHf(this.transform_mat);this.dispatchEvent({name:"getNFTMarker",target:this,data:{index:i,type:markerType,marker:nftMarkerInfo,matrix:this.transform_mat,matrixGL_RH:this.transformGL_RH}})}else if(self.markerFound===i){if(Date.now()-self.markerFoundTime<=MARKER_LOST_TIME){return}delete self.markerFound;this.dispatchEvent({name:"lostNFTMarker",target:this,data:{index:i,type:markerType,marker:nftMarkerInfo,matrix:this.transform_mat,matrixGL_RH:this.transformGL_RH}})}}};ARControllerNFT.prototype.detectNFTMarker=function(){artoolkitNFT.detectNFTMarker(this.id)};ARControllerNFT.prototype.trackNFTMarkerId=function(id,markerWidth){let obj=this.nftMarkers[id];if(!obj){this.nftMarkers[id]=obj={inPrevious:false,inCurrent:false,matrix:new Float64Array(12),matrixGL_RH:new Float64Array(12),markerWidth:markerWidth||this.defaultMarkerWidth}}if(markerWidth){obj.markerWidth=markerWidth}return obj};ARControllerNFT.prototype.addEventListener=function(name,callback){if(!this.listeners[name]){this.listeners[name]=[]}this.listeners[name].push(callback)};ARControllerNFT.prototype.removeEventListener=function(name,callback){if(this.listeners[name]){var index=this.listeners[name].indexOf(callback);if(index>-1){this.listeners[name].splice(index,1)}}};ARControllerNFT.prototype.dispatchEvent=function(event){const listeners=this.listeners[event.name];if(listeners){for(let i=0;i<listeners.length;i++){listeners[i].call(this,event)}}};ARControllerNFT.prototype.debugSetup=function(){this.setDebugMode(true);this._bwpointer=this.getProcessingImage()};ARControllerNFT.prototype.loadNFTMarkers=function(markerURLs,onSuccess,onError){const self=this;artoolkitNFT.addNFTMarkers(this.id,markerURLs,function(ids){self.nftMarkerCount+=ids.length;onSuccess(ids)},onError)};ARControllerNFT.prototype.loadNFTMarker=function(markerURL,onSuccess,onError){if(markerURL){this.loadNFTMarkers([markerURL],function(ids){onSuccess(ids[0])},onError)}else{if(onError){onError("Marker URL needs to be defined and not equal empty string!")}else{console.error("Marker URL needs to be defined and not equal empty string!")}}};ARControllerNFT.prototype.transMatToGLMat=function(transMat,glMat,scale){if(glMat==undefined){glMat=new Float64Array(16)}glMat[0+0*4]=transMat[0];glMat[0+1*4]=transMat[1];glMat[0+2*4]=transMat[2];glMat[0+3*4]=transMat[3];glMat[1+0*4]=transMat[4];glMat[1+1*4]=transMat[5];glMat[1+2*4]=transMat[6];glMat[1+3*4]=transMat[7];glMat[2+0*4]=transMat[8];glMat[2+1*4]=transMat[9];glMat[2+2*4]=transMat[10];glMat[2+3*4]=transMat[11];glMat[3+0*4]=0;glMat[3+1*4]=0;glMat[3+2*4]=0;glMat[3+3*4]=1;if(scale!=undefined&&scale!==0){glMat[12]*=scale;glMat[13]*=scale;glMat[14]*=scale}return glMat};ARControllerNFT.prototype.arglCameraViewRHf=function(glMatrix,glRhMatrix,scale){let m_modelview;if(glRhMatrix==undefined)m_modelview=new Float64Array(16);else m_modelview=glRhMatrix;m_modelview[0]=glMatrix[0];m_modelview[4]=glMatrix[4];m_modelview[8]=glMatrix[8];m_modelview[12]=glMatrix[12];m_modelview[1]=-glMatrix[1];m_modelview[5]=-glMatrix[5];m_modelview[9]=-glMatrix[9];m_modelview[13]=-glMatrix[13];m_modelview[2]=-glMatrix[2];m_modelview[6]=-glMatrix[6];m_modelview[10]=-glMatrix[10];m_modelview[14]=-glMatrix[14];m_modelview[3]=0;m_modelview[7]=0;m_modelview[11]=0;m_modelview[15]=1;if(scale!=undefined&&scale!==0){m_modelview[12]*=scale;m_modelview[13]*=scale;m_modelview[14]*=scale}glRhMatrix=m_modelview;return glRhMatrix};ARControllerNFT.prototype.getNFTMarker=function(markerIndex){return artoolkitNFT.getNFTMarker(this.id,markerIndex)};ARControllerNFT.prototype.getNFTData=function(index){return artoolkitNFT.getNFTData(this.id,index)};ARControllerNFT.prototype.getTransformationMatrix=function(){return this.transform_mat};ARControllerNFT.prototype.getCameraMatrix=function(){return this.camera_mat};ARControllerNFT.prototype.setDebugMode=function(mode){return artoolkitNFT.setDebugMode(this.id,mode)};ARControllerNFT.prototype.getDebugMode=function(){return artoolkitNFT.getDebugMode(this.id)};ARControllerNFT.prototype.getProcessingImage=function(){return artoolkitNFT.getProcessingImage(this.id)};ARControllerNFT.prototype.setLogLevel=function(mode){return artoolkitNFT.setLogLevel(mode)};ARControllerNFT.prototype.getLogLevel=function(){return artoolkitNFT.getLogLevel()};ARControllerNFT.prototype.setProjectionNearPlane=function(value){return artoolkitNFT.setProjectionNearPlane(this.id,value)};ARControllerNFT.prototype.getProjectionNearPlane=function(){return artoolkitNFT.getProjectionNearPlane(this.id)};ARControllerNFT.prototype.setProjectionFarPlane=function(value){return artoolkitNFT.setProjectionFarPlane(this.id,value)};ARControllerNFT.prototype.getProjectionFarPlane=function(){return artoolkitNFT.getProjectionFarPlane(this.id)};ARControllerNFT.prototype.setThresholdMode=function(mode){return artoolkitNFT.setThresholdMode(this.id,mode)};ARControllerNFT.prototype.getThresholdMode=function(){return artoolkitNFT.getThresholdMode(this.id)};ARControllerNFT.prototype.setThreshold=function(threshold){return artoolkitNFT.setThreshold(this.id,threshold)};ARControllerNFT.prototype.getThreshold=function(){return artoolkitNFT.getThreshold(this.id)};ARControllerNFT.prototype.setImageProcMode=function(mode){return artoolkitNFT.setImageProcMode(this.id,mode)};ARControllerNFT.prototype.getImageProcMode=function(){return artoolkitNFT.getImageProcMode(this.id)};ARControllerNFT.prototype._initialize=function(){this.id=artoolkitNFT.setup(this.width,this.height,this.cameraParam.id);this._initNFT();this.framesize=this.width*this.height;this.videoLuma=new Uint8Array(this.framesize);this.camera_mat=artoolkitNFT.getCameraLens(this.id);this.setProjectionNearPlane(.1);this.setProjectionFarPlane(1e3);setTimeout(function(){if(this.onload){this.onload()}this.dispatchEvent({name:"load",target:this})}.bind(this),1)};ARControllerNFT.prototype._initNFT=function(){artoolkitNFT.setupAR2(this.id)};ARControllerNFT.prototype._copyImageToHeap=function(image){if(!image){console.error("Error: no provided imageData to ARControllerNFT");return}if(image.data){var imageData=image}const data=imageData.data;if(this.videoLuma&&!this.videoLumaInternal){let q=0;for(let p=0;p<this.videoSize;p++){const r=data[q],g=data[q+1],b=data[q+2];this.videoLuma[p]=r+r+r+b+g+g+g+g>>3;q+=4}}if(this.videoLuma){artoolkitNFT.passVideoData(this.id,data,this.videoLuma,this.videoLumaInternal);return true}return false};const ARCameraParamNFT=function(src,onload,onerror){this.id=-1;this._src="";this.complete=false;if(!onload){this.onload=function(){console.log("Successfully loaded")};console.warn("onload callback should be defined")}else{this.onload=onload}if(!onerror){this.onerror=function(err){console.error("Error: "+err)};console.warn("onerror callback should be defined")}else{this.onerror=onerror}if(src){this.load(src)}else{console.warn("No camera parameter file defined! It should be defined in constructor or in ARCameraParamNFT.load(url)")}};ARCameraParamNFT.prototype.load=function(src){if(this._src!==""){throw"ARCameraParamNFT: Trying to load camera parameters twice."}this._src=src;if(src){artoolkitNFT.loadCamera(src,function(id){this.id=id;this.complete=true;this.onload()}.bind(this),function(err){this.onerror(err)}.bind(this))}};Object.defineProperty(ARCameraParamNFT.prototype,"src",{set:function(src){this.load(src)},get:function(){return this._src}});ARCameraParamNFT.prototype.dispose=function(){if(this.id!==-1){artoolkitNFT.deleteCamera(this.id)}this.id=-1;this._src="";this.complete=false};const artoolkitNFT={UNKNOWN_MARKER:-1,NFT_MARKER:0,loadCamera,addNFTMarker,addNFTMarkers};const FUNCTIONS=["setup","teardown","setupAR2","setLogLevel","getLogLevel","setDebugMode","getDebugMode","getProcessingImage","detectNFTMarker","getNFTMarker","getNFTData","setProjectionNearPlane","getProjectionNearPlane","setProjectionFarPlane","getProjectionFarPlane","setThresholdMode","getThresholdMode","setThreshold","getThreshold","setImageProcMode","getImageProcMode","getCameraLens","passVideoData"];function runWhenLoaded(){FUNCTIONS.forEach(function(n){artoolkitNFT[n]=Module[n]});for(const m in Module){if(m.match(/^AR/))artoolkitNFT[m]=Module[m]}}let marker_count=0;function addNFTMarker(arId,url,callback,onError){const mId=marker_count++;const prefix="/markerNFT_"+mId;const filename1=prefix+".fset";const filename2=prefix+".iset";const filename3=prefix+".fset3";ajax(url+".fset",filename1,function(){ajax(url+".iset",filename2,function(){ajax(url+".fset3",filename3,function(){var nftMarker=Module._addNFTMarker(arId,prefix);if(callback)callback(nftMarker)},function(errorNumber){if(onError)onError(errorNumber)})},function(errorNumber){if(onError)onError(errorNumber)})},function(errorNumber){if(onError)onError(errorNumber)})}function addNFTMarkers(arId,urls,callback,onerror){const prefixes=[];let pending=urls.length*3;const onSuccess=filename=>{pending-=1;if(pending===0){const vec=new Module.StringList;const markerIds=[];for(let i=0;i<prefixes.length;i++){vec.push_back(prefixes[i])}const ret=Module._addNFTMarkers(arId,vec);for(let i=0;i<ret.size();i++){markerIds.push(ret.get(i))}console.log("add nft marker ids: ",markerIds);if(callback)callback(markerIds)}};const onError=(filename,errorNumber)=>{console.log("failed to load: ",filename);onerror(errorNumber)};const loadZFT=prefix=>{const marker_num=prefix.substring(11);const prefixTemp="/tempMarkerNFT_"+marker_num;const response=Module._decompressZFT(prefix,prefixTemp);let contentIsetUint8=FS.readFile(prefixTemp+".iset");let contentFsetUint8=FS.readFile(prefixTemp+".fset");let contentFset3Uint8=FS.readFile(prefixTemp+".fset3");FS.unlink(prefixTemp+".iset");FS.unlink(prefixTemp+".fset");FS.unlink(prefixTemp+".fset3");let hexStrIset=Uint8ArrayToStr(contentIsetUint8);let hexStrFset=Uint8ArrayToStr(contentFsetUint8);let hexStrFset3=Uint8ArrayToStr(contentFset3Uint8);let contentIset=new Uint8Array(hexStrIset.match(/.{1,2}/g).map(byte=>parseInt(byte,16)));let contentFset=new Uint8Array(hexStrFset.match(/.{1,2}/g).map(byte=>parseInt(byte,16)));let contentFset3=new Uint8Array(hexStrFset3.match(/.{1,2}/g).map(byte=>parseInt(byte,16)));writeByteArrayToFS(prefix+".fset",contentFset,function(){});writeByteArrayToFS(prefix+".iset",contentIset,function(){});writeByteArrayToFS(prefix+".fset3",contentFset3,function(){})};const onSuccessZFT=function(){loadZFT(arguments[1]);onSuccess()};for(let i=0;i<urls.length;i++){const url=urls[i];const prefix="/markerNFT_"+marker_count;prefixes.push(prefix);const filename1=prefix+".fset";const filename2=prefix+".iset";const filename3=prefix+".fset3";const filename4=prefix+".zft";let type=checkZFT(url+".zft");if(type){pending-=2;ajax(url+".zft",filename4,onSuccessZFT,onError.bind(filename4),prefix)}else{ajax(url+".fset",filename1,onSuccess.bind(filename1),onError.bind(filename1),prefix);ajax(url+".iset",filename2,onSuccess.bind(filename2),onError.bind(filename2),prefix);ajax(url+".fset3",filename3,onSuccess.bind(filename3),onError.bind(filename3),prefix)}marker_count+=1}}function checkZFT(url){let isZFT=null;let request=new XMLHttpRequest;request.open("GET",url,false);request.send(null);if(request.status===200){isZFT=true}else if(request.status===404){isZFT=false}return isZFT}function Uint8ArrayToStr(array){let out,i,len,c;let char2,char3;out="";len=array.length;i=0;while(i<len){c=array[i++];switch(c>>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out+=String.fromCharCode(c);break;case 12:case 13:char2=array[i++];out+=String.fromCharCode((c&31)<<6|char2&63);break;case 14:char2=array[i++];char3=array[i++];out+=String.fromCharCode((c&15)<<12|(char2&63)<<6|(char3&63)<<0);break}}return out}let camera_count=0;function loadCamera(url,callback,errorCallback){const filename="/camera_param_"+camera_count++;const writeCallback=function(errorCode){const id=Module._loadCamera(filename);if(!Module._loadCamera){if(callback)callback(id);setTimeout(writeCallback,10)}else{if(callback)callback(id)}};if(typeof url==="object"){writeByteArrayToFS(filename,url,writeCallback)}else if(url.indexOf("\n")>-1){writeStringToFS(filename,url,writeCallback)}else{ajax(url,filename,writeCallback,errorCallback)}}function writeStringToFS(target,string,callback){const byteArray=new Uint8Array(string.length);for(let i=0;i<byteArray.length;i++){byteArray[i]=string.charCodeAt(i)&255}writeByteArrayToFS(target,byteArray,callback)}function writeByteArrayToFS(target,byteArray,callback,prefix){FS.writeFile(target,byteArray,{encoding:"binary"});callback(byteArray,prefix)}function ajax(url,target,callback,errorCallback,prefix){const oReq=new XMLHttpRequest;oReq.open("GET",url,true);oReq.responseType="arraybuffer";oReq.onload=function(){if(this.status==200){const arrayBuffer=oReq.response;const byteArray=new Uint8Array(arrayBuffer);writeByteArrayToFS(target,byteArray,callback,prefix)}else{errorCallback(this.status)}};oReq.send()}scope.artoolkitNFT=artoolkitNFT;scope.ARControllerNFT=ARControllerNFT;scope.ARCameraParamNFT=ARCameraParamNFT;if(scope.Module){scope.Module.onRuntimeInitialized=function(){runWhenLoaded();const event=new Event("artoolkitNFT-loaded");scope.dispatchEvent(event)}}else{scope.Module={onRuntimeInitialized:function(){runWhenLoaded()}}}})();var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=typeof document!="undefined"?document.currentScript?.src:undefined;if(ENVIRONMENT_IS_NODE){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);var ret=fs.readFileSync(filename);return ret};readAsync=(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return new Promise((resolve,reject)=>{fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)reject(err);else resolve(binary?data.buffer:data)})})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}if(!ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var defaultPrint=console.log.bind(console);var defaultPrintErr=console.error.bind(console);if(ENVIRONMENT_IS_NODE){defaultPrint=(...args)=>fs.writeSync(1,args.join(" ")+"\n");defaultPrintErr=(...args)=>fs.writeSync(2,args.join(" ")+"\n")}var out=Module["print"]||defaultPrint;var err=Module["printErr"]||defaultPrintErr;Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];function intArrayFromBase64(s){if(typeof ENVIRONMENT_IS_NODE!="undefined"&&ENVIRONMENT_IS_NODE){var buf=Buffer.from(s,"base64");return new Uint8Array(buf.buffer,buf.byteOffset,buf.length)}var decoded=atob(s);var bytes=new Uint8Array(decoded.length);for(var i=0;i<decoded.length;++i){bytes[i]=decoded.charCodeAt(i)}return bytes}function tryParseAsDataURI(filename){if(!isDataURI(filename)){return}return intArrayFromBase64(filename.slice(dataURIPrefix.length))}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}if(ENVIRONMENT_IS_PTHREAD){var wasmPromiseResolve;var wasmPromiseReject;if(ENVIRONMENT_IS_NODE){var parentPort=worker_threads["parentPort"];parentPort.on("message",data=>onmessage({data}));Object.assign(globalThis,{self:global,importScripts:()=>{},postMessage:msg=>parentPort.postMessage(msg)})}var initializedJS=false;function threadPrintErr(...args){var text=args.join(" ");if(ENVIRONMENT_IS_NODE){fs.writeSync(2,text+"\n");return}console.error(text)}if(!Module["printErr"])err=threadPrintErr;function threadAlert(...args){var text=args.join(" ");postMessage({cmd:"alert",text,threadId:_pthread_self()})}self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>new Promise((resolve,reject)=>{wasmPromiseResolve=module=>{var instance=new WebAssembly.Instance(module,getWasmImports());receiveInstance(instance);resolve()};wasmPromiseReject=reject});self.onunhandledrejection=e=>{throw e.reason||e};function handleMessage(e){try{var msgData=e["data"];var cmd=msgData.cmd;if(cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);self.startWorker=instance=>{postMessage({cmd:"loaded"});for(let msg of messageQueue){handleMessage(msg)}self.onmessage=handleMessage};for(const handler of msgData.handlers){if(!Module[handler]||Module[handler].proxy){Module[handler]=(...args)=>{postMessage({cmd:"callHandler",handler,args})};if(handler=="print")out=Module[handler];if(handler=="printErr")err=Module[handler]}}wasmMemory=msgData.wasmMemory;updateMemoryViews();wasmPromiseResolve(msgData.wasmModule)}else if(cmd==="run"){establishStackSpace(msgData.pthread_ptr);__emscripten_thread_init(msgData.pthread_ptr,0,0,1,0,0);PThread.receiveObjectTransfer(msgData);PThread.threadInitTLS();__emscripten_thread_mailbox_await(msgData.pthread_ptr);if(!initializedJS){__embind_initialize_bindings();initializedJS=true}try{invokeEntryPoint(msgData.start_routine,msgData.arg)}catch(ex){if(ex!="unwind"){throw ex}}}else if(msgData.target==="setimmediate"){}else if(cmd==="checkMailbox"){if(initializedJS){checkMailbox()}}else if(cmd){err(`worker: received unknown command ${cmd}`);err(msgData)}}catch(ex){__emscripten_thread_crashed();throw ex}}self.onmessage=handleMessage}if(!ENVIRONMENT_IS_PTHREAD){if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||134217728;wasmMemory=new WebAssembly.Memory({initial:INITIAL_MEMORY/65536,maximum:INITIAL_MEMORY/65536,shared:true})}updateMemoryViews()}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){var preRuns=Module["preRun"];if(preRuns){if(typeof preRuns=="function")preRuns=[preRuns];preRuns.forEach(addOnPreRun)}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;var postRuns=Module["postRun"];if(postRuns){if(typeof postRuns=="function")postRuns=[postRuns];postRuns.forEach(addOnPostRun)}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="data:application/octet-stream;base64,AGFzbQEAAAABoAVVYAF/AGABfwF/YAJ/fwBgAn9/AX9gA39/fwF/YAN/f38AYAV/f39/fwBgBH9/f38AYAR/f39/AX9gBn9/f39/fwF/YAV/f39/fwF/YAAAYAZ/f39/f38AYAd/f39/f39/AGAIf39/f39/f38Bf2AAAX9gB39/f39/f38Bf2AFf35+fn4AYAF9AX1gA39+fwF+YAJ/fABgBX9/f39+AX9gCn9/f39/f39/f38AYAh/f39/f39/fwBgA39/fwF9YAp/f39/f39/f39/AX9gAX8BfGAFf39/f38BfGAEf35+fwBgBn9/f39+fgF/YAd/f39/f35+AX9gAAF8YAN/f3wAYAN/f38BfGABfwF9YAF8AX1gA39/fQBgAnx/AXxgBX99fX9/AX9gBn9/fX1/fwF/YAx/f39/f39/f39/f38Bf2ADf39/AX5gBH9/f38BfmAFf39+f38AYAZ/fH9/f38Bf2ABfwF+YAZ/f39/fn8Bf2APf39/f39/f39/f39/f39/AGALf39/f39/f39/f38Bf2AFf39/f3wBf2ANf39/f39/f39/f39/fwBgA399fQF9YAV/fX1/fwF9YAJ/fgBgAn19AX1gBH5+fn4Bf2AEf39/fQBgAn5/AX9gAX0Bf2ADf398AX9gA3x8fwF8YAJ8fAF8YAd/f39/f399AX1gB39/f39/f38BfWADf399AX1gA39+fwBgAn5+AXxgBH9/f34BfmACfn4BfWADfn5+AX9gA39/fgBgAn9/AX5gBH9+fn4AYAV/f319fwF/YAJ/fQF9YAJ9fwF/YAJ8fwF/YAJ/fwF9YAN/f30Bf2AFf39/fX0AYAZ/fHx/f38AYAZ/f39/f30AYAR/f35+AGACf38BfGAJf39/f39/f39/AX8CzgNJAWEBYgAFAWEBYwAAAWEBZAAWAWEBZQAXAWEBZgAGAWEBZwAFAWEBaAADAWEBaQAfAWEBagACAWEBawAGAWEBbAAFAWEBbQAEAWEBbgAbAWEBbwAMAWEBcAACAWEBcQAyAWEBcgAFAWEBcwAEAWEBdAABAWEBdQAIAWEBdgAEAWEBdwAfAWEBeAACAWEBeQAFAWEBegADAWEBQQAgAWEBQgAIAWEBQwAEAWEBRAAFAWEBRQAKAWEBRgAFAWEBRwANAWEBSAALAWEBSQABAWEBSgACAWEB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gMD//wBUIAtCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhCgwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEKIAMhAQwCCyABIAtCgICAgICAwP//AIWEUARAIAIgA4RQBEBCgICAgICA4P//ACEKQgAhAQwDCyAKQoCAgICAgMD//wCEIQpCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEAgASALhEIAIQFQBEBCgICAgICA4P//ACEKDAMLIApCgICAgICAwP//AIQhCgwCCyABIAuEUARAQgAhAQwCCyACIAOEUARAQgAhAQwCCyALQv///////z9YBEAgBUHQAGogASANIAEgDSANUCIGG3kgBkEGdK18pyIGQQ9rEI8BQRAgBmshBiAFKQNYIg1CIIghDiAFKQNQIQELIAJC////////P1YNACAFQUBrIAMgDCADIAwgDFAiCBt5IAhBBnStfKciCEEPaxCPASAGIAhrQRBqIQYgBSkDSCEMIAUpA0AhAwsgA0IPhiILQoCA/v8PgyICIAFCIIgiBH4iECALQiCIIhMgAUL/////D4MiAX58Ig9CIIYiESABIAJ+fCILIBFUrSACIA1C/////w+DIg1+IhUgBCATfnwiESAMQg+GIhIgA0IxiIRC/////w+DIgMgAX58IhQgDyAQVK1CIIYgD0IgiIR8Ig8gAiAOQoCABIQiDH4iFiANIBN+fCIOIBJCIIhCgICAgAiEIgIgAX58IhAgAyAEfnwiEkIghnwiF3whASAHIAlqIAZqQf//AGshBgJAIAIgBH4iGCAMIBN+fCIEIBhUrSAEIAQgAyANfnwiBFatfCACIAx+fCAEIAQgESAVVK0gESAUVq18fCIEVq18IAMgDH4iAyACIA1+fCICIANUrUIghiACQiCIhHwgBCACQiCGfCICIARUrXwgAiACIBAgElatIA4gFlStIA4gEFatfHxCIIYgEkIgiIR8IgJWrXwgAiACIA8gFFStIA8gF1atfHwiAlatfCIEQoCAgICAgMAAg1BFBEAgBkEBaiEGDAELIAtCP4ggBEIBhiACQj+IhCEEIAJCAYYgAUI/iIQhAiALQgGGIQsgAUIBhoQhAQsgBkH//wFOBEAgCkKAgICAgIDA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