web-ifc-api.js 182 KB

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