web-ifc-api.js 182 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793
  1. var __commonJS = (callback, module) => () => {
  2. if (!module) {
  3. module = {exports: {}};
  4. callback(module.exports, module);
  5. }
  6. return module.exports;
  7. };
  8. // dist/web-ifc.js
  9. var require_web_ifc = __commonJS((exports, module) => {
  10. var WebIFCWasm2 = function() {
  11. var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0;
  12. if (typeof __filename !== "undefined")
  13. _scriptDir = _scriptDir || __filename;
  14. return function(WebIFCWasm3) {
  15. WebIFCWasm3 = WebIFCWasm3 || {};
  16. var Module = typeof WebIFCWasm3 !== "undefined" ? WebIFCWasm3 : {};
  17. var readyPromiseResolve, readyPromiseReject;
  18. Module["ready"] = new Promise(function(resolve, reject) {
  19. readyPromiseResolve = resolve;
  20. readyPromiseReject = reject;
  21. });
  22. var moduleOverrides = {};
  23. var key;
  24. for (key in Module) {
  25. if (Module.hasOwnProperty(key)) {
  26. moduleOverrides[key] = Module[key];
  27. }
  28. }
  29. var arguments_ = [];
  30. var thisProgram = "./this.program";
  31. var quit_ = function(status, toThrow) {
  32. throw toThrow;
  33. };
  34. var ENVIRONMENT_IS_WEB = false;
  35. var ENVIRONMENT_IS_WORKER = false;
  36. var ENVIRONMENT_IS_NODE = false;
  37. var ENVIRONMENT_IS_SHELL = false;
  38. ENVIRONMENT_IS_WEB = typeof window === "object";
  39. ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
  40. ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string";
  41. ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;
  42. var scriptDirectory = "";
  43. function locateFile(path) {
  44. if (Module["locateFile"]) {
  45. return Module["locateFile"](path, scriptDirectory);
  46. }
  47. return scriptDirectory + path;
  48. }
  49. var read_, readAsync, readBinary, setWindowTitle;
  50. var nodeFS;
  51. var nodePath;
  52. if (ENVIRONMENT_IS_NODE) {
  53. if (ENVIRONMENT_IS_WORKER) {
  54. scriptDirectory = require("path").dirname(scriptDirectory) + "/";
  55. } else {
  56. scriptDirectory = __dirname + "/";
  57. }
  58. read_ = function shell_read(filename, binary) {
  59. if (!nodeFS)
  60. nodeFS = require("fs");
  61. if (!nodePath)
  62. nodePath = require("path");
  63. filename = nodePath["normalize"](filename);
  64. return nodeFS["readFileSync"](filename, binary ? null : "utf8");
  65. };
  66. readBinary = function readBinary2(filename) {
  67. var ret = read_(filename, true);
  68. if (!ret.buffer) {
  69. ret = new Uint8Array(ret);
  70. }
  71. assert(ret.buffer);
  72. return ret;
  73. };
  74. if (process["argv"].length > 1) {
  75. thisProgram = process["argv"][1].replace(/\\/g, "/");
  76. }
  77. arguments_ = process["argv"].slice(2);
  78. process["on"]("uncaughtException", function(ex) {
  79. if (!(ex instanceof ExitStatus)) {
  80. throw ex;
  81. }
  82. });
  83. process["on"]("unhandledRejection", abort);
  84. quit_ = function(status) {
  85. process["exit"](status);
  86. };
  87. Module["inspect"] = function() {
  88. return "[Emscripten Module object]";
  89. };
  90. } else if (ENVIRONMENT_IS_SHELL) {
  91. if (typeof read != "undefined") {
  92. read_ = function shell_read(f) {
  93. return read(f);
  94. };
  95. }
  96. readBinary = function readBinary2(f) {
  97. var data;
  98. if (typeof readbuffer === "function") {
  99. return new Uint8Array(readbuffer(f));
  100. }
  101. data = read(f, "binary");
  102. assert(typeof data === "object");
  103. return data;
  104. };
  105. if (typeof scriptArgs != "undefined") {
  106. arguments_ = scriptArgs;
  107. } else if (typeof arguments != "undefined") {
  108. arguments_ = arguments;
  109. }
  110. if (typeof quit === "function") {
  111. quit_ = function(status) {
  112. quit(status);
  113. };
  114. }
  115. if (typeof print !== "undefined") {
  116. if (typeof console === "undefined")
  117. console = {};
  118. console.log = print;
  119. console.warn = console.error = typeof printErr !== "undefined" ? printErr : print;
  120. }
  121. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  122. if (ENVIRONMENT_IS_WORKER) {
  123. scriptDirectory = self.location.href;
  124. } else if (typeof document !== "undefined" && document.currentScript) {
  125. scriptDirectory = document.currentScript.src;
  126. }
  127. if (_scriptDir) {
  128. scriptDirectory = _scriptDir;
  129. }
  130. if (scriptDirectory.indexOf("blob:") !== 0) {
  131. scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1);
  132. } else {
  133. scriptDirectory = "";
  134. }
  135. {
  136. read_ = function shell_read(url) {
  137. var xhr = new XMLHttpRequest();
  138. xhr.open("GET", url, false);
  139. xhr.send(null);
  140. return xhr.responseText;
  141. };
  142. if (ENVIRONMENT_IS_WORKER) {
  143. readBinary = function readBinary2(url) {
  144. var xhr = new XMLHttpRequest();
  145. xhr.open("GET", url, false);
  146. xhr.responseType = "arraybuffer";
  147. xhr.send(null);
  148. return new Uint8Array(xhr.response);
  149. };
  150. }
  151. readAsync = function readAsync2(url, onload, onerror) {
  152. var xhr = new XMLHttpRequest();
  153. xhr.open("GET", url, true);
  154. xhr.responseType = "arraybuffer";
  155. xhr.onload = function xhr_onload() {
  156. if (xhr.status == 200 || xhr.status == 0 && xhr.response) {
  157. onload(xhr.response);
  158. return;
  159. }
  160. onerror();
  161. };
  162. xhr.onerror = onerror;
  163. xhr.send(null);
  164. };
  165. }
  166. setWindowTitle = function(title) {
  167. document.title = title;
  168. };
  169. } else {
  170. }
  171. var out = Module["print"] || console.log.bind(console);
  172. var err = Module["printErr"] || console.warn.bind(console);
  173. for (key in moduleOverrides) {
  174. if (moduleOverrides.hasOwnProperty(key)) {
  175. Module[key] = moduleOverrides[key];
  176. }
  177. }
  178. moduleOverrides = null;
  179. if (Module["arguments"])
  180. arguments_ = Module["arguments"];
  181. if (Module["thisProgram"])
  182. thisProgram = Module["thisProgram"];
  183. if (Module["quit"])
  184. quit_ = Module["quit"];
  185. var STACK_ALIGN = 16;
  186. function alignMemory(size, factor) {
  187. if (!factor)
  188. factor = STACK_ALIGN;
  189. return Math.ceil(size / factor) * factor;
  190. }
  191. var tempRet0 = 0;
  192. var setTempRet0 = function(value) {
  193. tempRet0 = value;
  194. };
  195. var wasmBinary;
  196. if (Module["wasmBinary"])
  197. wasmBinary = Module["wasmBinary"];
  198. var noExitRuntime;
  199. if (Module["noExitRuntime"])
  200. noExitRuntime = Module["noExitRuntime"];
  201. if (typeof WebAssembly !== "object") {
  202. abort("no native wasm support detected");
  203. }
  204. var wasmMemory;
  205. var ABORT = false;
  206. var EXITSTATUS = 0;
  207. function assert(condition, text) {
  208. if (!condition) {
  209. abort("Assertion failed: " + text);
  210. }
  211. }
  212. var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0;
  213. function UTF8ArrayToString(heap, idx, maxBytesToRead) {
  214. var endIdx = idx + maxBytesToRead;
  215. var endPtr = idx;
  216. while (heap[endPtr] && !(endPtr >= endIdx))
  217. ++endPtr;
  218. if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
  219. return UTF8Decoder.decode(heap.subarray(idx, endPtr));
  220. } else {
  221. var str = "";
  222. while (idx < endPtr) {
  223. var u0 = heap[idx++];
  224. if (!(u0 & 128)) {
  225. str += String.fromCharCode(u0);
  226. continue;
  227. }
  228. var u1 = heap[idx++] & 63;
  229. if ((u0 & 224) == 192) {
  230. str += String.fromCharCode((u0 & 31) << 6 | u1);
  231. continue;
  232. }
  233. var u2 = heap[idx++] & 63;
  234. if ((u0 & 240) == 224) {
  235. u0 = (u0 & 15) << 12 | u1 << 6 | u2;
  236. } else {
  237. u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63;
  238. }
  239. if (u0 < 65536) {
  240. str += String.fromCharCode(u0);
  241. } else {
  242. var ch = u0 - 65536;
  243. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
  244. }
  245. }
  246. }
  247. return str;
  248. }
  249. function UTF8ToString(ptr, maxBytesToRead) {
  250. return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "";
  251. }
  252. function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
  253. if (!(maxBytesToWrite > 0))
  254. return 0;
  255. var startIdx = outIdx;
  256. var endIdx = outIdx + maxBytesToWrite - 1;
  257. for (var i = 0; i < str.length; ++i) {
  258. var u = str.charCodeAt(i);
  259. if (u >= 55296 && u <= 57343) {
  260. var u1 = str.charCodeAt(++i);
  261. u = 65536 + ((u & 1023) << 10) | u1 & 1023;
  262. }
  263. if (u <= 127) {
  264. if (outIdx >= endIdx)
  265. break;
  266. heap[outIdx++] = u;
  267. } else if (u <= 2047) {
  268. if (outIdx + 1 >= endIdx)
  269. break;
  270. heap[outIdx++] = 192 | u >> 6;
  271. heap[outIdx++] = 128 | u & 63;
  272. } else if (u <= 65535) {
  273. if (outIdx + 2 >= endIdx)
  274. break;
  275. heap[outIdx++] = 224 | u >> 12;
  276. heap[outIdx++] = 128 | u >> 6 & 63;
  277. heap[outIdx++] = 128 | u & 63;
  278. } else {
  279. if (outIdx + 3 >= endIdx)
  280. break;
  281. heap[outIdx++] = 240 | u >> 18;
  282. heap[outIdx++] = 128 | u >> 12 & 63;
  283. heap[outIdx++] = 128 | u >> 6 & 63;
  284. heap[outIdx++] = 128 | u & 63;
  285. }
  286. }
  287. heap[outIdx] = 0;
  288. return outIdx - startIdx;
  289. }
  290. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  291. return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite);
  292. }
  293. function lengthBytesUTF8(str) {
  294. var len = 0;
  295. for (var i = 0; i < str.length; ++i) {
  296. var u = str.charCodeAt(i);
  297. if (u >= 55296 && u <= 57343)
  298. u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023;
  299. if (u <= 127)
  300. ++len;
  301. else if (u <= 2047)
  302. len += 2;
  303. else if (u <= 65535)
  304. len += 3;
  305. else
  306. len += 4;
  307. }
  308. return len;
  309. }
  310. var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : void 0;
  311. function UTF16ToString(ptr, maxBytesToRead) {
  312. var endPtr = ptr;
  313. var idx = endPtr >> 1;
  314. var maxIdx = idx + maxBytesToRead / 2;
  315. while (!(idx >= maxIdx) && HEAPU16[idx])
  316. ++idx;
  317. endPtr = idx << 1;
  318. if (endPtr - ptr > 32 && UTF16Decoder) {
  319. return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
  320. } else {
  321. var str = "";
  322. for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
  323. var codeUnit = HEAP16[ptr + i * 2 >> 1];
  324. if (codeUnit == 0)
  325. break;
  326. str += String.fromCharCode(codeUnit);
  327. }
  328. return str;
  329. }
  330. }
  331. function stringToUTF16(str, outPtr, maxBytesToWrite) {
  332. if (maxBytesToWrite === void 0) {
  333. maxBytesToWrite = 2147483647;
  334. }
  335. if (maxBytesToWrite < 2)
  336. return 0;
  337. maxBytesToWrite -= 2;
  338. var startPtr = outPtr;
  339. var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length;
  340. for (var i = 0; i < numCharsToWrite; ++i) {
  341. var codeUnit = str.charCodeAt(i);
  342. HEAP16[outPtr >> 1] = codeUnit;
  343. outPtr += 2;
  344. }
  345. HEAP16[outPtr >> 1] = 0;
  346. return outPtr - startPtr;
  347. }
  348. function lengthBytesUTF16(str) {
  349. return str.length * 2;
  350. }
  351. function UTF32ToString(ptr, maxBytesToRead) {
  352. var i = 0;
  353. var str = "";
  354. while (!(i >= maxBytesToRead / 4)) {
  355. var utf32 = HEAP32[ptr + i * 4 >> 2];
  356. if (utf32 == 0)
  357. break;
  358. ++i;
  359. if (utf32 >= 65536) {
  360. var ch = utf32 - 65536;
  361. str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);
  362. } else {
  363. str += String.fromCharCode(utf32);
  364. }
  365. }
  366. return str;
  367. }
  368. function stringToUTF32(str, outPtr, maxBytesToWrite) {
  369. if (maxBytesToWrite === void 0) {
  370. maxBytesToWrite = 2147483647;
  371. }
  372. if (maxBytesToWrite < 4)
  373. return 0;
  374. var startPtr = outPtr;
  375. var endPtr = startPtr + maxBytesToWrite - 4;
  376. for (var i = 0; i < str.length; ++i) {
  377. var codeUnit = str.charCodeAt(i);
  378. if (codeUnit >= 55296 && codeUnit <= 57343) {
  379. var trailSurrogate = str.charCodeAt(++i);
  380. codeUnit = 65536 + ((codeUnit & 1023) << 10) | trailSurrogate & 1023;
  381. }
  382. HEAP32[outPtr >> 2] = codeUnit;
  383. outPtr += 4;
  384. if (outPtr + 4 > endPtr)
  385. break;
  386. }
  387. HEAP32[outPtr >> 2] = 0;
  388. return outPtr - startPtr;
  389. }
  390. function lengthBytesUTF32(str) {
  391. var len = 0;
  392. for (var i = 0; i < str.length; ++i) {
  393. var codeUnit = str.charCodeAt(i);
  394. if (codeUnit >= 55296 && codeUnit <= 57343)
  395. ++i;
  396. len += 4;
  397. }
  398. return len;
  399. }
  400. function writeArrayToMemory(array, buffer2) {
  401. HEAP8.set(array, buffer2);
  402. }
  403. function writeAsciiToMemory(str, buffer2, dontAddNull) {
  404. for (var i = 0; i < str.length; ++i) {
  405. HEAP8[buffer2++ >> 0] = str.charCodeAt(i);
  406. }
  407. if (!dontAddNull)
  408. HEAP8[buffer2 >> 0] = 0;
  409. }
  410. function alignUp(x, multiple) {
  411. if (x % multiple > 0) {
  412. x += multiple - x % multiple;
  413. }
  414. return x;
  415. }
  416. var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;
  417. function updateGlobalBufferAndViews(buf) {
  418. buffer = buf;
  419. Module["HEAP8"] = HEAP8 = new Int8Array(buf);
  420. Module["HEAP16"] = HEAP16 = new Int16Array(buf);
  421. Module["HEAP32"] = HEAP32 = new Int32Array(buf);
  422. Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf);
  423. Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf);
  424. Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf);
  425. Module["HEAPF32"] = HEAPF32 = new Float32Array(buf);
  426. Module["HEAPF64"] = HEAPF64 = new Float64Array(buf);
  427. }
  428. var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216;
  429. if (Module["wasmMemory"]) {
  430. wasmMemory = Module["wasmMemory"];
  431. } else {
  432. wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536});
  433. }
  434. if (wasmMemory) {
  435. buffer = wasmMemory.buffer;
  436. }
  437. INITIAL_MEMORY = buffer.byteLength;
  438. updateGlobalBufferAndViews(buffer);
  439. var wasmTable;
  440. var __ATPRERUN__ = [];
  441. var __ATINIT__ = [];
  442. var __ATMAIN__ = [];
  443. var __ATPOSTRUN__ = [];
  444. var runtimeInitialized = false;
  445. var runtimeExited = false;
  446. function preRun() {
  447. if (Module["preRun"]) {
  448. if (typeof Module["preRun"] == "function")
  449. Module["preRun"] = [Module["preRun"]];
  450. while (Module["preRun"].length) {
  451. addOnPreRun(Module["preRun"].shift());
  452. }
  453. }
  454. callRuntimeCallbacks(__ATPRERUN__);
  455. }
  456. function initRuntime() {
  457. runtimeInitialized = true;
  458. if (!Module["noFSInit"] && !FS.init.initialized)
  459. FS.init();
  460. TTY.init();
  461. callRuntimeCallbacks(__ATINIT__);
  462. }
  463. function preMain() {
  464. FS.ignorePermissions = false;
  465. callRuntimeCallbacks(__ATMAIN__);
  466. }
  467. function exitRuntime() {
  468. runtimeExited = true;
  469. }
  470. function postRun() {
  471. if (Module["postRun"]) {
  472. if (typeof Module["postRun"] == "function")
  473. Module["postRun"] = [Module["postRun"]];
  474. while (Module["postRun"].length) {
  475. addOnPostRun(Module["postRun"].shift());
  476. }
  477. }
  478. callRuntimeCallbacks(__ATPOSTRUN__);
  479. }
  480. function addOnPreRun(cb) {
  481. __ATPRERUN__.unshift(cb);
  482. }
  483. function addOnPostRun(cb) {
  484. __ATPOSTRUN__.unshift(cb);
  485. }
  486. var runDependencies = 0;
  487. var runDependencyWatcher = null;
  488. var dependenciesFulfilled = null;
  489. function getUniqueRunDependency(id) {
  490. return id;
  491. }
  492. function addRunDependency(id) {
  493. runDependencies++;
  494. if (Module["monitorRunDependencies"]) {
  495. Module["monitorRunDependencies"](runDependencies);
  496. }
  497. }
  498. function removeRunDependency(id) {
  499. runDependencies--;
  500. if (Module["monitorRunDependencies"]) {
  501. Module["monitorRunDependencies"](runDependencies);
  502. }
  503. if (runDependencies == 0) {
  504. if (runDependencyWatcher !== null) {
  505. clearInterval(runDependencyWatcher);
  506. runDependencyWatcher = null;
  507. }
  508. if (dependenciesFulfilled) {
  509. var callback = dependenciesFulfilled;
  510. dependenciesFulfilled = null;
  511. callback();
  512. }
  513. }
  514. }
  515. Module["preloadedImages"] = {};
  516. Module["preloadedAudios"] = {};
  517. function abort(what) {
  518. if (Module["onAbort"]) {
  519. Module["onAbort"](what);
  520. }
  521. what += "";
  522. err(what);
  523. ABORT = true;
  524. EXITSTATUS = 1;
  525. what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info.";
  526. var e = new WebAssembly.RuntimeError(what);
  527. readyPromiseReject(e);
  528. throw e;
  529. }
  530. function hasPrefix(str, prefix) {
  531. return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0;
  532. }
  533. var dataURIPrefix = "data:application/octet-stream;base64,";
  534. function isDataURI(filename) {
  535. return hasPrefix(filename, dataURIPrefix);
  536. }
  537. var fileURIPrefix = "file://";
  538. function isFileURI(filename) {
  539. return hasPrefix(filename, fileURIPrefix);
  540. }
  541. var path = import.meta.url.substring(0, import.meta.url.lastIndexOf("/")+1);
  542. var wasmBinaryFile = path + "web-ifc.wasm";
  543. if (!isDataURI(wasmBinaryFile)) {
  544. wasmBinaryFile = locateFile(wasmBinaryFile);
  545. }
  546. function getBinary() {
  547. try {
  548. if (wasmBinary) {
  549. return new Uint8Array(wasmBinary);
  550. }
  551. if (readBinary) {
  552. return readBinary(wasmBinaryFile);
  553. } else {
  554. throw "both async and sync fetching of the wasm failed";
  555. }
  556. } catch (err2) {
  557. abort(err2);
  558. }
  559. }
  560. function getBinaryPromise() {
  561. if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === "function" && !isFileURI(wasmBinaryFile)) {
  562. return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) {
  563. if (!response["ok"]) {
  564. throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
  565. }
  566. return response["arrayBuffer"]();
  567. }).catch(function() {
  568. return getBinary();
  569. });
  570. }
  571. return Promise.resolve().then(getBinary);
  572. }
  573. function createWasm() {
  574. var info = {a: asmLibraryArg};
  575. function receiveInstance(instance, module2) {
  576. var exports3 = instance.exports;
  577. Module["asm"] = exports3;
  578. wasmTable = Module["asm"]["L"];
  579. removeRunDependency("wasm-instantiate");
  580. }
  581. addRunDependency("wasm-instantiate");
  582. function receiveInstantiatedSource(output) {
  583. receiveInstance(output["instance"]);
  584. }
  585. function instantiateArrayBuffer(receiver) {
  586. return getBinaryPromise().then(function(binary) {
  587. return WebAssembly.instantiate(binary, info);
  588. }).then(receiver, function(reason) {
  589. err("failed to asynchronously prepare wasm: " + reason);
  590. abort(reason);
  591. });
  592. }
  593. function instantiateAsync() {
  594. if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") {
  595. return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) {
  596. var result = WebAssembly.instantiateStreaming(response, info);
  597. return result.then(receiveInstantiatedSource, function(reason) {
  598. err("wasm streaming compile failed: " + reason);
  599. err("falling back to ArrayBuffer instantiation");
  600. return instantiateArrayBuffer(receiveInstantiatedSource);
  601. });
  602. });
  603. } else {
  604. return instantiateArrayBuffer(receiveInstantiatedSource);
  605. }
  606. }
  607. if (Module["instantiateWasm"]) {
  608. try {
  609. var exports2 = Module["instantiateWasm"](info, receiveInstance);
  610. return exports2;
  611. } catch (e) {
  612. err("Module.instantiateWasm callback failed with error: " + e);
  613. return false;
  614. }
  615. }
  616. instantiateAsync().catch(readyPromiseReject);
  617. return {};
  618. }
  619. var tempDouble;
  620. var tempI64;
  621. function callRuntimeCallbacks(callbacks) {
  622. while (callbacks.length > 0) {
  623. var callback = callbacks.shift();
  624. if (typeof callback == "function") {
  625. callback(Module);
  626. continue;
  627. }
  628. var func = callback.func;
  629. if (typeof func === "number") {
  630. if (callback.arg === void 0) {
  631. wasmTable.get(func)();
  632. } else {
  633. wasmTable.get(func)(callback.arg);
  634. }
  635. } else {
  636. func(callback.arg === void 0 ? null : callback.arg);
  637. }
  638. }
  639. }
  640. function dynCallLegacy(sig, ptr, args) {
  641. if (args && args.length) {
  642. return Module["dynCall_" + sig].apply(null, [ptr].concat(args));
  643. }
  644. return Module["dynCall_" + sig].call(null, ptr);
  645. }
  646. function dynCall(sig, ptr, args) {
  647. if (sig.indexOf("j") != -1) {
  648. return dynCallLegacy(sig, ptr, args);
  649. }
  650. return wasmTable.get(ptr).apply(null, args);
  651. }
  652. function ___assert_fail(condition, filename, line, func) {
  653. abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func ? UTF8ToString(func) : "unknown function"]);
  654. }
  655. var PATH = {splitPath: function(filename) {
  656. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
  657. return splitPathRe.exec(filename).slice(1);
  658. }, normalizeArray: function(parts, allowAboveRoot) {
  659. var up = 0;
  660. for (var i = parts.length - 1; i >= 0; i--) {
  661. var last = parts[i];
  662. if (last === ".") {
  663. parts.splice(i, 1);
  664. } else if (last === "..") {
  665. parts.splice(i, 1);
  666. up++;
  667. } else if (up) {
  668. parts.splice(i, 1);
  669. up--;
  670. }
  671. }
  672. if (allowAboveRoot) {
  673. for (; up; up--) {
  674. parts.unshift("..");
  675. }
  676. }
  677. return parts;
  678. }, normalize: function(path) {
  679. var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/";
  680. path = PATH.normalizeArray(path.split("/").filter(function(p) {
  681. return !!p;
  682. }), !isAbsolute).join("/");
  683. if (!path && !isAbsolute) {
  684. path = ".";
  685. }
  686. if (path && trailingSlash) {
  687. path += "/";
  688. }
  689. return (isAbsolute ? "/" : "") + path;
  690. }, dirname: function(path) {
  691. var result = PATH.splitPath(path), root = result[0], dir = result[1];
  692. if (!root && !dir) {
  693. return ".";
  694. }
  695. if (dir) {
  696. dir = dir.substr(0, dir.length - 1);
  697. }
  698. return root + dir;
  699. }, basename: function(path) {
  700. if (path === "/")
  701. return "/";
  702. path = PATH.normalize(path);
  703. path = path.replace(/\/$/, "");
  704. var lastSlash = path.lastIndexOf("/");
  705. if (lastSlash === -1)
  706. return path;
  707. return path.substr(lastSlash + 1);
  708. }, extname: function(path) {
  709. return PATH.splitPath(path)[3];
  710. }, join: function() {
  711. var paths = Array.prototype.slice.call(arguments, 0);
  712. return PATH.normalize(paths.join("/"));
  713. }, join2: function(l, r) {
  714. return PATH.normalize(l + "/" + r);
  715. }};
  716. function getRandomDevice() {
  717. if (typeof crypto === "object" && typeof crypto["getRandomValues"] === "function") {
  718. var randomBuffer = new Uint8Array(1);
  719. return function() {
  720. crypto.getRandomValues(randomBuffer);
  721. return randomBuffer[0];
  722. };
  723. } else if (ENVIRONMENT_IS_NODE) {
  724. try {
  725. var crypto_module = require("crypto");
  726. return function() {
  727. return crypto_module["randomBytes"](1)[0];
  728. };
  729. } catch (e) {
  730. }
  731. }
  732. return function() {
  733. abort("randomDevice");
  734. };
  735. }
  736. var PATH_FS = {resolve: function() {
  737. var resolvedPath = "", resolvedAbsolute = false;
  738. for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  739. var path = i >= 0 ? arguments[i] : FS.cwd();
  740. if (typeof path !== "string") {
  741. throw new TypeError("Arguments to path.resolve must be strings");
  742. } else if (!path) {
  743. return "";
  744. }
  745. resolvedPath = path + "/" + resolvedPath;
  746. resolvedAbsolute = path.charAt(0) === "/";
  747. }
  748. resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(function(p) {
  749. return !!p;
  750. }), !resolvedAbsolute).join("/");
  751. return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
  752. }, relative: function(from, to) {
  753. from = PATH_FS.resolve(from).substr(1);
  754. to = PATH_FS.resolve(to).substr(1);
  755. function trim(arr) {
  756. var start = 0;
  757. for (; start < arr.length; start++) {
  758. if (arr[start] !== "")
  759. break;
  760. }
  761. var end = arr.length - 1;
  762. for (; end >= 0; end--) {
  763. if (arr[end] !== "")
  764. break;
  765. }
  766. if (start > end)
  767. return [];
  768. return arr.slice(start, end - start + 1);
  769. }
  770. var fromParts = trim(from.split("/"));
  771. var toParts = trim(to.split("/"));
  772. var length = Math.min(fromParts.length, toParts.length);
  773. var samePartsLength = length;
  774. for (var i = 0; i < length; i++) {
  775. if (fromParts[i] !== toParts[i]) {
  776. samePartsLength = i;
  777. break;
  778. }
  779. }
  780. var outputParts = [];
  781. for (var i = samePartsLength; i < fromParts.length; i++) {
  782. outputParts.push("..");
  783. }
  784. outputParts = outputParts.concat(toParts.slice(samePartsLength));
  785. return outputParts.join("/");
  786. }};
  787. var TTY = {ttys: [], init: function() {
  788. }, shutdown: function() {
  789. }, register: function(dev, ops) {
  790. TTY.ttys[dev] = {input: [], output: [], ops};
  791. FS.registerDevice(dev, TTY.stream_ops);
  792. }, stream_ops: {open: function(stream) {
  793. var tty = TTY.ttys[stream.node.rdev];
  794. if (!tty) {
  795. throw new FS.ErrnoError(43);
  796. }
  797. stream.tty = tty;
  798. stream.seekable = false;
  799. }, close: function(stream) {
  800. stream.tty.ops.flush(stream.tty);
  801. }, flush: function(stream) {
  802. stream.tty.ops.flush(stream.tty);
  803. }, read: function(stream, buffer2, offset, length, pos) {
  804. if (!stream.tty || !stream.tty.ops.get_char) {
  805. throw new FS.ErrnoError(60);
  806. }
  807. var bytesRead = 0;
  808. for (var i = 0; i < length; i++) {
  809. var result;
  810. try {
  811. result = stream.tty.ops.get_char(stream.tty);
  812. } catch (e) {
  813. throw new FS.ErrnoError(29);
  814. }
  815. if (result === void 0 && bytesRead === 0) {
  816. throw new FS.ErrnoError(6);
  817. }
  818. if (result === null || result === void 0)
  819. break;
  820. bytesRead++;
  821. buffer2[offset + i] = result;
  822. }
  823. if (bytesRead) {
  824. stream.node.timestamp = Date.now();
  825. }
  826. return bytesRead;
  827. }, write: function(stream, buffer2, offset, length, pos) {
  828. if (!stream.tty || !stream.tty.ops.put_char) {
  829. throw new FS.ErrnoError(60);
  830. }
  831. try {
  832. for (var i = 0; i < length; i++) {
  833. stream.tty.ops.put_char(stream.tty, buffer2[offset + i]);
  834. }
  835. } catch (e) {
  836. throw new FS.ErrnoError(29);
  837. }
  838. if (length) {
  839. stream.node.timestamp = Date.now();
  840. }
  841. return i;
  842. }}, default_tty_ops: {get_char: function(tty) {
  843. if (!tty.input.length) {
  844. var result = null;
  845. if (ENVIRONMENT_IS_NODE) {
  846. var BUFSIZE = 256;
  847. var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE);
  848. var bytesRead = 0;
  849. try {
  850. bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null);
  851. } catch (e) {
  852. if (e.toString().indexOf("EOF") != -1)
  853. bytesRead = 0;
  854. else
  855. throw e;
  856. }
  857. if (bytesRead > 0) {
  858. result = buf.slice(0, bytesRead).toString("utf-8");
  859. } else {
  860. result = null;
  861. }
  862. } else if (typeof window != "undefined" && typeof window.prompt == "function") {
  863. result = window.prompt("Input: ");
  864. if (result !== null) {
  865. result += "\n";
  866. }
  867. } else if (typeof readline == "function") {
  868. result = readline();
  869. if (result !== null) {
  870. result += "\n";
  871. }
  872. }
  873. if (!result) {
  874. return null;
  875. }
  876. tty.input = intArrayFromString(result, true);
  877. }
  878. return tty.input.shift();
  879. }, put_char: function(tty, val) {
  880. if (val === null || val === 10) {
  881. out(UTF8ArrayToString(tty.output, 0));
  882. tty.output = [];
  883. } else {
  884. if (val != 0)
  885. tty.output.push(val);
  886. }
  887. }, flush: function(tty) {
  888. if (tty.output && tty.output.length > 0) {
  889. out(UTF8ArrayToString(tty.output, 0));
  890. tty.output = [];
  891. }
  892. }}, default_tty1_ops: {put_char: function(tty, val) {
  893. if (val === null || val === 10) {
  894. err(UTF8ArrayToString(tty.output, 0));
  895. tty.output = [];
  896. } else {
  897. if (val != 0)
  898. tty.output.push(val);
  899. }
  900. }, flush: function(tty) {
  901. if (tty.output && tty.output.length > 0) {
  902. err(UTF8ArrayToString(tty.output, 0));
  903. tty.output = [];
  904. }
  905. }}};
  906. function mmapAlloc(size) {
  907. var alignedSize = alignMemory(size, 16384);
  908. var ptr = _malloc(alignedSize);
  909. while (size < alignedSize)
  910. HEAP8[ptr + size++] = 0;
  911. return ptr;
  912. }
  913. var MEMFS = {ops_table: null, mount: function(mount) {
  914. return MEMFS.createNode(null, "/", 16384 | 511, 0);
  915. }, createNode: function(parent, name, mode, dev) {
  916. if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  917. throw new FS.ErrnoError(63);
  918. }
  919. if (!MEMFS.ops_table) {
  920. MEMFS.ops_table = {dir: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink}, stream: {llseek: MEMFS.stream_ops.llseek}}, file: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: {llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync}}, link: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink}, stream: {}}, chrdev: {node: {getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr}, stream: FS.chrdev_stream_ops}};
  921. }
  922. var node = FS.createNode(parent, name, mode, dev);
  923. if (FS.isDir(node.mode)) {
  924. node.node_ops = MEMFS.ops_table.dir.node;
  925. node.stream_ops = MEMFS.ops_table.dir.stream;
  926. node.contents = {};
  927. } else if (FS.isFile(node.mode)) {
  928. node.node_ops = MEMFS.ops_table.file.node;
  929. node.stream_ops = MEMFS.ops_table.file.stream;
  930. node.usedBytes = 0;
  931. node.contents = null;
  932. } else if (FS.isLink(node.mode)) {
  933. node.node_ops = MEMFS.ops_table.link.node;
  934. node.stream_ops = MEMFS.ops_table.link.stream;
  935. } else if (FS.isChrdev(node.mode)) {
  936. node.node_ops = MEMFS.ops_table.chrdev.node;
  937. node.stream_ops = MEMFS.ops_table.chrdev.stream;
  938. }
  939. node.timestamp = Date.now();
  940. if (parent) {
  941. parent.contents[name] = node;
  942. }
  943. return node;
  944. }, getFileDataAsRegularArray: function(node) {
  945. if (node.contents && node.contents.subarray) {
  946. var arr = [];
  947. for (var i = 0; i < node.usedBytes; ++i)
  948. arr.push(node.contents[i]);
  949. return arr;
  950. }
  951. return node.contents;
  952. }, getFileDataAsTypedArray: function(node) {
  953. if (!node.contents)
  954. return new Uint8Array(0);
  955. if (node.contents.subarray)
  956. return node.contents.subarray(0, node.usedBytes);
  957. return new Uint8Array(node.contents);
  958. }, expandFileStorage: function(node, newCapacity) {
  959. var prevCapacity = node.contents ? node.contents.length : 0;
  960. if (prevCapacity >= newCapacity)
  961. return;
  962. var CAPACITY_DOUBLING_MAX = 1024 * 1024;
  963. newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0);
  964. if (prevCapacity != 0)
  965. newCapacity = Math.max(newCapacity, 256);
  966. var oldContents = node.contents;
  967. node.contents = new Uint8Array(newCapacity);
  968. if (node.usedBytes > 0)
  969. node.contents.set(oldContents.subarray(0, node.usedBytes), 0);
  970. return;
  971. }, resizeFileStorage: function(node, newSize) {
  972. if (node.usedBytes == newSize)
  973. return;
  974. if (newSize == 0) {
  975. node.contents = null;
  976. node.usedBytes = 0;
  977. return;
  978. }
  979. if (!node.contents || node.contents.subarray) {
  980. var oldContents = node.contents;
  981. node.contents = new Uint8Array(newSize);
  982. if (oldContents) {
  983. node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes)));
  984. }
  985. node.usedBytes = newSize;
  986. return;
  987. }
  988. if (!node.contents)
  989. node.contents = [];
  990. if (node.contents.length > newSize)
  991. node.contents.length = newSize;
  992. else
  993. while (node.contents.length < newSize)
  994. node.contents.push(0);
  995. node.usedBytes = newSize;
  996. }, node_ops: {getattr: function(node) {
  997. var attr = {};
  998. attr.dev = FS.isChrdev(node.mode) ? node.id : 1;
  999. attr.ino = node.id;
  1000. attr.mode = node.mode;
  1001. attr.nlink = 1;
  1002. attr.uid = 0;
  1003. attr.gid = 0;
  1004. attr.rdev = node.rdev;
  1005. if (FS.isDir(node.mode)) {
  1006. attr.size = 4096;
  1007. } else if (FS.isFile(node.mode)) {
  1008. attr.size = node.usedBytes;
  1009. } else if (FS.isLink(node.mode)) {
  1010. attr.size = node.link.length;
  1011. } else {
  1012. attr.size = 0;
  1013. }
  1014. attr.atime = new Date(node.timestamp);
  1015. attr.mtime = new Date(node.timestamp);
  1016. attr.ctime = new Date(node.timestamp);
  1017. attr.blksize = 4096;
  1018. attr.blocks = Math.ceil(attr.size / attr.blksize);
  1019. return attr;
  1020. }, setattr: function(node, attr) {
  1021. if (attr.mode !== void 0) {
  1022. node.mode = attr.mode;
  1023. }
  1024. if (attr.timestamp !== void 0) {
  1025. node.timestamp = attr.timestamp;
  1026. }
  1027. if (attr.size !== void 0) {
  1028. MEMFS.resizeFileStorage(node, attr.size);
  1029. }
  1030. }, lookup: function(parent, name) {
  1031. throw FS.genericErrors[44];
  1032. }, mknod: function(parent, name, mode, dev) {
  1033. return MEMFS.createNode(parent, name, mode, dev);
  1034. }, rename: function(old_node, new_dir, new_name) {
  1035. if (FS.isDir(old_node.mode)) {
  1036. var new_node;
  1037. try {
  1038. new_node = FS.lookupNode(new_dir, new_name);
  1039. } catch (e) {
  1040. }
  1041. if (new_node) {
  1042. for (var i in new_node.contents) {
  1043. throw new FS.ErrnoError(55);
  1044. }
  1045. }
  1046. }
  1047. delete old_node.parent.contents[old_node.name];
  1048. old_node.name = new_name;
  1049. new_dir.contents[new_name] = old_node;
  1050. old_node.parent = new_dir;
  1051. }, unlink: function(parent, name) {
  1052. delete parent.contents[name];
  1053. }, rmdir: function(parent, name) {
  1054. var node = FS.lookupNode(parent, name);
  1055. for (var i in node.contents) {
  1056. throw new FS.ErrnoError(55);
  1057. }
  1058. delete parent.contents[name];
  1059. }, readdir: function(node) {
  1060. var entries = [".", ".."];
  1061. for (var key2 in node.contents) {
  1062. if (!node.contents.hasOwnProperty(key2)) {
  1063. continue;
  1064. }
  1065. entries.push(key2);
  1066. }
  1067. return entries;
  1068. }, symlink: function(parent, newname, oldpath) {
  1069. var node = MEMFS.createNode(parent, newname, 511 | 40960, 0);
  1070. node.link = oldpath;
  1071. return node;
  1072. }, readlink: function(node) {
  1073. if (!FS.isLink(node.mode)) {
  1074. throw new FS.ErrnoError(28);
  1075. }
  1076. return node.link;
  1077. }}, stream_ops: {read: function(stream, buffer2, offset, length, position) {
  1078. var contents = stream.node.contents;
  1079. if (position >= stream.node.usedBytes)
  1080. return 0;
  1081. var size = Math.min(stream.node.usedBytes - position, length);
  1082. if (size > 8 && contents.subarray) {
  1083. buffer2.set(contents.subarray(position, position + size), offset);
  1084. } else {
  1085. for (var i = 0; i < size; i++)
  1086. buffer2[offset + i] = contents[position + i];
  1087. }
  1088. return size;
  1089. }, write: function(stream, buffer2, offset, length, position, canOwn) {
  1090. if (buffer2.buffer === HEAP8.buffer) {
  1091. canOwn = false;
  1092. }
  1093. if (!length)
  1094. return 0;
  1095. var node = stream.node;
  1096. node.timestamp = Date.now();
  1097. if (buffer2.subarray && (!node.contents || node.contents.subarray)) {
  1098. if (canOwn) {
  1099. node.contents = buffer2.subarray(offset, offset + length);
  1100. node.usedBytes = length;
  1101. return length;
  1102. } else if (node.usedBytes === 0 && position === 0) {
  1103. node.contents = buffer2.slice(offset, offset + length);
  1104. node.usedBytes = length;
  1105. return length;
  1106. } else if (position + length <= node.usedBytes) {
  1107. node.contents.set(buffer2.subarray(offset, offset + length), position);
  1108. return length;
  1109. }
  1110. }
  1111. MEMFS.expandFileStorage(node, position + length);
  1112. if (node.contents.subarray && buffer2.subarray) {
  1113. node.contents.set(buffer2.subarray(offset, offset + length), position);
  1114. } else {
  1115. for (var i = 0; i < length; i++) {
  1116. node.contents[position + i] = buffer2[offset + i];
  1117. }
  1118. }
  1119. node.usedBytes = Math.max(node.usedBytes, position + length);
  1120. return length;
  1121. }, llseek: function(stream, offset, whence) {
  1122. var position = offset;
  1123. if (whence === 1) {
  1124. position += stream.position;
  1125. } else if (whence === 2) {
  1126. if (FS.isFile(stream.node.mode)) {
  1127. position += stream.node.usedBytes;
  1128. }
  1129. }
  1130. if (position < 0) {
  1131. throw new FS.ErrnoError(28);
  1132. }
  1133. return position;
  1134. }, allocate: function(stream, offset, length) {
  1135. MEMFS.expandFileStorage(stream.node, offset + length);
  1136. stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length);
  1137. }, mmap: function(stream, address, length, position, prot, flags) {
  1138. assert(address === 0);
  1139. if (!FS.isFile(stream.node.mode)) {
  1140. throw new FS.ErrnoError(43);
  1141. }
  1142. var ptr;
  1143. var allocated;
  1144. var contents = stream.node.contents;
  1145. if (!(flags & 2) && contents.buffer === buffer) {
  1146. allocated = false;
  1147. ptr = contents.byteOffset;
  1148. } else {
  1149. if (position > 0 || position + length < contents.length) {
  1150. if (contents.subarray) {
  1151. contents = contents.subarray(position, position + length);
  1152. } else {
  1153. contents = Array.prototype.slice.call(contents, position, position + length);
  1154. }
  1155. }
  1156. allocated = true;
  1157. ptr = mmapAlloc(length);
  1158. if (!ptr) {
  1159. throw new FS.ErrnoError(48);
  1160. }
  1161. HEAP8.set(contents, ptr);
  1162. }
  1163. return {ptr, allocated};
  1164. }, msync: function(stream, buffer2, offset, length, mmapFlags) {
  1165. if (!FS.isFile(stream.node.mode)) {
  1166. throw new FS.ErrnoError(43);
  1167. }
  1168. if (mmapFlags & 2) {
  1169. return 0;
  1170. }
  1171. var bytesWritten = MEMFS.stream_ops.write(stream, buffer2, 0, length, offset, false);
  1172. return 0;
  1173. }}};
  1174. var FS = {root: null, mounts: [], devices: {}, streams: [], nextInode: 1, nameTable: null, currentPath: "/", initialized: false, ignorePermissions: true, trackingDelegate: {}, tracking: {openFlags: {READ: 1, WRITE: 2}}, ErrnoError: null, genericErrors: {}, filesystems: null, syncFSRequests: 0, lookupPath: function(path, opts) {
  1175. path = PATH_FS.resolve(FS.cwd(), path);
  1176. opts = opts || {};
  1177. if (!path)
  1178. return {path: "", node: null};
  1179. var defaults = {follow_mount: true, recurse_count: 0};
  1180. for (var key2 in defaults) {
  1181. if (opts[key2] === void 0) {
  1182. opts[key2] = defaults[key2];
  1183. }
  1184. }
  1185. if (opts.recurse_count > 8) {
  1186. throw new FS.ErrnoError(32);
  1187. }
  1188. var parts = PATH.normalizeArray(path.split("/").filter(function(p) {
  1189. return !!p;
  1190. }), false);
  1191. var current = FS.root;
  1192. var current_path = "/";
  1193. for (var i = 0; i < parts.length; i++) {
  1194. var islast = i === parts.length - 1;
  1195. if (islast && opts.parent) {
  1196. break;
  1197. }
  1198. current = FS.lookupNode(current, parts[i]);
  1199. current_path = PATH.join2(current_path, parts[i]);
  1200. if (FS.isMountpoint(current)) {
  1201. if (!islast || islast && opts.follow_mount) {
  1202. current = current.mounted.root;
  1203. }
  1204. }
  1205. if (!islast || opts.follow) {
  1206. var count = 0;
  1207. while (FS.isLink(current.mode)) {
  1208. var link = FS.readlink(current_path);
  1209. current_path = PATH_FS.resolve(PATH.dirname(current_path), link);
  1210. var lookup = FS.lookupPath(current_path, {recurse_count: opts.recurse_count});
  1211. current = lookup.node;
  1212. if (count++ > 40) {
  1213. throw new FS.ErrnoError(32);
  1214. }
  1215. }
  1216. }
  1217. }
  1218. return {path: current_path, node: current};
  1219. }, getPath: function(node) {
  1220. var path;
  1221. while (true) {
  1222. if (FS.isRoot(node)) {
  1223. var mount = node.mount.mountpoint;
  1224. if (!path)
  1225. return mount;
  1226. return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path;
  1227. }
  1228. path = path ? node.name + "/" + path : node.name;
  1229. node = node.parent;
  1230. }
  1231. }, hashName: function(parentid, name) {
  1232. var hash = 0;
  1233. for (var i = 0; i < name.length; i++) {
  1234. hash = (hash << 5) - hash + name.charCodeAt(i) | 0;
  1235. }
  1236. return (parentid + hash >>> 0) % FS.nameTable.length;
  1237. }, hashAddNode: function(node) {
  1238. var hash = FS.hashName(node.parent.id, node.name);
  1239. node.name_next = FS.nameTable[hash];
  1240. FS.nameTable[hash] = node;
  1241. }, hashRemoveNode: function(node) {
  1242. var hash = FS.hashName(node.parent.id, node.name);
  1243. if (FS.nameTable[hash] === node) {
  1244. FS.nameTable[hash] = node.name_next;
  1245. } else {
  1246. var current = FS.nameTable[hash];
  1247. while (current) {
  1248. if (current.name_next === node) {
  1249. current.name_next = node.name_next;
  1250. break;
  1251. }
  1252. current = current.name_next;
  1253. }
  1254. }
  1255. }, lookupNode: function(parent, name) {
  1256. var errCode = FS.mayLookup(parent);
  1257. if (errCode) {
  1258. throw new FS.ErrnoError(errCode, parent);
  1259. }
  1260. var hash = FS.hashName(parent.id, name);
  1261. for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  1262. var nodeName = node.name;
  1263. if (node.parent.id === parent.id && nodeName === name) {
  1264. return node;
  1265. }
  1266. }
  1267. return FS.lookup(parent, name);
  1268. }, createNode: function(parent, name, mode, rdev) {
  1269. var node = new FS.FSNode(parent, name, mode, rdev);
  1270. FS.hashAddNode(node);
  1271. return node;
  1272. }, destroyNode: function(node) {
  1273. FS.hashRemoveNode(node);
  1274. }, isRoot: function(node) {
  1275. return node === node.parent;
  1276. }, isMountpoint: function(node) {
  1277. return !!node.mounted;
  1278. }, isFile: function(mode) {
  1279. return (mode & 61440) === 32768;
  1280. }, isDir: function(mode) {
  1281. return (mode & 61440) === 16384;
  1282. }, isLink: function(mode) {
  1283. return (mode & 61440) === 40960;
  1284. }, isChrdev: function(mode) {
  1285. return (mode & 61440) === 8192;
  1286. }, isBlkdev: function(mode) {
  1287. return (mode & 61440) === 24576;
  1288. }, isFIFO: function(mode) {
  1289. return (mode & 61440) === 4096;
  1290. }, isSocket: function(mode) {
  1291. return (mode & 49152) === 49152;
  1292. }, flagModes: {r: 0, "r+": 2, w: 577, "w+": 578, a: 1089, "a+": 1090}, modeStringToFlags: function(str) {
  1293. var flags = FS.flagModes[str];
  1294. if (typeof flags === "undefined") {
  1295. throw new Error("Unknown file open mode: " + str);
  1296. }
  1297. return flags;
  1298. }, flagsToPermissionString: function(flag) {
  1299. var perms = ["r", "w", "rw"][flag & 3];
  1300. if (flag & 512) {
  1301. perms += "w";
  1302. }
  1303. return perms;
  1304. }, nodePermissions: function(node, perms) {
  1305. if (FS.ignorePermissions) {
  1306. return 0;
  1307. }
  1308. if (perms.indexOf("r") !== -1 && !(node.mode & 292)) {
  1309. return 2;
  1310. } else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) {
  1311. return 2;
  1312. } else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) {
  1313. return 2;
  1314. }
  1315. return 0;
  1316. }, mayLookup: function(dir) {
  1317. var errCode = FS.nodePermissions(dir, "x");
  1318. if (errCode)
  1319. return errCode;
  1320. if (!dir.node_ops.lookup)
  1321. return 2;
  1322. return 0;
  1323. }, mayCreate: function(dir, name) {
  1324. try {
  1325. var node = FS.lookupNode(dir, name);
  1326. return 20;
  1327. } catch (e) {
  1328. }
  1329. return FS.nodePermissions(dir, "wx");
  1330. }, mayDelete: function(dir, name, isdir) {
  1331. var node;
  1332. try {
  1333. node = FS.lookupNode(dir, name);
  1334. } catch (e) {
  1335. return e.errno;
  1336. }
  1337. var errCode = FS.nodePermissions(dir, "wx");
  1338. if (errCode) {
  1339. return errCode;
  1340. }
  1341. if (isdir) {
  1342. if (!FS.isDir(node.mode)) {
  1343. return 54;
  1344. }
  1345. if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  1346. return 10;
  1347. }
  1348. } else {
  1349. if (FS.isDir(node.mode)) {
  1350. return 31;
  1351. }
  1352. }
  1353. return 0;
  1354. }, mayOpen: function(node, flags) {
  1355. if (!node) {
  1356. return 44;
  1357. }
  1358. if (FS.isLink(node.mode)) {
  1359. return 32;
  1360. } else if (FS.isDir(node.mode)) {
  1361. if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) {
  1362. return 31;
  1363. }
  1364. }
  1365. return FS.nodePermissions(node, FS.flagsToPermissionString(flags));
  1366. }, MAX_OPEN_FDS: 4096, nextfd: function(fd_start, fd_end) {
  1367. fd_start = fd_start || 0;
  1368. fd_end = fd_end || FS.MAX_OPEN_FDS;
  1369. for (var fd = fd_start; fd <= fd_end; fd++) {
  1370. if (!FS.streams[fd]) {
  1371. return fd;
  1372. }
  1373. }
  1374. throw new FS.ErrnoError(33);
  1375. }, getStream: function(fd) {
  1376. return FS.streams[fd];
  1377. }, createStream: function(stream, fd_start, fd_end) {
  1378. if (!FS.FSStream) {
  1379. FS.FSStream = function() {
  1380. };
  1381. FS.FSStream.prototype = {object: {get: function() {
  1382. return this.node;
  1383. }, set: function(val) {
  1384. this.node = val;
  1385. }}, isRead: {get: function() {
  1386. return (this.flags & 2097155) !== 1;
  1387. }}, isWrite: {get: function() {
  1388. return (this.flags & 2097155) !== 0;
  1389. }}, isAppend: {get: function() {
  1390. return this.flags & 1024;
  1391. }}};
  1392. }
  1393. var newStream = new FS.FSStream();
  1394. for (var p in stream) {
  1395. newStream[p] = stream[p];
  1396. }
  1397. stream = newStream;
  1398. var fd = FS.nextfd(fd_start, fd_end);
  1399. stream.fd = fd;
  1400. FS.streams[fd] = stream;
  1401. return stream;
  1402. }, closeStream: function(fd) {
  1403. FS.streams[fd] = null;
  1404. }, chrdev_stream_ops: {open: function(stream) {
  1405. var device = FS.getDevice(stream.node.rdev);
  1406. stream.stream_ops = device.stream_ops;
  1407. if (stream.stream_ops.open) {
  1408. stream.stream_ops.open(stream);
  1409. }
  1410. }, llseek: function() {
  1411. throw new FS.ErrnoError(70);
  1412. }}, major: function(dev) {
  1413. return dev >> 8;
  1414. }, minor: function(dev) {
  1415. return dev & 255;
  1416. }, makedev: function(ma, mi) {
  1417. return ma << 8 | mi;
  1418. }, registerDevice: function(dev, ops) {
  1419. FS.devices[dev] = {stream_ops: ops};
  1420. }, getDevice: function(dev) {
  1421. return FS.devices[dev];
  1422. }, getMounts: function(mount) {
  1423. var mounts = [];
  1424. var check = [mount];
  1425. while (check.length) {
  1426. var m = check.pop();
  1427. mounts.push(m);
  1428. check.push.apply(check, m.mounts);
  1429. }
  1430. return mounts;
  1431. }, syncfs: function(populate, callback) {
  1432. if (typeof populate === "function") {
  1433. callback = populate;
  1434. populate = false;
  1435. }
  1436. FS.syncFSRequests++;
  1437. if (FS.syncFSRequests > 1) {
  1438. err("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work");
  1439. }
  1440. var mounts = FS.getMounts(FS.root.mount);
  1441. var completed = 0;
  1442. function doCallback(errCode) {
  1443. FS.syncFSRequests--;
  1444. return callback(errCode);
  1445. }
  1446. function done(errCode) {
  1447. if (errCode) {
  1448. if (!done.errored) {
  1449. done.errored = true;
  1450. return doCallback(errCode);
  1451. }
  1452. return;
  1453. }
  1454. if (++completed >= mounts.length) {
  1455. doCallback(null);
  1456. }
  1457. }
  1458. mounts.forEach(function(mount) {
  1459. if (!mount.type.syncfs) {
  1460. return done(null);
  1461. }
  1462. mount.type.syncfs(mount, populate, done);
  1463. });
  1464. }, mount: function(type, opts, mountpoint) {
  1465. var root = mountpoint === "/";
  1466. var pseudo = !mountpoint;
  1467. var node;
  1468. if (root && FS.root) {
  1469. throw new FS.ErrnoError(10);
  1470. } else if (!root && !pseudo) {
  1471. var lookup = FS.lookupPath(mountpoint, {follow_mount: false});
  1472. mountpoint = lookup.path;
  1473. node = lookup.node;
  1474. if (FS.isMountpoint(node)) {
  1475. throw new FS.ErrnoError(10);
  1476. }
  1477. if (!FS.isDir(node.mode)) {
  1478. throw new FS.ErrnoError(54);
  1479. }
  1480. }
  1481. var mount = {type, opts, mountpoint, mounts: []};
  1482. var mountRoot = type.mount(mount);
  1483. mountRoot.mount = mount;
  1484. mount.root = mountRoot;
  1485. if (root) {
  1486. FS.root = mountRoot;
  1487. } else if (node) {
  1488. node.mounted = mount;
  1489. if (node.mount) {
  1490. node.mount.mounts.push(mount);
  1491. }
  1492. }
  1493. return mountRoot;
  1494. }, unmount: function(mountpoint) {
  1495. var lookup = FS.lookupPath(mountpoint, {follow_mount: false});
  1496. if (!FS.isMountpoint(lookup.node)) {
  1497. throw new FS.ErrnoError(28);
  1498. }
  1499. var node = lookup.node;
  1500. var mount = node.mounted;
  1501. var mounts = FS.getMounts(mount);
  1502. Object.keys(FS.nameTable).forEach(function(hash) {
  1503. var current = FS.nameTable[hash];
  1504. while (current) {
  1505. var next = current.name_next;
  1506. if (mounts.indexOf(current.mount) !== -1) {
  1507. FS.destroyNode(current);
  1508. }
  1509. current = next;
  1510. }
  1511. });
  1512. node.mounted = null;
  1513. var idx = node.mount.mounts.indexOf(mount);
  1514. node.mount.mounts.splice(idx, 1);
  1515. }, lookup: function(parent, name) {
  1516. return parent.node_ops.lookup(parent, name);
  1517. }, mknod: function(path, mode, dev) {
  1518. var lookup = FS.lookupPath(path, {parent: true});
  1519. var parent = lookup.node;
  1520. var name = PATH.basename(path);
  1521. if (!name || name === "." || name === "..") {
  1522. throw new FS.ErrnoError(28);
  1523. }
  1524. var errCode = FS.mayCreate(parent, name);
  1525. if (errCode) {
  1526. throw new FS.ErrnoError(errCode);
  1527. }
  1528. if (!parent.node_ops.mknod) {
  1529. throw new FS.ErrnoError(63);
  1530. }
  1531. return parent.node_ops.mknod(parent, name, mode, dev);
  1532. }, create: function(path, mode) {
  1533. mode = mode !== void 0 ? mode : 438;
  1534. mode &= 4095;
  1535. mode |= 32768;
  1536. return FS.mknod(path, mode, 0);
  1537. }, mkdir: function(path, mode) {
  1538. mode = mode !== void 0 ? mode : 511;
  1539. mode &= 511 | 512;
  1540. mode |= 16384;
  1541. return FS.mknod(path, mode, 0);
  1542. }, mkdirTree: function(path, mode) {
  1543. var dirs = path.split("/");
  1544. var d = "";
  1545. for (var i = 0; i < dirs.length; ++i) {
  1546. if (!dirs[i])
  1547. continue;
  1548. d += "/" + dirs[i];
  1549. try {
  1550. FS.mkdir(d, mode);
  1551. } catch (e) {
  1552. if (e.errno != 20)
  1553. throw e;
  1554. }
  1555. }
  1556. }, mkdev: function(path, mode, dev) {
  1557. if (typeof dev === "undefined") {
  1558. dev = mode;
  1559. mode = 438;
  1560. }
  1561. mode |= 8192;
  1562. return FS.mknod(path, mode, dev);
  1563. }, symlink: function(oldpath, newpath) {
  1564. if (!PATH_FS.resolve(oldpath)) {
  1565. throw new FS.ErrnoError(44);
  1566. }
  1567. var lookup = FS.lookupPath(newpath, {parent: true});
  1568. var parent = lookup.node;
  1569. if (!parent) {
  1570. throw new FS.ErrnoError(44);
  1571. }
  1572. var newname = PATH.basename(newpath);
  1573. var errCode = FS.mayCreate(parent, newname);
  1574. if (errCode) {
  1575. throw new FS.ErrnoError(errCode);
  1576. }
  1577. if (!parent.node_ops.symlink) {
  1578. throw new FS.ErrnoError(63);
  1579. }
  1580. return parent.node_ops.symlink(parent, newname, oldpath);
  1581. }, rename: function(old_path, new_path) {
  1582. var old_dirname = PATH.dirname(old_path);
  1583. var new_dirname = PATH.dirname(new_path);
  1584. var old_name = PATH.basename(old_path);
  1585. var new_name = PATH.basename(new_path);
  1586. var lookup, old_dir, new_dir;
  1587. lookup = FS.lookupPath(old_path, {parent: true});
  1588. old_dir = lookup.node;
  1589. lookup = FS.lookupPath(new_path, {parent: true});
  1590. new_dir = lookup.node;
  1591. if (!old_dir || !new_dir)
  1592. throw new FS.ErrnoError(44);
  1593. if (old_dir.mount !== new_dir.mount) {
  1594. throw new FS.ErrnoError(75);
  1595. }
  1596. var old_node = FS.lookupNode(old_dir, old_name);
  1597. var relative = PATH_FS.relative(old_path, new_dirname);
  1598. if (relative.charAt(0) !== ".") {
  1599. throw new FS.ErrnoError(28);
  1600. }
  1601. relative = PATH_FS.relative(new_path, old_dirname);
  1602. if (relative.charAt(0) !== ".") {
  1603. throw new FS.ErrnoError(55);
  1604. }
  1605. var new_node;
  1606. try {
  1607. new_node = FS.lookupNode(new_dir, new_name);
  1608. } catch (e) {
  1609. }
  1610. if (old_node === new_node) {
  1611. return;
  1612. }
  1613. var isdir = FS.isDir(old_node.mode);
  1614. var errCode = FS.mayDelete(old_dir, old_name, isdir);
  1615. if (errCode) {
  1616. throw new FS.ErrnoError(errCode);
  1617. }
  1618. errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name);
  1619. if (errCode) {
  1620. throw new FS.ErrnoError(errCode);
  1621. }
  1622. if (!old_dir.node_ops.rename) {
  1623. throw new FS.ErrnoError(63);
  1624. }
  1625. if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) {
  1626. throw new FS.ErrnoError(10);
  1627. }
  1628. if (new_dir !== old_dir) {
  1629. errCode = FS.nodePermissions(old_dir, "w");
  1630. if (errCode) {
  1631. throw new FS.ErrnoError(errCode);
  1632. }
  1633. }
  1634. try {
  1635. if (FS.trackingDelegate["willMovePath"]) {
  1636. FS.trackingDelegate["willMovePath"](old_path, new_path);
  1637. }
  1638. } catch (e) {
  1639. err("FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message);
  1640. }
  1641. FS.hashRemoveNode(old_node);
  1642. try {
  1643. old_dir.node_ops.rename(old_node, new_dir, new_name);
  1644. } catch (e) {
  1645. throw e;
  1646. } finally {
  1647. FS.hashAddNode(old_node);
  1648. }
  1649. try {
  1650. if (FS.trackingDelegate["onMovePath"])
  1651. FS.trackingDelegate["onMovePath"](old_path, new_path);
  1652. } catch (e) {
  1653. err("FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message);
  1654. }
  1655. }, rmdir: function(path) {
  1656. var lookup = FS.lookupPath(path, {parent: true});
  1657. var parent = lookup.node;
  1658. var name = PATH.basename(path);
  1659. var node = FS.lookupNode(parent, name);
  1660. var errCode = FS.mayDelete(parent, name, true);
  1661. if (errCode) {
  1662. throw new FS.ErrnoError(errCode);
  1663. }
  1664. if (!parent.node_ops.rmdir) {
  1665. throw new FS.ErrnoError(63);
  1666. }
  1667. if (FS.isMountpoint(node)) {
  1668. throw new FS.ErrnoError(10);
  1669. }
  1670. try {
  1671. if (FS.trackingDelegate["willDeletePath"]) {
  1672. FS.trackingDelegate["willDeletePath"](path);
  1673. }
  1674. } catch (e) {
  1675. err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
  1676. }
  1677. parent.node_ops.rmdir(parent, name);
  1678. FS.destroyNode(node);
  1679. try {
  1680. if (FS.trackingDelegate["onDeletePath"])
  1681. FS.trackingDelegate["onDeletePath"](path);
  1682. } catch (e) {
  1683. err("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message);
  1684. }
  1685. }, readdir: function(path) {
  1686. var lookup = FS.lookupPath(path, {follow: true});
  1687. var node = lookup.node;
  1688. if (!node.node_ops.readdir) {
  1689. throw new FS.ErrnoError(54);
  1690. }
  1691. return node.node_ops.readdir(node);
  1692. }, unlink: function(path) {
  1693. var lookup = FS.lookupPath(path, {parent: true});
  1694. var parent = lookup.node;
  1695. var name = PATH.basename(path);
  1696. var node = FS.lookupNode(parent, name);
  1697. var errCode = FS.mayDelete(parent, name, false);
  1698. if (errCode) {
  1699. throw new FS.ErrnoError(errCode);
  1700. }
  1701. if (!parent.node_ops.unlink) {
  1702. throw new FS.ErrnoError(63);
  1703. }
  1704. if (FS.isMountpoint(node)) {
  1705. throw new FS.ErrnoError(10);
  1706. }
  1707. try {
  1708. if (FS.trackingDelegate["willDeletePath"]) {
  1709. FS.trackingDelegate["willDeletePath"](path);
  1710. }
  1711. } catch (e) {
  1712. err("FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message);
  1713. }
  1714. parent.node_ops.unlink(parent, name);
  1715. FS.destroyNode(node);
  1716. try {
  1717. if (FS.trackingDelegate["onDeletePath"])
  1718. FS.trackingDelegate["onDeletePath"](path);
  1719. } catch (e) {
  1720. err("FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message);
  1721. }
  1722. }, readlink: function(path) {
  1723. var lookup = FS.lookupPath(path);
  1724. var link = lookup.node;
  1725. if (!link) {
  1726. throw new FS.ErrnoError(44);
  1727. }
  1728. if (!link.node_ops.readlink) {
  1729. throw new FS.ErrnoError(28);
  1730. }
  1731. return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link));
  1732. }, stat: function(path, dontFollow) {
  1733. var lookup = FS.lookupPath(path, {follow: !dontFollow});
  1734. var node = lookup.node;
  1735. if (!node) {
  1736. throw new FS.ErrnoError(44);
  1737. }
  1738. if (!node.node_ops.getattr) {
  1739. throw new FS.ErrnoError(63);
  1740. }
  1741. return node.node_ops.getattr(node);
  1742. }, lstat: function(path) {
  1743. return FS.stat(path, true);
  1744. }, chmod: function(path, mode, dontFollow) {
  1745. var node;
  1746. if (typeof path === "string") {
  1747. var lookup = FS.lookupPath(path, {follow: !dontFollow});
  1748. node = lookup.node;
  1749. } else {
  1750. node = path;
  1751. }
  1752. if (!node.node_ops.setattr) {
  1753. throw new FS.ErrnoError(63);
  1754. }
  1755. node.node_ops.setattr(node, {mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now()});
  1756. }, lchmod: function(path, mode) {
  1757. FS.chmod(path, mode, true);
  1758. }, fchmod: function(fd, mode) {
  1759. var stream = FS.getStream(fd);
  1760. if (!stream) {
  1761. throw new FS.ErrnoError(8);
  1762. }
  1763. FS.chmod(stream.node, mode);
  1764. }, chown: function(path, uid, gid, dontFollow) {
  1765. var node;
  1766. if (typeof path === "string") {
  1767. var lookup = FS.lookupPath(path, {follow: !dontFollow});
  1768. node = lookup.node;
  1769. } else {
  1770. node = path;
  1771. }
  1772. if (!node.node_ops.setattr) {
  1773. throw new FS.ErrnoError(63);
  1774. }
  1775. node.node_ops.setattr(node, {timestamp: Date.now()});
  1776. }, lchown: function(path, uid, gid) {
  1777. FS.chown(path, uid, gid, true);
  1778. }, fchown: function(fd, uid, gid) {
  1779. var stream = FS.getStream(fd);
  1780. if (!stream) {
  1781. throw new FS.ErrnoError(8);
  1782. }
  1783. FS.chown(stream.node, uid, gid);
  1784. }, truncate: function(path, len) {
  1785. if (len < 0) {
  1786. throw new FS.ErrnoError(28);
  1787. }
  1788. var node;
  1789. if (typeof path === "string") {
  1790. var lookup = FS.lookupPath(path, {follow: true});
  1791. node = lookup.node;
  1792. } else {
  1793. node = path;
  1794. }
  1795. if (!node.node_ops.setattr) {
  1796. throw new FS.ErrnoError(63);
  1797. }
  1798. if (FS.isDir(node.mode)) {
  1799. throw new FS.ErrnoError(31);
  1800. }
  1801. if (!FS.isFile(node.mode)) {
  1802. throw new FS.ErrnoError(28);
  1803. }
  1804. var errCode = FS.nodePermissions(node, "w");
  1805. if (errCode) {
  1806. throw new FS.ErrnoError(errCode);
  1807. }
  1808. node.node_ops.setattr(node, {size: len, timestamp: Date.now()});
  1809. }, ftruncate: function(fd, len) {
  1810. var stream = FS.getStream(fd);
  1811. if (!stream) {
  1812. throw new FS.ErrnoError(8);
  1813. }
  1814. if ((stream.flags & 2097155) === 0) {
  1815. throw new FS.ErrnoError(28);
  1816. }
  1817. FS.truncate(stream.node, len);
  1818. }, utime: function(path, atime, mtime) {
  1819. var lookup = FS.lookupPath(path, {follow: true});
  1820. var node = lookup.node;
  1821. node.node_ops.setattr(node, {timestamp: Math.max(atime, mtime)});
  1822. }, open: function(path, flags, mode, fd_start, fd_end) {
  1823. if (path === "") {
  1824. throw new FS.ErrnoError(44);
  1825. }
  1826. flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags;
  1827. mode = typeof mode === "undefined" ? 438 : mode;
  1828. if (flags & 64) {
  1829. mode = mode & 4095 | 32768;
  1830. } else {
  1831. mode = 0;
  1832. }
  1833. var node;
  1834. if (typeof path === "object") {
  1835. node = path;
  1836. } else {
  1837. path = PATH.normalize(path);
  1838. try {
  1839. var lookup = FS.lookupPath(path, {follow: !(flags & 131072)});
  1840. node = lookup.node;
  1841. } catch (e) {
  1842. }
  1843. }
  1844. var created = false;
  1845. if (flags & 64) {
  1846. if (node) {
  1847. if (flags & 128) {
  1848. throw new FS.ErrnoError(20);
  1849. }
  1850. } else {
  1851. node = FS.mknod(path, mode, 0);
  1852. created = true;
  1853. }
  1854. }
  1855. if (!node) {
  1856. throw new FS.ErrnoError(44);
  1857. }
  1858. if (FS.isChrdev(node.mode)) {
  1859. flags &= ~512;
  1860. }
  1861. if (flags & 65536 && !FS.isDir(node.mode)) {
  1862. throw new FS.ErrnoError(54);
  1863. }
  1864. if (!created) {
  1865. var errCode = FS.mayOpen(node, flags);
  1866. if (errCode) {
  1867. throw new FS.ErrnoError(errCode);
  1868. }
  1869. }
  1870. if (flags & 512) {
  1871. FS.truncate(node, 0);
  1872. }
  1873. flags &= ~(128 | 512 | 131072);
  1874. var stream = FS.createStream({node, path: FS.getPath(node), flags, seekable: true, position: 0, stream_ops: node.stream_ops, ungotten: [], error: false}, fd_start, fd_end);
  1875. if (stream.stream_ops.open) {
  1876. stream.stream_ops.open(stream);
  1877. }
  1878. if (Module["logReadFiles"] && !(flags & 1)) {
  1879. if (!FS.readFiles)
  1880. FS.readFiles = {};
  1881. if (!(path in FS.readFiles)) {
  1882. FS.readFiles[path] = 1;
  1883. err("FS.trackingDelegate error on read file: " + path);
  1884. }
  1885. }
  1886. try {
  1887. if (FS.trackingDelegate["onOpenFile"]) {
  1888. var trackingFlags = 0;
  1889. if ((flags & 2097155) !== 1) {
  1890. trackingFlags |= FS.tracking.openFlags.READ;
  1891. }
  1892. if ((flags & 2097155) !== 0) {
  1893. trackingFlags |= FS.tracking.openFlags.WRITE;
  1894. }
  1895. FS.trackingDelegate["onOpenFile"](path, trackingFlags);
  1896. }
  1897. } catch (e) {
  1898. err("FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message);
  1899. }
  1900. return stream;
  1901. }, close: function(stream) {
  1902. if (FS.isClosed(stream)) {
  1903. throw new FS.ErrnoError(8);
  1904. }
  1905. if (stream.getdents)
  1906. stream.getdents = null;
  1907. try {
  1908. if (stream.stream_ops.close) {
  1909. stream.stream_ops.close(stream);
  1910. }
  1911. } catch (e) {
  1912. throw e;
  1913. } finally {
  1914. FS.closeStream(stream.fd);
  1915. }
  1916. stream.fd = null;
  1917. }, isClosed: function(stream) {
  1918. return stream.fd === null;
  1919. }, llseek: function(stream, offset, whence) {
  1920. if (FS.isClosed(stream)) {
  1921. throw new FS.ErrnoError(8);
  1922. }
  1923. if (!stream.seekable || !stream.stream_ops.llseek) {
  1924. throw new FS.ErrnoError(70);
  1925. }
  1926. if (whence != 0 && whence != 1 && whence != 2) {
  1927. throw new FS.ErrnoError(28);
  1928. }
  1929. stream.position = stream.stream_ops.llseek(stream, offset, whence);
  1930. stream.ungotten = [];
  1931. return stream.position;
  1932. }, read: function(stream, buffer2, offset, length, position) {
  1933. if (length < 0 || position < 0) {
  1934. throw new FS.ErrnoError(28);
  1935. }
  1936. if (FS.isClosed(stream)) {
  1937. throw new FS.ErrnoError(8);
  1938. }
  1939. if ((stream.flags & 2097155) === 1) {
  1940. throw new FS.ErrnoError(8);
  1941. }
  1942. if (FS.isDir(stream.node.mode)) {
  1943. throw new FS.ErrnoError(31);
  1944. }
  1945. if (!stream.stream_ops.read) {
  1946. throw new FS.ErrnoError(28);
  1947. }
  1948. var seeking = typeof position !== "undefined";
  1949. if (!seeking) {
  1950. position = stream.position;
  1951. } else if (!stream.seekable) {
  1952. throw new FS.ErrnoError(70);
  1953. }
  1954. var bytesRead = stream.stream_ops.read(stream, buffer2, offset, length, position);
  1955. if (!seeking)
  1956. stream.position += bytesRead;
  1957. return bytesRead;
  1958. }, write: function(stream, buffer2, offset, length, position, canOwn) {
  1959. if (length < 0 || position < 0) {
  1960. throw new FS.ErrnoError(28);
  1961. }
  1962. if (FS.isClosed(stream)) {
  1963. throw new FS.ErrnoError(8);
  1964. }
  1965. if ((stream.flags & 2097155) === 0) {
  1966. throw new FS.ErrnoError(8);
  1967. }
  1968. if (FS.isDir(stream.node.mode)) {
  1969. throw new FS.ErrnoError(31);
  1970. }
  1971. if (!stream.stream_ops.write) {
  1972. throw new FS.ErrnoError(28);
  1973. }
  1974. if (stream.seekable && stream.flags & 1024) {
  1975. FS.llseek(stream, 0, 2);
  1976. }
  1977. var seeking = typeof position !== "undefined";
  1978. if (!seeking) {
  1979. position = stream.position;
  1980. } else if (!stream.seekable) {
  1981. throw new FS.ErrnoError(70);
  1982. }
  1983. var bytesWritten = stream.stream_ops.write(stream, buffer2, offset, length, position, canOwn);
  1984. if (!seeking)
  1985. stream.position += bytesWritten;
  1986. try {
  1987. if (stream.path && FS.trackingDelegate["onWriteToFile"])
  1988. FS.trackingDelegate["onWriteToFile"](stream.path);
  1989. } catch (e) {
  1990. err("FS.trackingDelegate['onWriteToFile']('" + stream.path + "') threw an exception: " + e.message);
  1991. }
  1992. return bytesWritten;
  1993. }, allocate: function(stream, offset, length) {
  1994. if (FS.isClosed(stream)) {
  1995. throw new FS.ErrnoError(8);
  1996. }
  1997. if (offset < 0 || length <= 0) {
  1998. throw new FS.ErrnoError(28);
  1999. }
  2000. if ((stream.flags & 2097155) === 0) {
  2001. throw new FS.ErrnoError(8);
  2002. }
  2003. if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  2004. throw new FS.ErrnoError(43);
  2005. }
  2006. if (!stream.stream_ops.allocate) {
  2007. throw new FS.ErrnoError(138);
  2008. }
  2009. stream.stream_ops.allocate(stream, offset, length);
  2010. }, mmap: function(stream, address, length, position, prot, flags) {
  2011. if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) {
  2012. throw new FS.ErrnoError(2);
  2013. }
  2014. if ((stream.flags & 2097155) === 1) {
  2015. throw new FS.ErrnoError(2);
  2016. }
  2017. if (!stream.stream_ops.mmap) {
  2018. throw new FS.ErrnoError(43);
  2019. }
  2020. return stream.stream_ops.mmap(stream, address, length, position, prot, flags);
  2021. }, msync: function(stream, buffer2, offset, length, mmapFlags) {
  2022. if (!stream || !stream.stream_ops.msync) {
  2023. return 0;
  2024. }
  2025. return stream.stream_ops.msync(stream, buffer2, offset, length, mmapFlags);
  2026. }, munmap: function(stream) {
  2027. return 0;
  2028. }, ioctl: function(stream, cmd, arg) {
  2029. if (!stream.stream_ops.ioctl) {
  2030. throw new FS.ErrnoError(59);
  2031. }
  2032. return stream.stream_ops.ioctl(stream, cmd, arg);
  2033. }, readFile: function(path, opts) {
  2034. opts = opts || {};
  2035. opts.flags = opts.flags || 0;
  2036. opts.encoding = opts.encoding || "binary";
  2037. if (opts.encoding !== "utf8" && opts.encoding !== "binary") {
  2038. throw new Error('Invalid encoding type "' + opts.encoding + '"');
  2039. }
  2040. var ret;
  2041. var stream = FS.open(path, opts.flags);
  2042. var stat = FS.stat(path);
  2043. var length = stat.size;
  2044. var buf = new Uint8Array(length);
  2045. FS.read(stream, buf, 0, length, 0);
  2046. if (opts.encoding === "utf8") {
  2047. ret = UTF8ArrayToString(buf, 0);
  2048. } else if (opts.encoding === "binary") {
  2049. ret = buf;
  2050. }
  2051. FS.close(stream);
  2052. return ret;
  2053. }, writeFile: function(path, data, opts) {
  2054. opts = opts || {};
  2055. opts.flags = opts.flags || 577;
  2056. var stream = FS.open(path, opts.flags, opts.mode);
  2057. if (typeof data === "string") {
  2058. var buf = new Uint8Array(lengthBytesUTF8(data) + 1);
  2059. var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length);
  2060. FS.write(stream, buf, 0, actualNumBytes, void 0, opts.canOwn);
  2061. } else if (ArrayBuffer.isView(data)) {
  2062. FS.write(stream, data, 0, data.byteLength, void 0, opts.canOwn);
  2063. } else {
  2064. throw new Error("Unsupported data type");
  2065. }
  2066. FS.close(stream);
  2067. }, cwd: function() {
  2068. return FS.currentPath;
  2069. }, chdir: function(path) {
  2070. var lookup = FS.lookupPath(path, {follow: true});
  2071. if (lookup.node === null) {
  2072. throw new FS.ErrnoError(44);
  2073. }
  2074. if (!FS.isDir(lookup.node.mode)) {
  2075. throw new FS.ErrnoError(54);
  2076. }
  2077. var errCode = FS.nodePermissions(lookup.node, "x");
  2078. if (errCode) {
  2079. throw new FS.ErrnoError(errCode);
  2080. }
  2081. FS.currentPath = lookup.path;
  2082. }, createDefaultDirectories: function() {
  2083. FS.mkdir("/tmp");
  2084. FS.mkdir("/home");
  2085. FS.mkdir("/home/web_user");
  2086. }, createDefaultDevices: function() {
  2087. FS.mkdir("/dev");
  2088. FS.registerDevice(FS.makedev(1, 3), {read: function() {
  2089. return 0;
  2090. }, write: function(stream, buffer2, offset, length, pos) {
  2091. return length;
  2092. }});
  2093. FS.mkdev("/dev/null", FS.makedev(1, 3));
  2094. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops);
  2095. TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops);
  2096. FS.mkdev("/dev/tty", FS.makedev(5, 0));
  2097. FS.mkdev("/dev/tty1", FS.makedev(6, 0));
  2098. var random_device = getRandomDevice();
  2099. FS.createDevice("/dev", "random", random_device);
  2100. FS.createDevice("/dev", "urandom", random_device);
  2101. FS.mkdir("/dev/shm");
  2102. FS.mkdir("/dev/shm/tmp");
  2103. }, createSpecialDirectories: function() {
  2104. FS.mkdir("/proc");
  2105. FS.mkdir("/proc/self");
  2106. FS.mkdir("/proc/self/fd");
  2107. FS.mount({mount: function() {
  2108. var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73);
  2109. node.node_ops = {lookup: function(parent, name) {
  2110. var fd = +name;
  2111. var stream = FS.getStream(fd);
  2112. if (!stream)
  2113. throw new FS.ErrnoError(8);
  2114. var ret = {parent: null, mount: {mountpoint: "fake"}, node_ops: {readlink: function() {
  2115. return stream.path;
  2116. }}};
  2117. ret.parent = ret;
  2118. return ret;
  2119. }};
  2120. return node;
  2121. }}, {}, "/proc/self/fd");
  2122. }, createStandardStreams: function() {
  2123. if (Module["stdin"]) {
  2124. FS.createDevice("/dev", "stdin", Module["stdin"]);
  2125. } else {
  2126. FS.symlink("/dev/tty", "/dev/stdin");
  2127. }
  2128. if (Module["stdout"]) {
  2129. FS.createDevice("/dev", "stdout", null, Module["stdout"]);
  2130. } else {
  2131. FS.symlink("/dev/tty", "/dev/stdout");
  2132. }
  2133. if (Module["stderr"]) {
  2134. FS.createDevice("/dev", "stderr", null, Module["stderr"]);
  2135. } else {
  2136. FS.symlink("/dev/tty1", "/dev/stderr");
  2137. }
  2138. var stdin = FS.open("/dev/stdin", 0);
  2139. var stdout = FS.open("/dev/stdout", 1);
  2140. var stderr = FS.open("/dev/stderr", 1);
  2141. }, ensureErrnoError: function() {
  2142. if (FS.ErrnoError)
  2143. return;
  2144. FS.ErrnoError = function ErrnoError(errno, node) {
  2145. this.node = node;
  2146. this.setErrno = function(errno2) {
  2147. this.errno = errno2;
  2148. };
  2149. this.setErrno(errno);
  2150. this.message = "FS error";
  2151. };
  2152. FS.ErrnoError.prototype = new Error();
  2153. FS.ErrnoError.prototype.constructor = FS.ErrnoError;
  2154. [44].forEach(function(code) {
  2155. FS.genericErrors[code] = new FS.ErrnoError(code);
  2156. FS.genericErrors[code].stack = "<generic error, no stack>";
  2157. });
  2158. }, staticInit: function() {
  2159. FS.ensureErrnoError();
  2160. FS.nameTable = new Array(4096);
  2161. FS.mount(MEMFS, {}, "/");
  2162. FS.createDefaultDirectories();
  2163. FS.createDefaultDevices();
  2164. FS.createSpecialDirectories();
  2165. FS.filesystems = {MEMFS};
  2166. }, init: function(input, output, error) {
  2167. FS.init.initialized = true;
  2168. FS.ensureErrnoError();
  2169. Module["stdin"] = input || Module["stdin"];
  2170. Module["stdout"] = output || Module["stdout"];
  2171. Module["stderr"] = error || Module["stderr"];
  2172. FS.createStandardStreams();
  2173. }, quit: function() {
  2174. FS.init.initialized = false;
  2175. var fflush = Module["_fflush"];
  2176. if (fflush)
  2177. fflush(0);
  2178. for (var i = 0; i < FS.streams.length; i++) {
  2179. var stream = FS.streams[i];
  2180. if (!stream) {
  2181. continue;
  2182. }
  2183. FS.close(stream);
  2184. }
  2185. }, getMode: function(canRead, canWrite) {
  2186. var mode = 0;
  2187. if (canRead)
  2188. mode |= 292 | 73;
  2189. if (canWrite)
  2190. mode |= 146;
  2191. return mode;
  2192. }, findObject: function(path, dontResolveLastLink) {
  2193. var ret = FS.analyzePath(path, dontResolveLastLink);
  2194. if (ret.exists) {
  2195. return ret.object;
  2196. } else {
  2197. return null;
  2198. }
  2199. }, analyzePath: function(path, dontResolveLastLink) {
  2200. try {
  2201. var lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});
  2202. path = lookup.path;
  2203. } catch (e) {
  2204. }
  2205. var ret = {isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null};
  2206. try {
  2207. var lookup = FS.lookupPath(path, {parent: true});
  2208. ret.parentExists = true;
  2209. ret.parentPath = lookup.path;
  2210. ret.parentObject = lookup.node;
  2211. ret.name = PATH.basename(path);
  2212. lookup = FS.lookupPath(path, {follow: !dontResolveLastLink});
  2213. ret.exists = true;
  2214. ret.path = lookup.path;
  2215. ret.object = lookup.node;
  2216. ret.name = lookup.node.name;
  2217. ret.isRoot = lookup.path === "/";
  2218. } catch (e) {
  2219. ret.error = e.errno;
  2220. }
  2221. return ret;
  2222. }, createPath: function(parent, path, canRead, canWrite) {
  2223. parent = typeof parent === "string" ? parent : FS.getPath(parent);
  2224. var parts = path.split("/").reverse();
  2225. while (parts.length) {
  2226. var part = parts.pop();
  2227. if (!part)
  2228. continue;
  2229. var current = PATH.join2(parent, part);
  2230. try {
  2231. FS.mkdir(current);
  2232. } catch (e) {
  2233. }
  2234. parent = current;
  2235. }
  2236. return current;
  2237. }, createFile: function(parent, name, properties, canRead, canWrite) {
  2238. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  2239. var mode = FS.getMode(canRead, canWrite);
  2240. return FS.create(path, mode);
  2241. }, createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
  2242. var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent;
  2243. var mode = FS.getMode(canRead, canWrite);
  2244. var node = FS.create(path, mode);
  2245. if (data) {
  2246. if (typeof data === "string") {
  2247. var arr = new Array(data.length);
  2248. for (var i = 0, len = data.length; i < len; ++i)
  2249. arr[i] = data.charCodeAt(i);
  2250. data = arr;
  2251. }
  2252. FS.chmod(node, mode | 146);
  2253. var stream = FS.open(node, 577);
  2254. FS.write(stream, data, 0, data.length, 0, canOwn);
  2255. FS.close(stream);
  2256. FS.chmod(node, mode);
  2257. }
  2258. return node;
  2259. }, createDevice: function(parent, name, input, output) {
  2260. var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name);
  2261. var mode = FS.getMode(!!input, !!output);
  2262. if (!FS.createDevice.major)
  2263. FS.createDevice.major = 64;
  2264. var dev = FS.makedev(FS.createDevice.major++, 0);
  2265. FS.registerDevice(dev, {open: function(stream) {
  2266. stream.seekable = false;
  2267. }, close: function(stream) {
  2268. if (output && output.buffer && output.buffer.length) {
  2269. output(10);
  2270. }
  2271. }, read: function(stream, buffer2, offset, length, pos) {
  2272. var bytesRead = 0;
  2273. for (var i = 0; i < length; i++) {
  2274. var result;
  2275. try {
  2276. result = input();
  2277. } catch (e) {
  2278. throw new FS.ErrnoError(29);
  2279. }
  2280. if (result === void 0 && bytesRead === 0) {
  2281. throw new FS.ErrnoError(6);
  2282. }
  2283. if (result === null || result === void 0)
  2284. break;
  2285. bytesRead++;
  2286. buffer2[offset + i] = result;
  2287. }
  2288. if (bytesRead) {
  2289. stream.node.timestamp = Date.now();
  2290. }
  2291. return bytesRead;
  2292. }, write: function(stream, buffer2, offset, length, pos) {
  2293. for (var i = 0; i < length; i++) {
  2294. try {
  2295. output(buffer2[offset + i]);
  2296. } catch (e) {
  2297. throw new FS.ErrnoError(29);
  2298. }
  2299. }
  2300. if (length) {
  2301. stream.node.timestamp = Date.now();
  2302. }
  2303. return i;
  2304. }});
  2305. return FS.mkdev(path, mode, dev);
  2306. }, forceLoadFile: function(obj) {
  2307. if (obj.isDevice || obj.isFolder || obj.link || obj.contents)
  2308. return true;
  2309. if (typeof XMLHttpRequest !== "undefined") {
  2310. throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
  2311. } else if (read_) {
  2312. try {
  2313. obj.contents = intArrayFromString(read_(obj.url), true);
  2314. obj.usedBytes = obj.contents.length;
  2315. } catch (e) {
  2316. throw new FS.ErrnoError(29);
  2317. }
  2318. } else {
  2319. throw new Error("Cannot load without read() or XMLHttpRequest.");
  2320. }
  2321. }, createLazyFile: function(parent, name, url, canRead, canWrite) {
  2322. function LazyUint8Array() {
  2323. this.lengthKnown = false;
  2324. this.chunks = [];
  2325. }
  2326. LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  2327. if (idx > this.length - 1 || idx < 0) {
  2328. return void 0;
  2329. }
  2330. var chunkOffset = idx % this.chunkSize;
  2331. var chunkNum = idx / this.chunkSize | 0;
  2332. return this.getter(chunkNum)[chunkOffset];
  2333. };
  2334. LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) {
  2335. this.getter = getter;
  2336. };
  2337. LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  2338. var xhr = new XMLHttpRequest();
  2339. xhr.open("HEAD", url, false);
  2340. xhr.send(null);
  2341. if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304))
  2342. throw new Error("Couldn't load " + url + ". Status: " + xhr.status);
  2343. var datalength = Number(xhr.getResponseHeader("Content-length"));
  2344. var header;
  2345. var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes";
  2346. var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip";
  2347. var chunkSize = 1024 * 1024;
  2348. if (!hasByteServing)
  2349. chunkSize = datalength;
  2350. var doXHR = function(from, to) {
  2351. if (from > to)
  2352. throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!");
  2353. if (to > datalength - 1)
  2354. throw new Error("only " + datalength + " bytes available! programmer error!");
  2355. var xhr2 = new XMLHttpRequest();
  2356. xhr2.open("GET", url, false);
  2357. if (datalength !== chunkSize)
  2358. xhr2.setRequestHeader("Range", "bytes=" + from + "-" + to);
  2359. if (typeof Uint8Array != "undefined")
  2360. xhr2.responseType = "arraybuffer";
  2361. if (xhr2.overrideMimeType) {
  2362. xhr2.overrideMimeType("text/plain; charset=x-user-defined");
  2363. }
  2364. xhr2.send(null);
  2365. if (!(xhr2.status >= 200 && xhr2.status < 300 || xhr2.status === 304))
  2366. throw new Error("Couldn't load " + url + ". Status: " + xhr2.status);
  2367. if (xhr2.response !== void 0) {
  2368. return new Uint8Array(xhr2.response || []);
  2369. } else {
  2370. return intArrayFromString(xhr2.responseText || "", true);
  2371. }
  2372. };
  2373. var lazyArray2 = this;
  2374. lazyArray2.setDataGetter(function(chunkNum) {
  2375. var start = chunkNum * chunkSize;
  2376. var end = (chunkNum + 1) * chunkSize - 1;
  2377. end = Math.min(end, datalength - 1);
  2378. if (typeof lazyArray2.chunks[chunkNum] === "undefined") {
  2379. lazyArray2.chunks[chunkNum] = doXHR(start, end);
  2380. }
  2381. if (typeof lazyArray2.chunks[chunkNum] === "undefined")
  2382. throw new Error("doXHR failed!");
  2383. return lazyArray2.chunks[chunkNum];
  2384. });
  2385. if (usesGzip || !datalength) {
  2386. chunkSize = datalength = 1;
  2387. datalength = this.getter(0).length;
  2388. chunkSize = datalength;
  2389. out("LazyFiles on gzip forces download of the whole file when length is accessed");
  2390. }
  2391. this._length = datalength;
  2392. this._chunkSize = chunkSize;
  2393. this.lengthKnown = true;
  2394. };
  2395. if (typeof XMLHttpRequest !== "undefined") {
  2396. if (!ENVIRONMENT_IS_WORKER)
  2397. throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
  2398. var lazyArray = new LazyUint8Array();
  2399. Object.defineProperties(lazyArray, {length: {get: function() {
  2400. if (!this.lengthKnown) {
  2401. this.cacheLength();
  2402. }
  2403. return this._length;
  2404. }}, chunkSize: {get: function() {
  2405. if (!this.lengthKnown) {
  2406. this.cacheLength();
  2407. }
  2408. return this._chunkSize;
  2409. }}});
  2410. var properties = {isDevice: false, contents: lazyArray};
  2411. } else {
  2412. var properties = {isDevice: false, url};
  2413. }
  2414. var node = FS.createFile(parent, name, properties, canRead, canWrite);
  2415. if (properties.contents) {
  2416. node.contents = properties.contents;
  2417. } else if (properties.url) {
  2418. node.contents = null;
  2419. node.url = properties.url;
  2420. }
  2421. Object.defineProperties(node, {usedBytes: {get: function() {
  2422. return this.contents.length;
  2423. }}});
  2424. var stream_ops = {};
  2425. var keys = Object.keys(node.stream_ops);
  2426. keys.forEach(function(key2) {
  2427. var fn = node.stream_ops[key2];
  2428. stream_ops[key2] = function forceLoadLazyFile() {
  2429. FS.forceLoadFile(node);
  2430. return fn.apply(null, arguments);
  2431. };
  2432. });
  2433. stream_ops.read = function stream_ops_read(stream, buffer2, offset, length, position) {
  2434. FS.forceLoadFile(node);
  2435. var contents = stream.node.contents;
  2436. if (position >= contents.length)
  2437. return 0;
  2438. var size = Math.min(contents.length - position, length);
  2439. if (contents.slice) {
  2440. for (var i = 0; i < size; i++) {
  2441. buffer2[offset + i] = contents[position + i];
  2442. }
  2443. } else {
  2444. for (var i = 0; i < size; i++) {
  2445. buffer2[offset + i] = contents.get(position + i);
  2446. }
  2447. }
  2448. return size;
  2449. };
  2450. node.stream_ops = stream_ops;
  2451. return node;
  2452. }, createPreloadedFile: function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) {
  2453. Browser.init();
  2454. var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent;
  2455. var dep = getUniqueRunDependency("cp " + fullname);
  2456. function processData(byteArray) {
  2457. function finish(byteArray2) {
  2458. if (preFinish)
  2459. preFinish();
  2460. if (!dontCreateFile) {
  2461. FS.createDataFile(parent, name, byteArray2, canRead, canWrite, canOwn);
  2462. }
  2463. if (onload)
  2464. onload();
  2465. removeRunDependency(dep);
  2466. }
  2467. var handled = false;
  2468. Module["preloadPlugins"].forEach(function(plugin) {
  2469. if (handled)
  2470. return;
  2471. if (plugin["canHandle"](fullname)) {
  2472. plugin["handle"](byteArray, fullname, finish, function() {
  2473. if (onerror)
  2474. onerror();
  2475. removeRunDependency(dep);
  2476. });
  2477. handled = true;
  2478. }
  2479. });
  2480. if (!handled)
  2481. finish(byteArray);
  2482. }
  2483. addRunDependency(dep);
  2484. if (typeof url == "string") {
  2485. Browser.asyncLoad(url, function(byteArray) {
  2486. processData(byteArray);
  2487. }, onerror);
  2488. } else {
  2489. processData(url);
  2490. }
  2491. }, indexedDB: function() {
  2492. return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
  2493. }, DB_NAME: function() {
  2494. return "EM_FS_" + window.location.pathname;
  2495. }, DB_VERSION: 20, DB_STORE_NAME: "FILE_DATA", saveFilesToDB: function(paths, onload, onerror) {
  2496. onload = onload || function() {
  2497. };
  2498. onerror = onerror || function() {
  2499. };
  2500. var indexedDB = FS.indexedDB();
  2501. try {
  2502. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  2503. } catch (e) {
  2504. return onerror(e);
  2505. }
  2506. openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  2507. out("creating db");
  2508. var db = openRequest.result;
  2509. db.createObjectStore(FS.DB_STORE_NAME);
  2510. };
  2511. openRequest.onsuccess = function openRequest_onsuccess() {
  2512. var db = openRequest.result;
  2513. var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite");
  2514. var files = transaction.objectStore(FS.DB_STORE_NAME);
  2515. var ok = 0, fail = 0, total = paths.length;
  2516. function finish() {
  2517. if (fail == 0)
  2518. onload();
  2519. else
  2520. onerror();
  2521. }
  2522. paths.forEach(function(path) {
  2523. var putRequest = files.put(FS.analyzePath(path).object.contents, path);
  2524. putRequest.onsuccess = function putRequest_onsuccess() {
  2525. ok++;
  2526. if (ok + fail == total)
  2527. finish();
  2528. };
  2529. putRequest.onerror = function putRequest_onerror() {
  2530. fail++;
  2531. if (ok + fail == total)
  2532. finish();
  2533. };
  2534. });
  2535. transaction.onerror = onerror;
  2536. };
  2537. openRequest.onerror = onerror;
  2538. }, loadFilesFromDB: function(paths, onload, onerror) {
  2539. onload = onload || function() {
  2540. };
  2541. onerror = onerror || function() {
  2542. };
  2543. var indexedDB = FS.indexedDB();
  2544. try {
  2545. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION);
  2546. } catch (e) {
  2547. return onerror(e);
  2548. }
  2549. openRequest.onupgradeneeded = onerror;
  2550. openRequest.onsuccess = function openRequest_onsuccess() {
  2551. var db = openRequest.result;
  2552. try {
  2553. var transaction = db.transaction([FS.DB_STORE_NAME], "readonly");
  2554. } catch (e) {
  2555. onerror(e);
  2556. return;
  2557. }
  2558. var files = transaction.objectStore(FS.DB_STORE_NAME);
  2559. var ok = 0, fail = 0, total = paths.length;
  2560. function finish() {
  2561. if (fail == 0)
  2562. onload();
  2563. else
  2564. onerror();
  2565. }
  2566. paths.forEach(function(path) {
  2567. var getRequest = files.get(path);
  2568. getRequest.onsuccess = function getRequest_onsuccess() {
  2569. if (FS.analyzePath(path).exists) {
  2570. FS.unlink(path);
  2571. }
  2572. FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true);
  2573. ok++;
  2574. if (ok + fail == total)
  2575. finish();
  2576. };
  2577. getRequest.onerror = function getRequest_onerror() {
  2578. fail++;
  2579. if (ok + fail == total)
  2580. finish();
  2581. };
  2582. });
  2583. transaction.onerror = onerror;
  2584. };
  2585. openRequest.onerror = onerror;
  2586. }};
  2587. var SYSCALLS = {mappings: {}, DEFAULT_POLLMASK: 5, umask: 511, calculateAt: function(dirfd, path) {
  2588. if (path[0] !== "/") {
  2589. var dir;
  2590. if (dirfd === -100) {
  2591. dir = FS.cwd();
  2592. } else {
  2593. var dirstream = FS.getStream(dirfd);
  2594. if (!dirstream)
  2595. throw new FS.ErrnoError(8);
  2596. dir = dirstream.path;
  2597. }
  2598. path = PATH.join2(dir, path);
  2599. }
  2600. return path;
  2601. }, doStat: function(func, path, buf) {
  2602. try {
  2603. var stat = func(path);
  2604. } catch (e) {
  2605. if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) {
  2606. return -54;
  2607. }
  2608. throw e;
  2609. }
  2610. HEAP32[buf >> 2] = stat.dev;
  2611. HEAP32[buf + 4 >> 2] = 0;
  2612. HEAP32[buf + 8 >> 2] = stat.ino;
  2613. HEAP32[buf + 12 >> 2] = stat.mode;
  2614. HEAP32[buf + 16 >> 2] = stat.nlink;
  2615. HEAP32[buf + 20 >> 2] = stat.uid;
  2616. HEAP32[buf + 24 >> 2] = stat.gid;
  2617. HEAP32[buf + 28 >> 2] = stat.rdev;
  2618. HEAP32[buf + 32 >> 2] = 0;
  2619. tempI64 = [stat.size >>> 0, (tempDouble = stat.size, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 40 >> 2] = tempI64[0], HEAP32[buf + 44 >> 2] = tempI64[1];
  2620. HEAP32[buf + 48 >> 2] = 4096;
  2621. HEAP32[buf + 52 >> 2] = stat.blocks;
  2622. HEAP32[buf + 56 >> 2] = stat.atime.getTime() / 1e3 | 0;
  2623. HEAP32[buf + 60 >> 2] = 0;
  2624. HEAP32[buf + 64 >> 2] = stat.mtime.getTime() / 1e3 | 0;
  2625. HEAP32[buf + 68 >> 2] = 0;
  2626. HEAP32[buf + 72 >> 2] = stat.ctime.getTime() / 1e3 | 0;
  2627. HEAP32[buf + 76 >> 2] = 0;
  2628. tempI64 = [stat.ino >>> 0, (tempDouble = stat.ino, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 80 >> 2] = tempI64[0], HEAP32[buf + 84 >> 2] = tempI64[1];
  2629. return 0;
  2630. }, doMsync: function(addr, stream, len, flags, offset) {
  2631. var buffer2 = HEAPU8.slice(addr, addr + len);
  2632. FS.msync(stream, buffer2, offset, len, flags);
  2633. }, doMkdir: function(path, mode) {
  2634. path = PATH.normalize(path);
  2635. if (path[path.length - 1] === "/")
  2636. path = path.substr(0, path.length - 1);
  2637. FS.mkdir(path, mode, 0);
  2638. return 0;
  2639. }, doMknod: function(path, mode, dev) {
  2640. switch (mode & 61440) {
  2641. case 32768:
  2642. case 8192:
  2643. case 24576:
  2644. case 4096:
  2645. case 49152:
  2646. break;
  2647. default:
  2648. return -28;
  2649. }
  2650. FS.mknod(path, mode, dev);
  2651. return 0;
  2652. }, doReadlink: function(path, buf, bufsize) {
  2653. if (bufsize <= 0)
  2654. return -28;
  2655. var ret = FS.readlink(path);
  2656. var len = Math.min(bufsize, lengthBytesUTF8(ret));
  2657. var endChar = HEAP8[buf + len];
  2658. stringToUTF8(ret, buf, bufsize + 1);
  2659. HEAP8[buf + len] = endChar;
  2660. return len;
  2661. }, doAccess: function(path, amode) {
  2662. if (amode & ~7) {
  2663. return -28;
  2664. }
  2665. var node;
  2666. var lookup = FS.lookupPath(path, {follow: true});
  2667. node = lookup.node;
  2668. if (!node) {
  2669. return -44;
  2670. }
  2671. var perms = "";
  2672. if (amode & 4)
  2673. perms += "r";
  2674. if (amode & 2)
  2675. perms += "w";
  2676. if (amode & 1)
  2677. perms += "x";
  2678. if (perms && FS.nodePermissions(node, perms)) {
  2679. return -2;
  2680. }
  2681. return 0;
  2682. }, doDup: function(path, flags, suggestFD) {
  2683. var suggest = FS.getStream(suggestFD);
  2684. if (suggest)
  2685. FS.close(suggest);
  2686. return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
  2687. }, doReadv: function(stream, iov, iovcnt, offset) {
  2688. var ret = 0;
  2689. for (var i = 0; i < iovcnt; i++) {
  2690. var ptr = HEAP32[iov + i * 8 >> 2];
  2691. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  2692. var curr = FS.read(stream, HEAP8, ptr, len, offset);
  2693. if (curr < 0)
  2694. return -1;
  2695. ret += curr;
  2696. if (curr < len)
  2697. break;
  2698. }
  2699. return ret;
  2700. }, doWritev: function(stream, iov, iovcnt, offset) {
  2701. var ret = 0;
  2702. for (var i = 0; i < iovcnt; i++) {
  2703. var ptr = HEAP32[iov + i * 8 >> 2];
  2704. var len = HEAP32[iov + (i * 8 + 4) >> 2];
  2705. var curr = FS.write(stream, HEAP8, ptr, len, offset);
  2706. if (curr < 0)
  2707. return -1;
  2708. ret += curr;
  2709. }
  2710. return ret;
  2711. }, varargs: void 0, get: function() {
  2712. SYSCALLS.varargs += 4;
  2713. var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
  2714. return ret;
  2715. }, getStr: function(ptr) {
  2716. var ret = UTF8ToString(ptr);
  2717. return ret;
  2718. }, getStreamFromFD: function(fd) {
  2719. var stream = FS.getStream(fd);
  2720. if (!stream)
  2721. throw new FS.ErrnoError(8);
  2722. return stream;
  2723. }, get64: function(low, high) {
  2724. return low;
  2725. }};
  2726. function ___sys_ioctl(fd, op, varargs) {
  2727. SYSCALLS.varargs = varargs;
  2728. try {
  2729. var stream = SYSCALLS.getStreamFromFD(fd);
  2730. switch (op) {
  2731. case 21509:
  2732. case 21505: {
  2733. if (!stream.tty)
  2734. return -59;
  2735. return 0;
  2736. }
  2737. case 21510:
  2738. case 21511:
  2739. case 21512:
  2740. case 21506:
  2741. case 21507:
  2742. case 21508: {
  2743. if (!stream.tty)
  2744. return -59;
  2745. return 0;
  2746. }
  2747. case 21519: {
  2748. if (!stream.tty)
  2749. return -59;
  2750. var argp = SYSCALLS.get();
  2751. HEAP32[argp >> 2] = 0;
  2752. return 0;
  2753. }
  2754. case 21520: {
  2755. if (!stream.tty)
  2756. return -59;
  2757. return -28;
  2758. }
  2759. case 21531: {
  2760. var argp = SYSCALLS.get();
  2761. return FS.ioctl(stream, op, argp);
  2762. }
  2763. case 21523: {
  2764. if (!stream.tty)
  2765. return -59;
  2766. return 0;
  2767. }
  2768. case 21524: {
  2769. if (!stream.tty)
  2770. return -59;
  2771. return 0;
  2772. }
  2773. default:
  2774. abort("bad ioctl syscall " + op);
  2775. }
  2776. } catch (e) {
  2777. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  2778. abort(e);
  2779. return -e.errno;
  2780. }
  2781. }
  2782. function ___sys_open(path, flags, varargs) {
  2783. SYSCALLS.varargs = varargs;
  2784. try {
  2785. var pathname = SYSCALLS.getStr(path);
  2786. var mode = SYSCALLS.get();
  2787. var stream = FS.open(pathname, flags, mode);
  2788. return stream.fd;
  2789. } catch (e) {
  2790. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  2791. abort(e);
  2792. return -e.errno;
  2793. }
  2794. }
  2795. var tupleRegistrations = {};
  2796. function runDestructors(destructors) {
  2797. while (destructors.length) {
  2798. var ptr = destructors.pop();
  2799. var del = destructors.pop();
  2800. del(ptr);
  2801. }
  2802. }
  2803. function simpleReadValueFromPointer(pointer) {
  2804. return this["fromWireType"](HEAPU32[pointer >> 2]);
  2805. }
  2806. var awaitingDependencies = {};
  2807. var registeredTypes = {};
  2808. var typeDependencies = {};
  2809. var char_0 = 48;
  2810. var char_9 = 57;
  2811. function makeLegalFunctionName(name) {
  2812. if (name === void 0) {
  2813. return "_unknown";
  2814. }
  2815. name = name.replace(/[^a-zA-Z0-9_]/g, "$");
  2816. var f = name.charCodeAt(0);
  2817. if (f >= char_0 && f <= char_9) {
  2818. return "_" + name;
  2819. } else {
  2820. return name;
  2821. }
  2822. }
  2823. function createNamedFunction(name, body) {
  2824. name = makeLegalFunctionName(name);
  2825. return new Function("body", "return function " + name + '() {\n "use strict"; return body.apply(this, arguments);\n};\n')(body);
  2826. }
  2827. function extendError(baseErrorType, errorName) {
  2828. var errorClass = createNamedFunction(errorName, function(message) {
  2829. this.name = errorName;
  2830. this.message = message;
  2831. var stack = new Error(message).stack;
  2832. if (stack !== void 0) {
  2833. this.stack = this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, "");
  2834. }
  2835. });
  2836. errorClass.prototype = Object.create(baseErrorType.prototype);
  2837. errorClass.prototype.constructor = errorClass;
  2838. errorClass.prototype.toString = function() {
  2839. if (this.message === void 0) {
  2840. return this.name;
  2841. } else {
  2842. return this.name + ": " + this.message;
  2843. }
  2844. };
  2845. return errorClass;
  2846. }
  2847. var InternalError = void 0;
  2848. function throwInternalError(message) {
  2849. throw new InternalError(message);
  2850. }
  2851. function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) {
  2852. myTypes.forEach(function(type) {
  2853. typeDependencies[type] = dependentTypes;
  2854. });
  2855. function onComplete(typeConverters2) {
  2856. var myTypeConverters = getTypeConverters(typeConverters2);
  2857. if (myTypeConverters.length !== myTypes.length) {
  2858. throwInternalError("Mismatched type converter count");
  2859. }
  2860. for (var i = 0; i < myTypes.length; ++i) {
  2861. registerType(myTypes[i], myTypeConverters[i]);
  2862. }
  2863. }
  2864. var typeConverters = new Array(dependentTypes.length);
  2865. var unregisteredTypes = [];
  2866. var registered = 0;
  2867. dependentTypes.forEach(function(dt, i) {
  2868. if (registeredTypes.hasOwnProperty(dt)) {
  2869. typeConverters[i] = registeredTypes[dt];
  2870. } else {
  2871. unregisteredTypes.push(dt);
  2872. if (!awaitingDependencies.hasOwnProperty(dt)) {
  2873. awaitingDependencies[dt] = [];
  2874. }
  2875. awaitingDependencies[dt].push(function() {
  2876. typeConverters[i] = registeredTypes[dt];
  2877. ++registered;
  2878. if (registered === unregisteredTypes.length) {
  2879. onComplete(typeConverters);
  2880. }
  2881. });
  2882. }
  2883. });
  2884. if (unregisteredTypes.length === 0) {
  2885. onComplete(typeConverters);
  2886. }
  2887. }
  2888. function __embind_finalize_value_array(rawTupleType) {
  2889. var reg = tupleRegistrations[rawTupleType];
  2890. delete tupleRegistrations[rawTupleType];
  2891. var elements = reg.elements;
  2892. var elementsLength = elements.length;
  2893. var elementTypes = elements.map(function(elt) {
  2894. return elt.getterReturnType;
  2895. }).concat(elements.map(function(elt) {
  2896. return elt.setterArgumentType;
  2897. }));
  2898. var rawConstructor = reg.rawConstructor;
  2899. var rawDestructor = reg.rawDestructor;
  2900. whenDependentTypesAreResolved([rawTupleType], elementTypes, function(elementTypes2) {
  2901. elements.forEach(function(elt, i) {
  2902. var getterReturnType = elementTypes2[i];
  2903. var getter = elt.getter;
  2904. var getterContext = elt.getterContext;
  2905. var setterArgumentType = elementTypes2[i + elementsLength];
  2906. var setter = elt.setter;
  2907. var setterContext = elt.setterContext;
  2908. elt.read = function(ptr) {
  2909. return getterReturnType["fromWireType"](getter(getterContext, ptr));
  2910. };
  2911. elt.write = function(ptr, o) {
  2912. var destructors = [];
  2913. setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o));
  2914. runDestructors(destructors);
  2915. };
  2916. });
  2917. return [{name: reg.name, fromWireType: function(ptr) {
  2918. var rv = new Array(elementsLength);
  2919. for (var i = 0; i < elementsLength; ++i) {
  2920. rv[i] = elements[i].read(ptr);
  2921. }
  2922. rawDestructor(ptr);
  2923. return rv;
  2924. }, toWireType: function(destructors, o) {
  2925. if (elementsLength !== o.length) {
  2926. throw new TypeError("Incorrect number of tuple elements for " + reg.name + ": expected=" + elementsLength + ", actual=" + o.length);
  2927. }
  2928. var ptr = rawConstructor();
  2929. for (var i = 0; i < elementsLength; ++i) {
  2930. elements[i].write(ptr, o[i]);
  2931. }
  2932. if (destructors !== null) {
  2933. destructors.push(rawDestructor, ptr);
  2934. }
  2935. return ptr;
  2936. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: rawDestructor}];
  2937. });
  2938. }
  2939. var structRegistrations = {};
  2940. function __embind_finalize_value_object(structType) {
  2941. var reg = structRegistrations[structType];
  2942. delete structRegistrations[structType];
  2943. var rawConstructor = reg.rawConstructor;
  2944. var rawDestructor = reg.rawDestructor;
  2945. var fieldRecords = reg.fields;
  2946. var fieldTypes = fieldRecords.map(function(field) {
  2947. return field.getterReturnType;
  2948. }).concat(fieldRecords.map(function(field) {
  2949. return field.setterArgumentType;
  2950. }));
  2951. whenDependentTypesAreResolved([structType], fieldTypes, function(fieldTypes2) {
  2952. var fields = {};
  2953. fieldRecords.forEach(function(field, i) {
  2954. var fieldName = field.fieldName;
  2955. var getterReturnType = fieldTypes2[i];
  2956. var getter = field.getter;
  2957. var getterContext = field.getterContext;
  2958. var setterArgumentType = fieldTypes2[i + fieldRecords.length];
  2959. var setter = field.setter;
  2960. var setterContext = field.setterContext;
  2961. fields[fieldName] = {read: function(ptr) {
  2962. return getterReturnType["fromWireType"](getter(getterContext, ptr));
  2963. }, write: function(ptr, o) {
  2964. var destructors = [];
  2965. setter(setterContext, ptr, setterArgumentType["toWireType"](destructors, o));
  2966. runDestructors(destructors);
  2967. }};
  2968. });
  2969. return [{name: reg.name, fromWireType: function(ptr) {
  2970. var rv = {};
  2971. for (var i in fields) {
  2972. rv[i] = fields[i].read(ptr);
  2973. }
  2974. rawDestructor(ptr);
  2975. return rv;
  2976. }, toWireType: function(destructors, o) {
  2977. for (var fieldName in fields) {
  2978. if (!(fieldName in o)) {
  2979. throw new TypeError('Missing field: "' + fieldName + '"');
  2980. }
  2981. }
  2982. var ptr = rawConstructor();
  2983. for (fieldName in fields) {
  2984. fields[fieldName].write(ptr, o[fieldName]);
  2985. }
  2986. if (destructors !== null) {
  2987. destructors.push(rawDestructor, ptr);
  2988. }
  2989. return ptr;
  2990. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: rawDestructor}];
  2991. });
  2992. }
  2993. function getShiftFromSize(size) {
  2994. switch (size) {
  2995. case 1:
  2996. return 0;
  2997. case 2:
  2998. return 1;
  2999. case 4:
  3000. return 2;
  3001. case 8:
  3002. return 3;
  3003. default:
  3004. throw new TypeError("Unknown type size: " + size);
  3005. }
  3006. }
  3007. function embind_init_charCodes() {
  3008. var codes = new Array(256);
  3009. for (var i = 0; i < 256; ++i) {
  3010. codes[i] = String.fromCharCode(i);
  3011. }
  3012. embind_charCodes = codes;
  3013. }
  3014. var embind_charCodes = void 0;
  3015. function readLatin1String(ptr) {
  3016. var ret = "";
  3017. var c = ptr;
  3018. while (HEAPU8[c]) {
  3019. ret += embind_charCodes[HEAPU8[c++]];
  3020. }
  3021. return ret;
  3022. }
  3023. var BindingError = void 0;
  3024. function throwBindingError(message) {
  3025. throw new BindingError(message);
  3026. }
  3027. function registerType(rawType, registeredInstance, options) {
  3028. options = options || {};
  3029. if (!("argPackAdvance" in registeredInstance)) {
  3030. throw new TypeError("registerType registeredInstance requires argPackAdvance");
  3031. }
  3032. var name = registeredInstance.name;
  3033. if (!rawType) {
  3034. throwBindingError('type "' + name + '" must have a positive integer typeid pointer');
  3035. }
  3036. if (registeredTypes.hasOwnProperty(rawType)) {
  3037. if (options.ignoreDuplicateRegistrations) {
  3038. return;
  3039. } else {
  3040. throwBindingError("Cannot register type '" + name + "' twice");
  3041. }
  3042. }
  3043. registeredTypes[rawType] = registeredInstance;
  3044. delete typeDependencies[rawType];
  3045. if (awaitingDependencies.hasOwnProperty(rawType)) {
  3046. var callbacks = awaitingDependencies[rawType];
  3047. delete awaitingDependencies[rawType];
  3048. callbacks.forEach(function(cb) {
  3049. cb();
  3050. });
  3051. }
  3052. }
  3053. function __embind_register_bool(rawType, name, size, trueValue, falseValue) {
  3054. var shift = getShiftFromSize(size);
  3055. name = readLatin1String(name);
  3056. registerType(rawType, {name, fromWireType: function(wt) {
  3057. return !!wt;
  3058. }, toWireType: function(destructors, o) {
  3059. return o ? trueValue : falseValue;
  3060. }, argPackAdvance: 8, readValueFromPointer: function(pointer) {
  3061. var heap;
  3062. if (size === 1) {
  3063. heap = HEAP8;
  3064. } else if (size === 2) {
  3065. heap = HEAP16;
  3066. } else if (size === 4) {
  3067. heap = HEAP32;
  3068. } else {
  3069. throw new TypeError("Unknown boolean type size: " + name);
  3070. }
  3071. return this["fromWireType"](heap[pointer >> shift]);
  3072. }, destructorFunction: null});
  3073. }
  3074. function ClassHandle_isAliasOf(other) {
  3075. if (!(this instanceof ClassHandle)) {
  3076. return false;
  3077. }
  3078. if (!(other instanceof ClassHandle)) {
  3079. return false;
  3080. }
  3081. var leftClass = this.$$.ptrType.registeredClass;
  3082. var left = this.$$.ptr;
  3083. var rightClass = other.$$.ptrType.registeredClass;
  3084. var right = other.$$.ptr;
  3085. while (leftClass.baseClass) {
  3086. left = leftClass.upcast(left);
  3087. leftClass = leftClass.baseClass;
  3088. }
  3089. while (rightClass.baseClass) {
  3090. right = rightClass.upcast(right);
  3091. rightClass = rightClass.baseClass;
  3092. }
  3093. return leftClass === rightClass && left === right;
  3094. }
  3095. function shallowCopyInternalPointer(o) {
  3096. return {count: o.count, deleteScheduled: o.deleteScheduled, preservePointerOnDelete: o.preservePointerOnDelete, ptr: o.ptr, ptrType: o.ptrType, smartPtr: o.smartPtr, smartPtrType: o.smartPtrType};
  3097. }
  3098. function throwInstanceAlreadyDeleted(obj) {
  3099. function getInstanceTypeName(handle) {
  3100. return handle.$$.ptrType.registeredClass.name;
  3101. }
  3102. throwBindingError(getInstanceTypeName(obj) + " instance already deleted");
  3103. }
  3104. var finalizationGroup = false;
  3105. function detachFinalizer(handle) {
  3106. }
  3107. function runDestructor($$) {
  3108. if ($$.smartPtr) {
  3109. $$.smartPtrType.rawDestructor($$.smartPtr);
  3110. } else {
  3111. $$.ptrType.registeredClass.rawDestructor($$.ptr);
  3112. }
  3113. }
  3114. function releaseClassHandle($$) {
  3115. $$.count.value -= 1;
  3116. var toDelete = $$.count.value === 0;
  3117. if (toDelete) {
  3118. runDestructor($$);
  3119. }
  3120. }
  3121. function attachFinalizer(handle) {
  3122. if (typeof FinalizationGroup === "undefined") {
  3123. attachFinalizer = function(handle2) {
  3124. return handle2;
  3125. };
  3126. return handle;
  3127. }
  3128. finalizationGroup = new FinalizationGroup(function(iter) {
  3129. for (var result = iter.next(); !result.done; result = iter.next()) {
  3130. var $$ = result.value;
  3131. if (!$$.ptr) {
  3132. console.warn("object already deleted: " + $$.ptr);
  3133. } else {
  3134. releaseClassHandle($$);
  3135. }
  3136. }
  3137. });
  3138. attachFinalizer = function(handle2) {
  3139. finalizationGroup.register(handle2, handle2.$$, handle2.$$);
  3140. return handle2;
  3141. };
  3142. detachFinalizer = function(handle2) {
  3143. finalizationGroup.unregister(handle2.$$);
  3144. };
  3145. return attachFinalizer(handle);
  3146. }
  3147. function ClassHandle_clone() {
  3148. if (!this.$$.ptr) {
  3149. throwInstanceAlreadyDeleted(this);
  3150. }
  3151. if (this.$$.preservePointerOnDelete) {
  3152. this.$$.count.value += 1;
  3153. return this;
  3154. } else {
  3155. var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), {$$: {value: shallowCopyInternalPointer(this.$$)}}));
  3156. clone.$$.count.value += 1;
  3157. clone.$$.deleteScheduled = false;
  3158. return clone;
  3159. }
  3160. }
  3161. function ClassHandle_delete() {
  3162. if (!this.$$.ptr) {
  3163. throwInstanceAlreadyDeleted(this);
  3164. }
  3165. if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
  3166. throwBindingError("Object already scheduled for deletion");
  3167. }
  3168. detachFinalizer(this);
  3169. releaseClassHandle(this.$$);
  3170. if (!this.$$.preservePointerOnDelete) {
  3171. this.$$.smartPtr = void 0;
  3172. this.$$.ptr = void 0;
  3173. }
  3174. }
  3175. function ClassHandle_isDeleted() {
  3176. return !this.$$.ptr;
  3177. }
  3178. var delayFunction = void 0;
  3179. var deletionQueue = [];
  3180. function flushPendingDeletes() {
  3181. while (deletionQueue.length) {
  3182. var obj = deletionQueue.pop();
  3183. obj.$$.deleteScheduled = false;
  3184. obj["delete"]();
  3185. }
  3186. }
  3187. function ClassHandle_deleteLater() {
  3188. if (!this.$$.ptr) {
  3189. throwInstanceAlreadyDeleted(this);
  3190. }
  3191. if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
  3192. throwBindingError("Object already scheduled for deletion");
  3193. }
  3194. deletionQueue.push(this);
  3195. if (deletionQueue.length === 1 && delayFunction) {
  3196. delayFunction(flushPendingDeletes);
  3197. }
  3198. this.$$.deleteScheduled = true;
  3199. return this;
  3200. }
  3201. function init_ClassHandle() {
  3202. ClassHandle.prototype["isAliasOf"] = ClassHandle_isAliasOf;
  3203. ClassHandle.prototype["clone"] = ClassHandle_clone;
  3204. ClassHandle.prototype["delete"] = ClassHandle_delete;
  3205. ClassHandle.prototype["isDeleted"] = ClassHandle_isDeleted;
  3206. ClassHandle.prototype["deleteLater"] = ClassHandle_deleteLater;
  3207. }
  3208. function ClassHandle() {
  3209. }
  3210. var registeredPointers = {};
  3211. function ensureOverloadTable(proto, methodName, humanName) {
  3212. if (proto[methodName].overloadTable === void 0) {
  3213. var prevFunc = proto[methodName];
  3214. proto[methodName] = function() {
  3215. if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) {
  3216. throwBindingError("Function '" + humanName + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + proto[methodName].overloadTable + ")!");
  3217. }
  3218. return proto[methodName].overloadTable[arguments.length].apply(this, arguments);
  3219. };
  3220. proto[methodName].overloadTable = [];
  3221. proto[methodName].overloadTable[prevFunc.argCount] = prevFunc;
  3222. }
  3223. }
  3224. function exposePublicSymbol(name, value, numArguments) {
  3225. if (Module.hasOwnProperty(name)) {
  3226. if (numArguments === void 0 || Module[name].overloadTable !== void 0 && Module[name].overloadTable[numArguments] !== void 0) {
  3227. throwBindingError("Cannot register public name '" + name + "' twice");
  3228. }
  3229. ensureOverloadTable(Module, name, name);
  3230. if (Module.hasOwnProperty(numArguments)) {
  3231. throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + numArguments + ")!");
  3232. }
  3233. Module[name].overloadTable[numArguments] = value;
  3234. } else {
  3235. Module[name] = value;
  3236. if (numArguments !== void 0) {
  3237. Module[name].numArguments = numArguments;
  3238. }
  3239. }
  3240. }
  3241. function RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) {
  3242. this.name = name;
  3243. this.constructor = constructor;
  3244. this.instancePrototype = instancePrototype;
  3245. this.rawDestructor = rawDestructor;
  3246. this.baseClass = baseClass;
  3247. this.getActualType = getActualType;
  3248. this.upcast = upcast;
  3249. this.downcast = downcast;
  3250. this.pureVirtualFunctions = [];
  3251. }
  3252. function upcastPointer(ptr, ptrClass, desiredClass) {
  3253. while (ptrClass !== desiredClass) {
  3254. if (!ptrClass.upcast) {
  3255. throwBindingError("Expected null or instance of " + desiredClass.name + ", got an instance of " + ptrClass.name);
  3256. }
  3257. ptr = ptrClass.upcast(ptr);
  3258. ptrClass = ptrClass.baseClass;
  3259. }
  3260. return ptr;
  3261. }
  3262. function constNoSmartPtrRawPointerToWireType(destructors, handle) {
  3263. if (handle === null) {
  3264. if (this.isReference) {
  3265. throwBindingError("null is not a valid " + this.name);
  3266. }
  3267. return 0;
  3268. }
  3269. if (!handle.$$) {
  3270. throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
  3271. }
  3272. if (!handle.$$.ptr) {
  3273. throwBindingError("Cannot pass deleted object as a pointer of type " + this.name);
  3274. }
  3275. var handleClass = handle.$$.ptrType.registeredClass;
  3276. var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  3277. return ptr;
  3278. }
  3279. function genericPointerToWireType(destructors, handle) {
  3280. var ptr;
  3281. if (handle === null) {
  3282. if (this.isReference) {
  3283. throwBindingError("null is not a valid " + this.name);
  3284. }
  3285. if (this.isSmartPointer) {
  3286. ptr = this.rawConstructor();
  3287. if (destructors !== null) {
  3288. destructors.push(this.rawDestructor, ptr);
  3289. }
  3290. return ptr;
  3291. } else {
  3292. return 0;
  3293. }
  3294. }
  3295. if (!handle.$$) {
  3296. throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
  3297. }
  3298. if (!handle.$$.ptr) {
  3299. throwBindingError("Cannot pass deleted object as a pointer of type " + this.name);
  3300. }
  3301. if (!this.isConst && handle.$$.ptrType.isConst) {
  3302. throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name);
  3303. }
  3304. var handleClass = handle.$$.ptrType.registeredClass;
  3305. ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  3306. if (this.isSmartPointer) {
  3307. if (handle.$$.smartPtr === void 0) {
  3308. throwBindingError("Passing raw pointer to smart pointer is illegal");
  3309. }
  3310. switch (this.sharingPolicy) {
  3311. case 0:
  3312. if (handle.$$.smartPtrType === this) {
  3313. ptr = handle.$$.smartPtr;
  3314. } else {
  3315. throwBindingError("Cannot convert argument of type " + (handle.$$.smartPtrType ? handle.$$.smartPtrType.name : handle.$$.ptrType.name) + " to parameter type " + this.name);
  3316. }
  3317. break;
  3318. case 1:
  3319. ptr = handle.$$.smartPtr;
  3320. break;
  3321. case 2:
  3322. if (handle.$$.smartPtrType === this) {
  3323. ptr = handle.$$.smartPtr;
  3324. } else {
  3325. var clonedHandle = handle["clone"]();
  3326. ptr = this.rawShare(ptr, __emval_register(function() {
  3327. clonedHandle["delete"]();
  3328. }));
  3329. if (destructors !== null) {
  3330. destructors.push(this.rawDestructor, ptr);
  3331. }
  3332. }
  3333. break;
  3334. default:
  3335. throwBindingError("Unsupporting sharing policy");
  3336. }
  3337. }
  3338. return ptr;
  3339. }
  3340. function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) {
  3341. if (handle === null) {
  3342. if (this.isReference) {
  3343. throwBindingError("null is not a valid " + this.name);
  3344. }
  3345. return 0;
  3346. }
  3347. if (!handle.$$) {
  3348. throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name);
  3349. }
  3350. if (!handle.$$.ptr) {
  3351. throwBindingError("Cannot pass deleted object as a pointer of type " + this.name);
  3352. }
  3353. if (handle.$$.ptrType.isConst) {
  3354. throwBindingError("Cannot convert argument of type " + handle.$$.ptrType.name + " to parameter type " + this.name);
  3355. }
  3356. var handleClass = handle.$$.ptrType.registeredClass;
  3357. var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass);
  3358. return ptr;
  3359. }
  3360. function RegisteredPointer_getPointee(ptr) {
  3361. if (this.rawGetPointee) {
  3362. ptr = this.rawGetPointee(ptr);
  3363. }
  3364. return ptr;
  3365. }
  3366. function RegisteredPointer_destructor(ptr) {
  3367. if (this.rawDestructor) {
  3368. this.rawDestructor(ptr);
  3369. }
  3370. }
  3371. function RegisteredPointer_deleteObject(handle) {
  3372. if (handle !== null) {
  3373. handle["delete"]();
  3374. }
  3375. }
  3376. function downcastPointer(ptr, ptrClass, desiredClass) {
  3377. if (ptrClass === desiredClass) {
  3378. return ptr;
  3379. }
  3380. if (desiredClass.baseClass === void 0) {
  3381. return null;
  3382. }
  3383. var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass);
  3384. if (rv === null) {
  3385. return null;
  3386. }
  3387. return desiredClass.downcast(rv);
  3388. }
  3389. function getInheritedInstanceCount() {
  3390. return Object.keys(registeredInstances).length;
  3391. }
  3392. function getLiveInheritedInstances() {
  3393. var rv = [];
  3394. for (var k in registeredInstances) {
  3395. if (registeredInstances.hasOwnProperty(k)) {
  3396. rv.push(registeredInstances[k]);
  3397. }
  3398. }
  3399. return rv;
  3400. }
  3401. function setDelayFunction(fn) {
  3402. delayFunction = fn;
  3403. if (deletionQueue.length && delayFunction) {
  3404. delayFunction(flushPendingDeletes);
  3405. }
  3406. }
  3407. function init_embind() {
  3408. Module["getInheritedInstanceCount"] = getInheritedInstanceCount;
  3409. Module["getLiveInheritedInstances"] = getLiveInheritedInstances;
  3410. Module["flushPendingDeletes"] = flushPendingDeletes;
  3411. Module["setDelayFunction"] = setDelayFunction;
  3412. }
  3413. var registeredInstances = {};
  3414. function getBasestPointer(class_, ptr) {
  3415. if (ptr === void 0) {
  3416. throwBindingError("ptr should not be undefined");
  3417. }
  3418. while (class_.baseClass) {
  3419. ptr = class_.upcast(ptr);
  3420. class_ = class_.baseClass;
  3421. }
  3422. return ptr;
  3423. }
  3424. function getInheritedInstance(class_, ptr) {
  3425. ptr = getBasestPointer(class_, ptr);
  3426. return registeredInstances[ptr];
  3427. }
  3428. function makeClassHandle(prototype, record) {
  3429. if (!record.ptrType || !record.ptr) {
  3430. throwInternalError("makeClassHandle requires ptr and ptrType");
  3431. }
  3432. var hasSmartPtrType = !!record.smartPtrType;
  3433. var hasSmartPtr = !!record.smartPtr;
  3434. if (hasSmartPtrType !== hasSmartPtr) {
  3435. throwInternalError("Both smartPtrType and smartPtr must be specified");
  3436. }
  3437. record.count = {value: 1};
  3438. return attachFinalizer(Object.create(prototype, {$$: {value: record}}));
  3439. }
  3440. function RegisteredPointer_fromWireType(ptr) {
  3441. var rawPointer = this.getPointee(ptr);
  3442. if (!rawPointer) {
  3443. this.destructor(ptr);
  3444. return null;
  3445. }
  3446. var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer);
  3447. if (registeredInstance !== void 0) {
  3448. if (registeredInstance.$$.count.value === 0) {
  3449. registeredInstance.$$.ptr = rawPointer;
  3450. registeredInstance.$$.smartPtr = ptr;
  3451. return registeredInstance["clone"]();
  3452. } else {
  3453. var rv = registeredInstance["clone"]();
  3454. this.destructor(ptr);
  3455. return rv;
  3456. }
  3457. }
  3458. function makeDefaultHandle() {
  3459. if (this.isSmartPointer) {
  3460. return makeClassHandle(this.registeredClass.instancePrototype, {ptrType: this.pointeeType, ptr: rawPointer, smartPtrType: this, smartPtr: ptr});
  3461. } else {
  3462. return makeClassHandle(this.registeredClass.instancePrototype, {ptrType: this, ptr});
  3463. }
  3464. }
  3465. var actualType = this.registeredClass.getActualType(rawPointer);
  3466. var registeredPointerRecord = registeredPointers[actualType];
  3467. if (!registeredPointerRecord) {
  3468. return makeDefaultHandle.call(this);
  3469. }
  3470. var toType;
  3471. if (this.isConst) {
  3472. toType = registeredPointerRecord.constPointerType;
  3473. } else {
  3474. toType = registeredPointerRecord.pointerType;
  3475. }
  3476. var dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass);
  3477. if (dp === null) {
  3478. return makeDefaultHandle.call(this);
  3479. }
  3480. if (this.isSmartPointer) {
  3481. return makeClassHandle(toType.registeredClass.instancePrototype, {ptrType: toType, ptr: dp, smartPtrType: this, smartPtr: ptr});
  3482. } else {
  3483. return makeClassHandle(toType.registeredClass.instancePrototype, {ptrType: toType, ptr: dp});
  3484. }
  3485. }
  3486. function init_RegisteredPointer() {
  3487. RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee;
  3488. RegisteredPointer.prototype.destructor = RegisteredPointer_destructor;
  3489. RegisteredPointer.prototype["argPackAdvance"] = 8;
  3490. RegisteredPointer.prototype["readValueFromPointer"] = simpleReadValueFromPointer;
  3491. RegisteredPointer.prototype["deleteObject"] = RegisteredPointer_deleteObject;
  3492. RegisteredPointer.prototype["fromWireType"] = RegisteredPointer_fromWireType;
  3493. }
  3494. function RegisteredPointer(name, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) {
  3495. this.name = name;
  3496. this.registeredClass = registeredClass;
  3497. this.isReference = isReference;
  3498. this.isConst = isConst;
  3499. this.isSmartPointer = isSmartPointer;
  3500. this.pointeeType = pointeeType;
  3501. this.sharingPolicy = sharingPolicy;
  3502. this.rawGetPointee = rawGetPointee;
  3503. this.rawConstructor = rawConstructor;
  3504. this.rawShare = rawShare;
  3505. this.rawDestructor = rawDestructor;
  3506. if (!isSmartPointer && registeredClass.baseClass === void 0) {
  3507. if (isConst) {
  3508. this["toWireType"] = constNoSmartPtrRawPointerToWireType;
  3509. this.destructorFunction = null;
  3510. } else {
  3511. this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType;
  3512. this.destructorFunction = null;
  3513. }
  3514. } else {
  3515. this["toWireType"] = genericPointerToWireType;
  3516. }
  3517. }
  3518. function replacePublicSymbol(name, value, numArguments) {
  3519. if (!Module.hasOwnProperty(name)) {
  3520. throwInternalError("Replacing nonexistant public symbol");
  3521. }
  3522. if (Module[name].overloadTable !== void 0 && numArguments !== void 0) {
  3523. Module[name].overloadTable[numArguments] = value;
  3524. } else {
  3525. Module[name] = value;
  3526. Module[name].argCount = numArguments;
  3527. }
  3528. }
  3529. function getDynCaller(sig, ptr) {
  3530. assert(sig.indexOf("j") >= 0, "getDynCaller should only be called with i64 sigs");
  3531. var argCache = [];
  3532. return function() {
  3533. argCache.length = arguments.length;
  3534. for (var i = 0; i < arguments.length; i++) {
  3535. argCache[i] = arguments[i];
  3536. }
  3537. return dynCall(sig, ptr, argCache);
  3538. };
  3539. }
  3540. function embind__requireFunction(signature, rawFunction) {
  3541. signature = readLatin1String(signature);
  3542. function makeDynCaller() {
  3543. if (signature.indexOf("j") != -1) {
  3544. return getDynCaller(signature, rawFunction);
  3545. }
  3546. return wasmTable.get(rawFunction);
  3547. }
  3548. var fp = makeDynCaller();
  3549. if (typeof fp !== "function") {
  3550. throwBindingError("unknown function pointer with signature " + signature + ": " + rawFunction);
  3551. }
  3552. return fp;
  3553. }
  3554. var UnboundTypeError = void 0;
  3555. function getTypeName(type) {
  3556. var ptr = ___getTypeName(type);
  3557. var rv = readLatin1String(ptr);
  3558. _free(ptr);
  3559. return rv;
  3560. }
  3561. function throwUnboundTypeError(message, types) {
  3562. var unboundTypes = [];
  3563. var seen = {};
  3564. function visit(type) {
  3565. if (seen[type]) {
  3566. return;
  3567. }
  3568. if (registeredTypes[type]) {
  3569. return;
  3570. }
  3571. if (typeDependencies[type]) {
  3572. typeDependencies[type].forEach(visit);
  3573. return;
  3574. }
  3575. unboundTypes.push(type);
  3576. seen[type] = true;
  3577. }
  3578. types.forEach(visit);
  3579. throw new UnboundTypeError(message + ": " + unboundTypes.map(getTypeName).join([", "]));
  3580. }
  3581. function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name, destructorSignature, rawDestructor) {
  3582. name = readLatin1String(name);
  3583. getActualType = embind__requireFunction(getActualTypeSignature, getActualType);
  3584. if (upcast) {
  3585. upcast = embind__requireFunction(upcastSignature, upcast);
  3586. }
  3587. if (downcast) {
  3588. downcast = embind__requireFunction(downcastSignature, downcast);
  3589. }
  3590. rawDestructor = embind__requireFunction(destructorSignature, rawDestructor);
  3591. var legalFunctionName = makeLegalFunctionName(name);
  3592. exposePublicSymbol(legalFunctionName, function() {
  3593. throwUnboundTypeError("Cannot construct " + name + " due to unbound types", [baseClassRawType]);
  3594. });
  3595. whenDependentTypesAreResolved([rawType, rawPointerType, rawConstPointerType], baseClassRawType ? [baseClassRawType] : [], function(base) {
  3596. base = base[0];
  3597. var baseClass;
  3598. var basePrototype;
  3599. if (baseClassRawType) {
  3600. baseClass = base.registeredClass;
  3601. basePrototype = baseClass.instancePrototype;
  3602. } else {
  3603. basePrototype = ClassHandle.prototype;
  3604. }
  3605. var constructor = createNamedFunction(legalFunctionName, function() {
  3606. if (Object.getPrototypeOf(this) !== instancePrototype) {
  3607. throw new BindingError("Use 'new' to construct " + name);
  3608. }
  3609. if (registeredClass.constructor_body === void 0) {
  3610. throw new BindingError(name + " has no accessible constructor");
  3611. }
  3612. var body = registeredClass.constructor_body[arguments.length];
  3613. if (body === void 0) {
  3614. throw new BindingError("Tried to invoke ctor of " + name + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(registeredClass.constructor_body).toString() + ") parameters instead!");
  3615. }
  3616. return body.apply(this, arguments);
  3617. });
  3618. var instancePrototype = Object.create(basePrototype, {constructor: {value: constructor}});
  3619. constructor.prototype = instancePrototype;
  3620. var registeredClass = new RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast);
  3621. var referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false);
  3622. var pointerConverter = new RegisteredPointer(name + "*", registeredClass, false, false, false);
  3623. var constPointerConverter = new RegisteredPointer(name + " const*", registeredClass, false, true, false);
  3624. registeredPointers[rawType] = {pointerType: pointerConverter, constPointerType: constPointerConverter};
  3625. replacePublicSymbol(legalFunctionName, constructor);
  3626. return [referenceConverter, pointerConverter, constPointerConverter];
  3627. });
  3628. }
  3629. function heap32VectorToArray(count, firstElement) {
  3630. var array = [];
  3631. for (var i = 0; i < count; i++) {
  3632. array.push(HEAP32[(firstElement >> 2) + i]);
  3633. }
  3634. return array;
  3635. }
  3636. function __embind_register_class_constructor(rawClassType, argCount, rawArgTypesAddr, invokerSignature, invoker, rawConstructor) {
  3637. assert(argCount > 0);
  3638. var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  3639. invoker = embind__requireFunction(invokerSignature, invoker);
  3640. var args = [rawConstructor];
  3641. var destructors = [];
  3642. whenDependentTypesAreResolved([], [rawClassType], function(classType) {
  3643. classType = classType[0];
  3644. var humanName = "constructor " + classType.name;
  3645. if (classType.registeredClass.constructor_body === void 0) {
  3646. classType.registeredClass.constructor_body = [];
  3647. }
  3648. if (classType.registeredClass.constructor_body[argCount - 1] !== void 0) {
  3649. throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + (argCount - 1) + ") for class '" + classType.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!");
  3650. }
  3651. classType.registeredClass.constructor_body[argCount - 1] = function unboundTypeHandler() {
  3652. throwUnboundTypeError("Cannot construct " + classType.name + " due to unbound types", rawArgTypes);
  3653. };
  3654. whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) {
  3655. classType.registeredClass.constructor_body[argCount - 1] = function constructor_body() {
  3656. if (arguments.length !== argCount - 1) {
  3657. throwBindingError(humanName + " called with " + arguments.length + " arguments, expected " + (argCount - 1));
  3658. }
  3659. destructors.length = 0;
  3660. args.length = argCount;
  3661. for (var i = 1; i < argCount; ++i) {
  3662. args[i] = argTypes[i]["toWireType"](destructors, arguments[i - 1]);
  3663. }
  3664. var ptr = invoker.apply(null, args);
  3665. runDestructors(destructors);
  3666. return argTypes[0]["fromWireType"](ptr);
  3667. };
  3668. return [];
  3669. });
  3670. return [];
  3671. });
  3672. }
  3673. function new_(constructor, argumentList) {
  3674. if (!(constructor instanceof Function)) {
  3675. throw new TypeError("new_ called with constructor type " + typeof constructor + " which is not a function");
  3676. }
  3677. var dummy = createNamedFunction(constructor.name || "unknownFunctionName", function() {
  3678. });
  3679. dummy.prototype = constructor.prototype;
  3680. var obj = new dummy();
  3681. var r = constructor.apply(obj, argumentList);
  3682. return r instanceof Object ? r : obj;
  3683. }
  3684. function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) {
  3685. var argCount = argTypes.length;
  3686. if (argCount < 2) {
  3687. throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!");
  3688. }
  3689. var isClassMethodFunc = argTypes[1] !== null && classType !== null;
  3690. var needsDestructorStack = false;
  3691. for (var i = 1; i < argTypes.length; ++i) {
  3692. if (argTypes[i] !== null && argTypes[i].destructorFunction === void 0) {
  3693. needsDestructorStack = true;
  3694. break;
  3695. }
  3696. }
  3697. var returns = argTypes[0].name !== "void";
  3698. var argsList = "";
  3699. var argsListWired = "";
  3700. for (var i = 0; i < argCount - 2; ++i) {
  3701. argsList += (i !== 0 ? ", " : "") + "arg" + i;
  3702. argsListWired += (i !== 0 ? ", " : "") + "arg" + i + "Wired";
  3703. }
  3704. var invokerFnBody = "return function " + makeLegalFunctionName(humanName) + "(" + argsList + ") {\nif (arguments.length !== " + (argCount - 2) + ") {\nthrowBindingError('function " + humanName + " called with ' + arguments.length + ' arguments, expected " + (argCount - 2) + " args!');\n}\n";
  3705. if (needsDestructorStack) {
  3706. invokerFnBody += "var destructors = [];\n";
  3707. }
  3708. var dtorStack = needsDestructorStack ? "destructors" : "null";
  3709. var args1 = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"];
  3710. var args2 = [throwBindingError, cppInvokerFunc, cppTargetFunc, runDestructors, argTypes[0], argTypes[1]];
  3711. if (isClassMethodFunc) {
  3712. invokerFnBody += "var thisWired = classParam.toWireType(" + dtorStack + ", this);\n";
  3713. }
  3714. for (var i = 0; i < argCount - 2; ++i) {
  3715. invokerFnBody += "var arg" + i + "Wired = argType" + i + ".toWireType(" + dtorStack + ", arg" + i + "); // " + argTypes[i + 2].name + "\n";
  3716. args1.push("argType" + i);
  3717. args2.push(argTypes[i + 2]);
  3718. }
  3719. if (isClassMethodFunc) {
  3720. argsListWired = "thisWired" + (argsListWired.length > 0 ? ", " : "") + argsListWired;
  3721. }
  3722. invokerFnBody += (returns ? "var rv = " : "") + "invoker(fn" + (argsListWired.length > 0 ? ", " : "") + argsListWired + ");\n";
  3723. if (needsDestructorStack) {
  3724. invokerFnBody += "runDestructors(destructors);\n";
  3725. } else {
  3726. for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; ++i) {
  3727. var paramName = i === 1 ? "thisWired" : "arg" + (i - 2) + "Wired";
  3728. if (argTypes[i].destructorFunction !== null) {
  3729. invokerFnBody += paramName + "_dtor(" + paramName + "); // " + argTypes[i].name + "\n";
  3730. args1.push(paramName + "_dtor");
  3731. args2.push(argTypes[i].destructorFunction);
  3732. }
  3733. }
  3734. }
  3735. if (returns) {
  3736. invokerFnBody += "var ret = retType.fromWireType(rv);\nreturn ret;\n";
  3737. } else {
  3738. }
  3739. invokerFnBody += "}\n";
  3740. args1.push(invokerFnBody);
  3741. var invokerFunction = new_(Function, args1).apply(null, args2);
  3742. return invokerFunction;
  3743. }
  3744. function __embind_register_class_function(rawClassType, methodName, argCount, rawArgTypesAddr, invokerSignature, rawInvoker, context, isPureVirtual) {
  3745. var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  3746. methodName = readLatin1String(methodName);
  3747. rawInvoker = embind__requireFunction(invokerSignature, rawInvoker);
  3748. whenDependentTypesAreResolved([], [rawClassType], function(classType) {
  3749. classType = classType[0];
  3750. var humanName = classType.name + "." + methodName;
  3751. if (isPureVirtual) {
  3752. classType.registeredClass.pureVirtualFunctions.push(methodName);
  3753. }
  3754. function unboundTypesHandler() {
  3755. throwUnboundTypeError("Cannot call " + humanName + " due to unbound types", rawArgTypes);
  3756. }
  3757. var proto = classType.registeredClass.instancePrototype;
  3758. var method = proto[methodName];
  3759. if (method === void 0 || method.overloadTable === void 0 && method.className !== classType.name && method.argCount === argCount - 2) {
  3760. unboundTypesHandler.argCount = argCount - 2;
  3761. unboundTypesHandler.className = classType.name;
  3762. proto[methodName] = unboundTypesHandler;
  3763. } else {
  3764. ensureOverloadTable(proto, methodName, humanName);
  3765. proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler;
  3766. }
  3767. whenDependentTypesAreResolved([], rawArgTypes, function(argTypes) {
  3768. var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context);
  3769. if (proto[methodName].overloadTable === void 0) {
  3770. memberFunction.argCount = argCount - 2;
  3771. proto[methodName] = memberFunction;
  3772. } else {
  3773. proto[methodName].overloadTable[argCount - 2] = memberFunction;
  3774. }
  3775. return [];
  3776. });
  3777. return [];
  3778. });
  3779. }
  3780. var emval_free_list = [];
  3781. var emval_handle_array = [{}, {value: void 0}, {value: null}, {value: true}, {value: false}];
  3782. function __emval_decref(handle) {
  3783. if (handle > 4 && --emval_handle_array[handle].refcount === 0) {
  3784. emval_handle_array[handle] = void 0;
  3785. emval_free_list.push(handle);
  3786. }
  3787. }
  3788. function count_emval_handles() {
  3789. var count = 0;
  3790. for (var i = 5; i < emval_handle_array.length; ++i) {
  3791. if (emval_handle_array[i] !== void 0) {
  3792. ++count;
  3793. }
  3794. }
  3795. return count;
  3796. }
  3797. function get_first_emval() {
  3798. for (var i = 5; i < emval_handle_array.length; ++i) {
  3799. if (emval_handle_array[i] !== void 0) {
  3800. return emval_handle_array[i];
  3801. }
  3802. }
  3803. return null;
  3804. }
  3805. function init_emval() {
  3806. Module["count_emval_handles"] = count_emval_handles;
  3807. Module["get_first_emval"] = get_first_emval;
  3808. }
  3809. function __emval_register(value) {
  3810. switch (value) {
  3811. case void 0: {
  3812. return 1;
  3813. }
  3814. case null: {
  3815. return 2;
  3816. }
  3817. case true: {
  3818. return 3;
  3819. }
  3820. case false: {
  3821. return 4;
  3822. }
  3823. default: {
  3824. var handle = emval_free_list.length ? emval_free_list.pop() : emval_handle_array.length;
  3825. emval_handle_array[handle] = {refcount: 1, value};
  3826. return handle;
  3827. }
  3828. }
  3829. }
  3830. function __embind_register_emval(rawType, name) {
  3831. name = readLatin1String(name);
  3832. registerType(rawType, {name, fromWireType: function(handle) {
  3833. var rv = emval_handle_array[handle].value;
  3834. __emval_decref(handle);
  3835. return rv;
  3836. }, toWireType: function(destructors, value) {
  3837. return __emval_register(value);
  3838. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: null});
  3839. }
  3840. function _embind_repr(v) {
  3841. if (v === null) {
  3842. return "null";
  3843. }
  3844. var t = typeof v;
  3845. if (t === "object" || t === "array" || t === "function") {
  3846. return v.toString();
  3847. } else {
  3848. return "" + v;
  3849. }
  3850. }
  3851. function floatReadValueFromPointer(name, shift) {
  3852. switch (shift) {
  3853. case 2:
  3854. return function(pointer) {
  3855. return this["fromWireType"](HEAPF32[pointer >> 2]);
  3856. };
  3857. case 3:
  3858. return function(pointer) {
  3859. return this["fromWireType"](HEAPF64[pointer >> 3]);
  3860. };
  3861. default:
  3862. throw new TypeError("Unknown float type: " + name);
  3863. }
  3864. }
  3865. function __embind_register_float(rawType, name, size) {
  3866. var shift = getShiftFromSize(size);
  3867. name = readLatin1String(name);
  3868. registerType(rawType, {name, fromWireType: function(value) {
  3869. return value;
  3870. }, toWireType: function(destructors, value) {
  3871. if (typeof value !== "number" && typeof value !== "boolean") {
  3872. throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
  3873. }
  3874. return value;
  3875. }, argPackAdvance: 8, readValueFromPointer: floatReadValueFromPointer(name, shift), destructorFunction: null});
  3876. }
  3877. function __embind_register_function(name, argCount, rawArgTypesAddr, signature, rawInvoker, fn) {
  3878. var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
  3879. name = readLatin1String(name);
  3880. rawInvoker = embind__requireFunction(signature, rawInvoker);
  3881. exposePublicSymbol(name, function() {
  3882. throwUnboundTypeError("Cannot call " + name + " due to unbound types", argTypes);
  3883. }, argCount - 1);
  3884. whenDependentTypesAreResolved([], argTypes, function(argTypes2) {
  3885. var invokerArgsArray = [argTypes2[0], null].concat(argTypes2.slice(1));
  3886. replacePublicSymbol(name, craftInvokerFunction(name, invokerArgsArray, null, rawInvoker, fn), argCount - 1);
  3887. return [];
  3888. });
  3889. }
  3890. function integerReadValueFromPointer(name, shift, signed) {
  3891. switch (shift) {
  3892. case 0:
  3893. return signed ? function readS8FromPointer(pointer) {
  3894. return HEAP8[pointer];
  3895. } : function readU8FromPointer(pointer) {
  3896. return HEAPU8[pointer];
  3897. };
  3898. case 1:
  3899. return signed ? function readS16FromPointer(pointer) {
  3900. return HEAP16[pointer >> 1];
  3901. } : function readU16FromPointer(pointer) {
  3902. return HEAPU16[pointer >> 1];
  3903. };
  3904. case 2:
  3905. return signed ? function readS32FromPointer(pointer) {
  3906. return HEAP32[pointer >> 2];
  3907. } : function readU32FromPointer(pointer) {
  3908. return HEAPU32[pointer >> 2];
  3909. };
  3910. default:
  3911. throw new TypeError("Unknown integer type: " + name);
  3912. }
  3913. }
  3914. function __embind_register_integer(primitiveType, name, size, minRange, maxRange) {
  3915. name = readLatin1String(name);
  3916. if (maxRange === -1) {
  3917. maxRange = 4294967295;
  3918. }
  3919. var shift = getShiftFromSize(size);
  3920. var fromWireType = function(value) {
  3921. return value;
  3922. };
  3923. if (minRange === 0) {
  3924. var bitshift = 32 - 8 * size;
  3925. fromWireType = function(value) {
  3926. return value << bitshift >>> bitshift;
  3927. };
  3928. }
  3929. var isUnsignedType = name.indexOf("unsigned") != -1;
  3930. registerType(primitiveType, {name, fromWireType, toWireType: function(destructors, value) {
  3931. if (typeof value !== "number" && typeof value !== "boolean") {
  3932. throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name);
  3933. }
  3934. if (value < minRange || value > maxRange) {
  3935. throw new TypeError('Passing a number "' + _embind_repr(value) + '" from JS side to C/C++ side to an argument of type "' + name + '", which is outside the valid range [' + minRange + ", " + maxRange + "]!");
  3936. }
  3937. return isUnsignedType ? value >>> 0 : value | 0;
  3938. }, argPackAdvance: 8, readValueFromPointer: integerReadValueFromPointer(name, shift, minRange !== 0), destructorFunction: null});
  3939. }
  3940. function __embind_register_memory_view(rawType, dataTypeIndex, name) {
  3941. var typeMapping = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array];
  3942. var TA = typeMapping[dataTypeIndex];
  3943. function decodeMemoryView(handle) {
  3944. handle = handle >> 2;
  3945. var heap = HEAPU32;
  3946. var size = heap[handle];
  3947. var data = heap[handle + 1];
  3948. return new TA(buffer, data, size);
  3949. }
  3950. name = readLatin1String(name);
  3951. registerType(rawType, {name, fromWireType: decodeMemoryView, argPackAdvance: 8, readValueFromPointer: decodeMemoryView}, {ignoreDuplicateRegistrations: true});
  3952. }
  3953. function __embind_register_std_string(rawType, name) {
  3954. name = readLatin1String(name);
  3955. var stdStringIsUTF8 = name === "std::string";
  3956. registerType(rawType, {name, fromWireType: function(value) {
  3957. var length = HEAPU32[value >> 2];
  3958. var str;
  3959. if (stdStringIsUTF8) {
  3960. var decodeStartPtr = value + 4;
  3961. for (var i = 0; i <= length; ++i) {
  3962. var currentBytePtr = value + 4 + i;
  3963. if (i == length || HEAPU8[currentBytePtr] == 0) {
  3964. var maxRead = currentBytePtr - decodeStartPtr;
  3965. var stringSegment = UTF8ToString(decodeStartPtr, maxRead);
  3966. if (str === void 0) {
  3967. str = stringSegment;
  3968. } else {
  3969. str += String.fromCharCode(0);
  3970. str += stringSegment;
  3971. }
  3972. decodeStartPtr = currentBytePtr + 1;
  3973. }
  3974. }
  3975. } else {
  3976. var a = new Array(length);
  3977. for (var i = 0; i < length; ++i) {
  3978. a[i] = String.fromCharCode(HEAPU8[value + 4 + i]);
  3979. }
  3980. str = a.join("");
  3981. }
  3982. _free(value);
  3983. return str;
  3984. }, toWireType: function(destructors, value) {
  3985. if (value instanceof ArrayBuffer) {
  3986. value = new Uint8Array(value);
  3987. }
  3988. var getLength;
  3989. var valueIsOfTypeString = typeof value === "string";
  3990. if (!(valueIsOfTypeString || value instanceof Uint8Array || value instanceof Uint8ClampedArray || value instanceof Int8Array)) {
  3991. throwBindingError("Cannot pass non-string to std::string");
  3992. }
  3993. if (stdStringIsUTF8 && valueIsOfTypeString) {
  3994. getLength = function() {
  3995. return lengthBytesUTF8(value);
  3996. };
  3997. } else {
  3998. getLength = function() {
  3999. return value.length;
  4000. };
  4001. }
  4002. var length = getLength();
  4003. var ptr = _malloc(4 + length + 1);
  4004. HEAPU32[ptr >> 2] = length;
  4005. if (stdStringIsUTF8 && valueIsOfTypeString) {
  4006. stringToUTF8(value, ptr + 4, length + 1);
  4007. } else {
  4008. if (valueIsOfTypeString) {
  4009. for (var i = 0; i < length; ++i) {
  4010. var charCode = value.charCodeAt(i);
  4011. if (charCode > 255) {
  4012. _free(ptr);
  4013. throwBindingError("String has UTF-16 code units that do not fit in 8 bits");
  4014. }
  4015. HEAPU8[ptr + 4 + i] = charCode;
  4016. }
  4017. } else {
  4018. for (var i = 0; i < length; ++i) {
  4019. HEAPU8[ptr + 4 + i] = value[i];
  4020. }
  4021. }
  4022. }
  4023. if (destructors !== null) {
  4024. destructors.push(_free, ptr);
  4025. }
  4026. return ptr;
  4027. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: function(ptr) {
  4028. _free(ptr);
  4029. }});
  4030. }
  4031. function __embind_register_std_wstring(rawType, charSize, name) {
  4032. name = readLatin1String(name);
  4033. var decodeString, encodeString, getHeap, lengthBytesUTF, shift;
  4034. if (charSize === 2) {
  4035. decodeString = UTF16ToString;
  4036. encodeString = stringToUTF16;
  4037. lengthBytesUTF = lengthBytesUTF16;
  4038. getHeap = function() {
  4039. return HEAPU16;
  4040. };
  4041. shift = 1;
  4042. } else if (charSize === 4) {
  4043. decodeString = UTF32ToString;
  4044. encodeString = stringToUTF32;
  4045. lengthBytesUTF = lengthBytesUTF32;
  4046. getHeap = function() {
  4047. return HEAPU32;
  4048. };
  4049. shift = 2;
  4050. }
  4051. registerType(rawType, {name, fromWireType: function(value) {
  4052. var length = HEAPU32[value >> 2];
  4053. var HEAP = getHeap();
  4054. var str;
  4055. var decodeStartPtr = value + 4;
  4056. for (var i = 0; i <= length; ++i) {
  4057. var currentBytePtr = value + 4 + i * charSize;
  4058. if (i == length || HEAP[currentBytePtr >> shift] == 0) {
  4059. var maxReadBytes = currentBytePtr - decodeStartPtr;
  4060. var stringSegment = decodeString(decodeStartPtr, maxReadBytes);
  4061. if (str === void 0) {
  4062. str = stringSegment;
  4063. } else {
  4064. str += String.fromCharCode(0);
  4065. str += stringSegment;
  4066. }
  4067. decodeStartPtr = currentBytePtr + charSize;
  4068. }
  4069. }
  4070. _free(value);
  4071. return str;
  4072. }, toWireType: function(destructors, value) {
  4073. if (!(typeof value === "string")) {
  4074. throwBindingError("Cannot pass non-string to C++ string type " + name);
  4075. }
  4076. var length = lengthBytesUTF(value);
  4077. var ptr = _malloc(4 + length + charSize);
  4078. HEAPU32[ptr >> 2] = length >> shift;
  4079. encodeString(value, ptr + 4, length + charSize);
  4080. if (destructors !== null) {
  4081. destructors.push(_free, ptr);
  4082. }
  4083. return ptr;
  4084. }, argPackAdvance: 8, readValueFromPointer: simpleReadValueFromPointer, destructorFunction: function(ptr) {
  4085. _free(ptr);
  4086. }});
  4087. }
  4088. function __embind_register_value_array(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
  4089. tupleRegistrations[rawType] = {name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), elements: []};
  4090. }
  4091. function __embind_register_value_array_element(rawTupleType, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) {
  4092. tupleRegistrations[rawTupleType].elements.push({getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext});
  4093. }
  4094. function __embind_register_value_object(rawType, name, constructorSignature, rawConstructor, destructorSignature, rawDestructor) {
  4095. structRegistrations[rawType] = {name: readLatin1String(name), rawConstructor: embind__requireFunction(constructorSignature, rawConstructor), rawDestructor: embind__requireFunction(destructorSignature, rawDestructor), fields: []};
  4096. }
  4097. function __embind_register_value_object_field(structType, fieldName, getterReturnType, getterSignature, getter, getterContext, setterArgumentType, setterSignature, setter, setterContext) {
  4098. structRegistrations[structType].fields.push({fieldName: readLatin1String(fieldName), getterReturnType, getter: embind__requireFunction(getterSignature, getter), getterContext, setterArgumentType, setter: embind__requireFunction(setterSignature, setter), setterContext});
  4099. }
  4100. function __embind_register_void(rawType, name) {
  4101. name = readLatin1String(name);
  4102. registerType(rawType, {isVoid: true, name, argPackAdvance: 0, fromWireType: function() {
  4103. return void 0;
  4104. }, toWireType: function(destructors, o) {
  4105. return void 0;
  4106. }});
  4107. }
  4108. function __emval_incref(handle) {
  4109. if (handle > 4) {
  4110. emval_handle_array[handle].refcount += 1;
  4111. }
  4112. }
  4113. function requireRegisteredType(rawType, humanName) {
  4114. var impl = registeredTypes[rawType];
  4115. if (impl === void 0) {
  4116. throwBindingError(humanName + " has unknown type " + getTypeName(rawType));
  4117. }
  4118. return impl;
  4119. }
  4120. function __emval_take_value(type, argv) {
  4121. type = requireRegisteredType(type, "_emval_take_value");
  4122. var v = type["readValueFromPointer"](argv);
  4123. return __emval_register(v);
  4124. }
  4125. function _abort() {
  4126. abort();
  4127. }
  4128. var _emscripten_get_now;
  4129. if (ENVIRONMENT_IS_NODE) {
  4130. _emscripten_get_now = function() {
  4131. var t = process["hrtime"]();
  4132. return t[0] * 1e3 + t[1] / 1e6;
  4133. };
  4134. } else if (typeof dateNow !== "undefined") {
  4135. _emscripten_get_now = dateNow;
  4136. } else
  4137. _emscripten_get_now = function() {
  4138. return performance.now();
  4139. };
  4140. var _emscripten_get_now_is_monotonic = true;
  4141. function setErrNo(value) {
  4142. HEAP32[___errno_location() >> 2] = value;
  4143. return value;
  4144. }
  4145. function _clock_gettime(clk_id, tp) {
  4146. var now;
  4147. if (clk_id === 0) {
  4148. now = Date.now();
  4149. } else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) {
  4150. now = _emscripten_get_now();
  4151. } else {
  4152. setErrNo(28);
  4153. return -1;
  4154. }
  4155. HEAP32[tp >> 2] = now / 1e3 | 0;
  4156. HEAP32[tp + 4 >> 2] = now % 1e3 * 1e3 * 1e3 | 0;
  4157. return 0;
  4158. }
  4159. function _emscripten_memcpy_big(dest, src, num) {
  4160. HEAPU8.copyWithin(dest, src, src + num);
  4161. }
  4162. function _emscripten_get_heap_size() {
  4163. return HEAPU8.length;
  4164. }
  4165. function emscripten_realloc_buffer(size) {
  4166. try {
  4167. wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16);
  4168. updateGlobalBufferAndViews(wasmMemory.buffer);
  4169. return 1;
  4170. } catch (e) {
  4171. }
  4172. }
  4173. function _emscripten_resize_heap(requestedSize) {
  4174. requestedSize = requestedSize >>> 0;
  4175. var oldSize = _emscripten_get_heap_size();
  4176. var maxHeapSize = 2147483648;
  4177. if (requestedSize > maxHeapSize) {
  4178. return false;
  4179. }
  4180. var minHeapSize = 16777216;
  4181. for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {
  4182. var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown);
  4183. overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);
  4184. var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), 65536));
  4185. var replacement = emscripten_realloc_buffer(newSize);
  4186. if (replacement) {
  4187. return true;
  4188. }
  4189. }
  4190. return false;
  4191. }
  4192. var ENV = {};
  4193. function getExecutableName() {
  4194. return thisProgram || "./this.program";
  4195. }
  4196. function getEnvStrings() {
  4197. if (!getEnvStrings.strings) {
  4198. var lang = (typeof navigator === "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8";
  4199. var env = {USER: "web_user", LOGNAME: "web_user", PATH: "/", PWD: "/", HOME: "/home/web_user", LANG: lang, _: getExecutableName()};
  4200. for (var x in ENV) {
  4201. env[x] = ENV[x];
  4202. }
  4203. var strings = [];
  4204. for (var x in env) {
  4205. strings.push(x + "=" + env[x]);
  4206. }
  4207. getEnvStrings.strings = strings;
  4208. }
  4209. return getEnvStrings.strings;
  4210. }
  4211. function _environ_get(__environ, environ_buf) {
  4212. try {
  4213. var bufSize = 0;
  4214. getEnvStrings().forEach(function(string, i) {
  4215. var ptr = environ_buf + bufSize;
  4216. HEAP32[__environ + i * 4 >> 2] = ptr;
  4217. writeAsciiToMemory(string, ptr);
  4218. bufSize += string.length + 1;
  4219. });
  4220. return 0;
  4221. } catch (e) {
  4222. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4223. abort(e);
  4224. return e.errno;
  4225. }
  4226. }
  4227. function _environ_sizes_get(penviron_count, penviron_buf_size) {
  4228. try {
  4229. var strings = getEnvStrings();
  4230. HEAP32[penviron_count >> 2] = strings.length;
  4231. var bufSize = 0;
  4232. strings.forEach(function(string) {
  4233. bufSize += string.length + 1;
  4234. });
  4235. HEAP32[penviron_buf_size >> 2] = bufSize;
  4236. return 0;
  4237. } catch (e) {
  4238. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4239. abort(e);
  4240. return e.errno;
  4241. }
  4242. }
  4243. function _fd_close(fd) {
  4244. try {
  4245. var stream = SYSCALLS.getStreamFromFD(fd);
  4246. FS.close(stream);
  4247. return 0;
  4248. } catch (e) {
  4249. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4250. abort(e);
  4251. return e.errno;
  4252. }
  4253. }
  4254. function _fd_read(fd, iov, iovcnt, pnum) {
  4255. try {
  4256. var stream = SYSCALLS.getStreamFromFD(fd);
  4257. var num = SYSCALLS.doReadv(stream, iov, iovcnt);
  4258. HEAP32[pnum >> 2] = num;
  4259. return 0;
  4260. } catch (e) {
  4261. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4262. abort(e);
  4263. return e.errno;
  4264. }
  4265. }
  4266. function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
  4267. try {
  4268. var stream = SYSCALLS.getStreamFromFD(fd);
  4269. var HIGH_OFFSET = 4294967296;
  4270. var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0);
  4271. var DOUBLE_LIMIT = 9007199254740992;
  4272. if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
  4273. return -61;
  4274. }
  4275. FS.llseek(stream, offset, whence);
  4276. tempI64 = [stream.position >>> 0, (tempDouble = stream.position, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[newOffset >> 2] = tempI64[0], HEAP32[newOffset + 4 >> 2] = tempI64[1];
  4277. if (stream.getdents && offset === 0 && whence === 0)
  4278. stream.getdents = null;
  4279. return 0;
  4280. } catch (e) {
  4281. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4282. abort(e);
  4283. return e.errno;
  4284. }
  4285. }
  4286. function _fd_write(fd, iov, iovcnt, pnum) {
  4287. try {
  4288. var stream = SYSCALLS.getStreamFromFD(fd);
  4289. var num = SYSCALLS.doWritev(stream, iov, iovcnt);
  4290. HEAP32[pnum >> 2] = num;
  4291. return 0;
  4292. } catch (e) {
  4293. if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError))
  4294. abort(e);
  4295. return e.errno;
  4296. }
  4297. }
  4298. function _setTempRet0($i) {
  4299. setTempRet0($i | 0);
  4300. }
  4301. function __isLeapYear(year) {
  4302. return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
  4303. }
  4304. function __arraySum(array, index) {
  4305. var sum = 0;
  4306. for (var i = 0; i <= index; sum += array[i++]) {
  4307. }
  4308. return sum;
  4309. }
  4310. var __MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  4311. var __MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  4312. function __addDays(date, days) {
  4313. var newDate = new Date(date.getTime());
  4314. while (days > 0) {
  4315. var leap = __isLeapYear(newDate.getFullYear());
  4316. var currentMonth = newDate.getMonth();
  4317. var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth];
  4318. if (days > daysInCurrentMonth - newDate.getDate()) {
  4319. days -= daysInCurrentMonth - newDate.getDate() + 1;
  4320. newDate.setDate(1);
  4321. if (currentMonth < 11) {
  4322. newDate.setMonth(currentMonth + 1);
  4323. } else {
  4324. newDate.setMonth(0);
  4325. newDate.setFullYear(newDate.getFullYear() + 1);
  4326. }
  4327. } else {
  4328. newDate.setDate(newDate.getDate() + days);
  4329. return newDate;
  4330. }
  4331. }
  4332. return newDate;
  4333. }
  4334. function _strftime(s, maxsize, format, tm) {
  4335. var tm_zone = HEAP32[tm + 40 >> 2];
  4336. var date = {tm_sec: HEAP32[tm >> 2], tm_min: HEAP32[tm + 4 >> 2], tm_hour: HEAP32[tm + 8 >> 2], tm_mday: HEAP32[tm + 12 >> 2], tm_mon: HEAP32[tm + 16 >> 2], tm_year: HEAP32[tm + 20 >> 2], tm_wday: HEAP32[tm + 24 >> 2], tm_yday: HEAP32[tm + 28 >> 2], tm_isdst: HEAP32[tm + 32 >> 2], tm_gmtoff: HEAP32[tm + 36 >> 2], tm_zone: tm_zone ? UTF8ToString(tm_zone) : ""};
  4337. var pattern = UTF8ToString(format);
  4338. var EXPANSION_RULES_1 = {"%c": "%a %b %d %H:%M:%S %Y", "%D": "%m/%d/%y", "%F": "%Y-%m-%d", "%h": "%b", "%r": "%I:%M:%S %p", "%R": "%H:%M", "%T": "%H:%M:%S", "%x": "%m/%d/%y", "%X": "%H:%M:%S", "%Ec": "%c", "%EC": "%C", "%Ex": "%m/%d/%y", "%EX": "%H:%M:%S", "%Ey": "%y", "%EY": "%Y", "%Od": "%d", "%Oe": "%e", "%OH": "%H", "%OI": "%I", "%Om": "%m", "%OM": "%M", "%OS": "%S", "%Ou": "%u", "%OU": "%U", "%OV": "%V", "%Ow": "%w", "%OW": "%W", "%Oy": "%y"};
  4339. for (var rule in EXPANSION_RULES_1) {
  4340. pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]);
  4341. }
  4342. var WEEKDAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  4343. var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  4344. function leadingSomething(value, digits, character) {
  4345. var str = typeof value === "number" ? value.toString() : value || "";
  4346. while (str.length < digits) {
  4347. str = character[0] + str;
  4348. }
  4349. return str;
  4350. }
  4351. function leadingNulls(value, digits) {
  4352. return leadingSomething(value, digits, "0");
  4353. }
  4354. function compareByDay(date1, date2) {
  4355. function sgn(value) {
  4356. return value < 0 ? -1 : value > 0 ? 1 : 0;
  4357. }
  4358. var compare;
  4359. if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) {
  4360. if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) {
  4361. compare = sgn(date1.getDate() - date2.getDate());
  4362. }
  4363. }
  4364. return compare;
  4365. }
  4366. function getFirstWeekStartDate(janFourth) {
  4367. switch (janFourth.getDay()) {
  4368. case 0:
  4369. return new Date(janFourth.getFullYear() - 1, 11, 29);
  4370. case 1:
  4371. return janFourth;
  4372. case 2:
  4373. return new Date(janFourth.getFullYear(), 0, 3);
  4374. case 3:
  4375. return new Date(janFourth.getFullYear(), 0, 2);
  4376. case 4:
  4377. return new Date(janFourth.getFullYear(), 0, 1);
  4378. case 5:
  4379. return new Date(janFourth.getFullYear() - 1, 11, 31);
  4380. case 6:
  4381. return new Date(janFourth.getFullYear() - 1, 11, 30);
  4382. }
  4383. }
  4384. function getWeekBasedYear(date2) {
  4385. var thisDate = __addDays(new Date(date2.tm_year + 1900, 0, 1), date2.tm_yday);
  4386. var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4);
  4387. var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4);
  4388. var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
  4389. var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
  4390. if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) {
  4391. if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) {
  4392. return thisDate.getFullYear() + 1;
  4393. } else {
  4394. return thisDate.getFullYear();
  4395. }
  4396. } else {
  4397. return thisDate.getFullYear() - 1;
  4398. }
  4399. }
  4400. var EXPANSION_RULES_2 = {"%a": function(date2) {
  4401. return WEEKDAYS[date2.tm_wday].substring(0, 3);
  4402. }, "%A": function(date2) {
  4403. return WEEKDAYS[date2.tm_wday];
  4404. }, "%b": function(date2) {
  4405. return MONTHS[date2.tm_mon].substring(0, 3);
  4406. }, "%B": function(date2) {
  4407. return MONTHS[date2.tm_mon];
  4408. }, "%C": function(date2) {
  4409. var year = date2.tm_year + 1900;
  4410. return leadingNulls(year / 100 | 0, 2);
  4411. }, "%d": function(date2) {
  4412. return leadingNulls(date2.tm_mday, 2);
  4413. }, "%e": function(date2) {
  4414. return leadingSomething(date2.tm_mday, 2, " ");
  4415. }, "%g": function(date2) {
  4416. return getWeekBasedYear(date2).toString().substring(2);
  4417. }, "%G": function(date2) {
  4418. return getWeekBasedYear(date2);
  4419. }, "%H": function(date2) {
  4420. return leadingNulls(date2.tm_hour, 2);
  4421. }, "%I": function(date2) {
  4422. var twelveHour = date2.tm_hour;
  4423. if (twelveHour == 0)
  4424. twelveHour = 12;
  4425. else if (twelveHour > 12)
  4426. twelveHour -= 12;
  4427. return leadingNulls(twelveHour, 2);
  4428. }, "%j": function(date2) {
  4429. return leadingNulls(date2.tm_mday + __arraySum(__isLeapYear(date2.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date2.tm_mon - 1), 3);
  4430. }, "%m": function(date2) {
  4431. return leadingNulls(date2.tm_mon + 1, 2);
  4432. }, "%M": function(date2) {
  4433. return leadingNulls(date2.tm_min, 2);
  4434. }, "%n": function() {
  4435. return "\n";
  4436. }, "%p": function(date2) {
  4437. if (date2.tm_hour >= 0 && date2.tm_hour < 12) {
  4438. return "AM";
  4439. } else {
  4440. return "PM";
  4441. }
  4442. }, "%S": function(date2) {
  4443. return leadingNulls(date2.tm_sec, 2);
  4444. }, "%t": function() {
  4445. return " ";
  4446. }, "%u": function(date2) {
  4447. return date2.tm_wday || 7;
  4448. }, "%U": function(date2) {
  4449. var janFirst = new Date(date2.tm_year + 1900, 0, 1);
  4450. var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay());
  4451. var endDate = new Date(date2.tm_year + 1900, date2.tm_mon, date2.tm_mday);
  4452. if (compareByDay(firstSunday, endDate) < 0) {
  4453. var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
  4454. var firstSundayUntilEndJanuary = 31 - firstSunday.getDate();
  4455. var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
  4456. return leadingNulls(Math.ceil(days / 7), 2);
  4457. }
  4458. return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00";
  4459. }, "%V": function(date2) {
  4460. var janFourthThisYear = new Date(date2.tm_year + 1900, 0, 4);
  4461. var janFourthNextYear = new Date(date2.tm_year + 1901, 0, 4);
  4462. var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear);
  4463. var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear);
  4464. var endDate = __addDays(new Date(date2.tm_year + 1900, 0, 1), date2.tm_yday);
  4465. if (compareByDay(endDate, firstWeekStartThisYear) < 0) {
  4466. return "53";
  4467. }
  4468. if (compareByDay(firstWeekStartNextYear, endDate) <= 0) {
  4469. return "01";
  4470. }
  4471. var daysDifference;
  4472. if (firstWeekStartThisYear.getFullYear() < date2.tm_year + 1900) {
  4473. daysDifference = date2.tm_yday + 32 - firstWeekStartThisYear.getDate();
  4474. } else {
  4475. daysDifference = date2.tm_yday + 1 - firstWeekStartThisYear.getDate();
  4476. }
  4477. return leadingNulls(Math.ceil(daysDifference / 7), 2);
  4478. }, "%w": function(date2) {
  4479. return date2.tm_wday;
  4480. }, "%W": function(date2) {
  4481. var janFirst = new Date(date2.tm_year, 0, 1);
  4482. var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1);
  4483. var endDate = new Date(date2.tm_year + 1900, date2.tm_mon, date2.tm_mday);
  4484. if (compareByDay(firstMonday, endDate) < 0) {
  4485. var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31;
  4486. var firstMondayUntilEndJanuary = 31 - firstMonday.getDate();
  4487. var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate();
  4488. return leadingNulls(Math.ceil(days / 7), 2);
  4489. }
  4490. return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00";
  4491. }, "%y": function(date2) {
  4492. return (date2.tm_year + 1900).toString().substring(2);
  4493. }, "%Y": function(date2) {
  4494. return date2.tm_year + 1900;
  4495. }, "%z": function(date2) {
  4496. var off = date2.tm_gmtoff;
  4497. var ahead = off >= 0;
  4498. off = Math.abs(off) / 60;
  4499. off = off / 60 * 100 + off % 60;
  4500. return (ahead ? "+" : "-") + String("0000" + off).slice(-4);
  4501. }, "%Z": function(date2) {
  4502. return date2.tm_zone;
  4503. }, "%%": function() {
  4504. return "%";
  4505. }};
  4506. for (var rule in EXPANSION_RULES_2) {
  4507. if (pattern.indexOf(rule) >= 0) {
  4508. pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date));
  4509. }
  4510. }
  4511. var bytes = intArrayFromString(pattern, false);
  4512. if (bytes.length > maxsize) {
  4513. return 0;
  4514. }
  4515. writeArrayToMemory(bytes, s);
  4516. return bytes.length - 1;
  4517. }
  4518. function _strftime_l(s, maxsize, format, tm) {
  4519. return _strftime(s, maxsize, format, tm);
  4520. }
  4521. var FSNode = function(parent, name, mode, rdev) {
  4522. if (!parent) {
  4523. parent = this;
  4524. }
  4525. this.parent = parent;
  4526. this.mount = parent.mount;
  4527. this.mounted = null;
  4528. this.id = FS.nextInode++;
  4529. this.name = name;
  4530. this.mode = mode;
  4531. this.node_ops = {};
  4532. this.stream_ops = {};
  4533. this.rdev = rdev;
  4534. };
  4535. var readMode = 292 | 73;
  4536. var writeMode = 146;
  4537. Object.defineProperties(FSNode.prototype, {read: {get: function() {
  4538. return (this.mode & readMode) === readMode;
  4539. }, set: function(val) {
  4540. val ? this.mode |= readMode : this.mode &= ~readMode;
  4541. }}, write: {get: function() {
  4542. return (this.mode & writeMode) === writeMode;
  4543. }, set: function(val) {
  4544. val ? this.mode |= writeMode : this.mode &= ~writeMode;
  4545. }}, isFolder: {get: function() {
  4546. return FS.isDir(this.mode);
  4547. }}, isDevice: {get: function() {
  4548. return FS.isChrdev(this.mode);
  4549. }}});
  4550. FS.FSNode = FSNode;
  4551. FS.staticInit();
  4552. Module["FS_createPath"] = FS.createPath;
  4553. Module["FS_createDataFile"] = FS.createDataFile;
  4554. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  4555. Module["FS_createLazyFile"] = FS.createLazyFile;
  4556. Module["FS_createDevice"] = FS.createDevice;
  4557. Module["FS_unlink"] = FS.unlink;
  4558. InternalError = Module["InternalError"] = extendError(Error, "InternalError");
  4559. embind_init_charCodes();
  4560. BindingError = Module["BindingError"] = extendError(Error, "BindingError");
  4561. init_ClassHandle();
  4562. init_RegisteredPointer();
  4563. init_embind();
  4564. UnboundTypeError = Module["UnboundTypeError"] = extendError(Error, "UnboundTypeError");
  4565. init_emval();
  4566. function intArrayFromString(stringy, dontAddNull, length) {
  4567. var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1;
  4568. var u8array = new Array(len);
  4569. var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  4570. if (dontAddNull)
  4571. u8array.length = numBytesWritten;
  4572. return u8array;
  4573. }
  4574. __ATINIT__.push({func: function() {
  4575. ___wasm_call_ctors();
  4576. }});
  4577. var asmLibraryArg = {t: ___assert_fail, E: ___sys_ioctl, F: ___sys_open, u: __embind_finalize_value_array, j: __embind_finalize_value_object, H: __embind_register_bool, m: __embind_register_class, l: __embind_register_class_constructor, d: __embind_register_class_function, G: __embind_register_emval, q: __embind_register_float, i: __embind_register_function, f: __embind_register_integer, e: __embind_register_memory_view, r: __embind_register_std_string, n: __embind_register_std_wstring, v: __embind_register_value_array, c: __embind_register_value_array_element, k: __embind_register_value_object, g: __embind_register_value_object_field, I: __embind_register_void, J: __emval_decref, K: __emval_incref, s: __emval_take_value, b: _abort, C: _clock_gettime, y: _emscripten_memcpy_big, h: _emscripten_resize_heap, A: _environ_get, B: _environ_sizes_get, p: _fd_close, D: _fd_read, w: _fd_seek, o: _fd_write, a: wasmMemory, x: _setTempRet0, z: _strftime_l};
  4578. var asm = createWasm();
  4579. var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() {
  4580. return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["M"]).apply(null, arguments);
  4581. };
  4582. var _main = Module["_main"] = function() {
  4583. return (_main = Module["_main"] = Module["asm"]["N"]).apply(null, arguments);
  4584. };
  4585. var ___getTypeName = Module["___getTypeName"] = function() {
  4586. return (___getTypeName = Module["___getTypeName"] = Module["asm"]["O"]).apply(null, arguments);
  4587. };
  4588. var ___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = function() {
  4589. return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["P"]).apply(null, arguments);
  4590. };
  4591. var ___errno_location = Module["___errno_location"] = function() {
  4592. return (___errno_location = Module["___errno_location"] = Module["asm"]["Q"]).apply(null, arguments);
  4593. };
  4594. var _free = Module["_free"] = function() {
  4595. return (_free = Module["_free"] = Module["asm"]["R"]).apply(null, arguments);
  4596. };
  4597. var _malloc = Module["_malloc"] = function() {
  4598. return (_malloc = Module["_malloc"] = Module["asm"]["S"]).apply(null, arguments);
  4599. };
  4600. var dynCall_jiji = Module["dynCall_jiji"] = function() {
  4601. return (dynCall_jiji = Module["dynCall_jiji"] = Module["asm"]["T"]).apply(null, arguments);
  4602. };
  4603. var dynCall_viijii = Module["dynCall_viijii"] = function() {
  4604. return (dynCall_viijii = Module["dynCall_viijii"] = Module["asm"]["U"]).apply(null, arguments);
  4605. };
  4606. var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = function() {
  4607. return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = Module["asm"]["V"]).apply(null, arguments);
  4608. };
  4609. var dynCall_iiiiij = Module["dynCall_iiiiij"] = function() {
  4610. return (dynCall_iiiiij = Module["dynCall_iiiiij"] = Module["asm"]["W"]).apply(null, arguments);
  4611. };
  4612. var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = function() {
  4613. return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = Module["asm"]["X"]).apply(null, arguments);
  4614. };
  4615. Module["addRunDependency"] = addRunDependency;
  4616. Module["removeRunDependency"] = removeRunDependency;
  4617. Module["FS_createPath"] = FS.createPath;
  4618. Module["FS_createDataFile"] = FS.createDataFile;
  4619. Module["FS_createPreloadedFile"] = FS.createPreloadedFile;
  4620. Module["FS_createLazyFile"] = FS.createLazyFile;
  4621. Module["FS_createDevice"] = FS.createDevice;
  4622. Module["FS_unlink"] = FS.unlink;
  4623. var calledRun;
  4624. function ExitStatus(status) {
  4625. this.name = "ExitStatus";
  4626. this.message = "Program terminated with exit(" + status + ")";
  4627. this.status = status;
  4628. }
  4629. var calledMain = false;
  4630. dependenciesFulfilled = function runCaller() {
  4631. if (!calledRun)
  4632. run();
  4633. if (!calledRun)
  4634. dependenciesFulfilled = runCaller;
  4635. };
  4636. function callMain(args) {
  4637. var entryFunction = Module["_main"];
  4638. var argc = 0;
  4639. var argv = 0;
  4640. try {
  4641. var ret = entryFunction(argc, argv);
  4642. exit(ret, true);
  4643. } catch (e) {
  4644. if (e instanceof ExitStatus) {
  4645. return;
  4646. } else if (e == "unwind") {
  4647. noExitRuntime = true;
  4648. return;
  4649. } else {
  4650. var toLog = e;
  4651. if (e && typeof e === "object" && e.stack) {
  4652. toLog = [e, e.stack];
  4653. }
  4654. err("exception thrown: " + toLog);
  4655. quit_(1, e);
  4656. }
  4657. } finally {
  4658. calledMain = true;
  4659. }
  4660. }
  4661. function run(args) {
  4662. args = args || arguments_;
  4663. if (runDependencies > 0) {
  4664. return;
  4665. }
  4666. preRun();
  4667. if (runDependencies > 0)
  4668. return;
  4669. function doRun() {
  4670. if (calledRun)
  4671. return;
  4672. calledRun = true;
  4673. Module["calledRun"] = true;
  4674. if (ABORT)
  4675. return;
  4676. initRuntime();
  4677. preMain();
  4678. readyPromiseResolve(Module);
  4679. if (Module["onRuntimeInitialized"])
  4680. Module["onRuntimeInitialized"]();
  4681. if (shouldRunNow)
  4682. callMain(args);
  4683. postRun();
  4684. }
  4685. if (Module["setStatus"]) {
  4686. Module["setStatus"]("Running...");
  4687. setTimeout(function() {
  4688. setTimeout(function() {
  4689. Module["setStatus"]("");
  4690. }, 1);
  4691. doRun();
  4692. }, 1);
  4693. } else {
  4694. doRun();
  4695. }
  4696. }
  4697. Module["run"] = run;
  4698. function exit(status, implicit) {
  4699. if (implicit && noExitRuntime && status === 0) {
  4700. return;
  4701. }
  4702. if (noExitRuntime) {
  4703. } else {
  4704. EXITSTATUS = status;
  4705. exitRuntime();
  4706. if (Module["onExit"])
  4707. Module["onExit"](status);
  4708. ABORT = true;
  4709. }
  4710. quit_(status, new ExitStatus(status));
  4711. }
  4712. if (Module["preInit"]) {
  4713. if (typeof Module["preInit"] == "function")
  4714. Module["preInit"] = [Module["preInit"]];
  4715. while (Module["preInit"].length > 0) {
  4716. Module["preInit"].pop()();
  4717. }
  4718. }
  4719. var shouldRunNow = true;
  4720. if (Module["noInitialRun"])
  4721. shouldRunNow = false;
  4722. noExitRuntime = true;
  4723. run();
  4724. return WebIFCWasm3.ready;
  4725. };
  4726. }();
  4727. if (typeof exports === "object" && typeof module === "object")
  4728. module.exports = WebIFCWasm2;
  4729. else if (typeof define === "function" && define["amd"])
  4730. define([], function() {
  4731. return WebIFCWasm2;
  4732. });
  4733. else if (typeof exports === "object")
  4734. exports["WebIFCWasm"] = WebIFCWasm2;
  4735. });
  4736. // dist/web-ifc-api.ts
  4737. var WebIFCWasm = require_web_ifc();
  4738. function ms() {
  4739. return new Date().getTime();
  4740. }
  4741. var IfcAPI = class {
  4742. constructor() {
  4743. this.wasmModule = void 0;
  4744. }
  4745. async Init() {
  4746. if (WebIFCWasm) {
  4747. this.wasmModule = await WebIFCWasm({noInitialRun: true});
  4748. } else {
  4749. console.error(`Could not find wasm module at './web-ifc' from web-ifc-api.ts`);
  4750. }
  4751. }
  4752. OpenModel(filename, data) {
  4753. this.wasmModule["FS_createDataFile"]("/", "filename", data, true, true, true);
  4754. console.log("Wrote file");
  4755. let result = this.wasmModule.OpenModel(filename);
  4756. this.wasmModule["FS_unlink"]("/filename");
  4757. return result;
  4758. }
  4759. GetGeometry(modelID, geometryExpressID) {
  4760. return this.wasmModule.GetGeometry(modelID, geometryExpressID);
  4761. }
  4762. SetGeometryTransformation(modelID, transformationMatrix) {
  4763. if (transformationMatrix.length != 16) {
  4764. console.log(`Bad transformation matrix size: ${transformationMatrix.length}`);
  4765. return;
  4766. }
  4767. this.wasmModule.SetGeometryTransformation(modelID, transformationMatrix);
  4768. }
  4769. GetVertexArray(ptr, size) {
  4770. return this.getSubArray(this.wasmModule.HEAPF32, ptr, size);
  4771. }
  4772. GetIndexArray(ptr, size) {
  4773. return this.getSubArray(this.wasmModule.HEAPU32, ptr, size);
  4774. }
  4775. getSubArray(heap, startPtr, sizeBytes) {
  4776. return heap.subarray(startPtr / 4, startPtr / 4 + sizeBytes).slice(0);
  4777. }
  4778. CloseModel(modelID) {
  4779. this.wasmModule.CloseModel(modelID);
  4780. }
  4781. IsModelOpen(modelID) {
  4782. return this.wasmModule.IsModelOpen(modelID);
  4783. }
  4784. LoadAllGeometry(modelID) {
  4785. return this.wasmModule.LoadAllGeometry(modelID);
  4786. }
  4787. };
  4788. export {
  4789. IfcAPI,
  4790. ms
  4791. };