From 00fd8b0a87add14bfe249e101dfde96f198cd5ed Mon Sep 17 00:00:00 2001 From: neurolabusc Date: Mon, 29 Jul 2024 08:49:16 -0700 Subject: [PATCH] Add nii2mesh features --- index.html | 56 +++++++++++++++++++++- main.js | 101 ++++++++++++++++++++++++++++++++++++++- package-lock.json | 25 ++++++++-- package.json | 2 +- public/nii2mesh.js | 1 + public/nii2mesh.wasm | Bin 0 -> 140142 bytes public/nii2meshWorker.js | 55 +++++++++++++++++++++ 7 files changed, 231 insertions(+), 9 deletions(-) create mode 100644 public/nii2mesh.js create mode 100644 public/nii2mesh.wasm create mode 100644 public/nii2meshWorker.js diff --git a/index.html b/index.html index e1d3265..a0c1501 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,11 @@   - + + + + +   @@ -27,7 +31,55 @@ + +
+

+ + +

+

+ + +

+

+ + +

+

+ + +

+

+ + +

+ + +
+
+ +
+

+ +

+ + +
+
- \ No newline at end of file diff --git a/main.js b/main.js index 1f91454..5936bf3 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,104 @@ -import { Niivue } from '@niivue/niivue' +import { Niivue, NVMeshUtilities } from '@niivue/niivue' // IMPORTANT: we need to import this specific file. import * as ort from "./node_modules/onnxruntime-web/dist/ort.all.mjs" + async function main() { + function removeExtension(filename) { + if (filename.endsWith('.gz')) { + filename = filename.slice(0, -3) + } + let lastDotIndex = filename.lastIndexOf('.') + if (lastDotIndex !== -1) { + filename = filename.slice(0, lastDotIndex) + } + return filename + } + const Nii2meshWorker = await new Worker('./nii2meshWorker.js') + let startTime = Date.now() + function meshStatus(isTimed = true) { + let str = `Mesh has ${nv1.meshes[0].pts.length / 3} vertices and ${nv1.meshes[0].tris.length / 3} triangles` + if (isTimed) + str += ` ${Date.now() - startTime}ms` + document.getElementById('intensity').innerHTML = str + } + async function loadMz3(meshBuffer) { + if (nv1.meshes.length > 0) { + nv1.removeMesh(nv1.meshes[0]) + } + await nv1.loadFromArrayBuffer(meshBuffer, 'test.mz3') + // TODO: we should not have to reverse faces + // Check determinant for conformed image + nv1.reverseFaces(0) + loadingCircle.classList.add('hidden') + meshStatus(true) + } + Nii2meshWorker.onmessage = async function (e) { + if (e.data.blob instanceof Blob) { + var reader = new FileReader() + reader.onload = () => { + loadMz3(reader.result) + } + reader.readAsArrayBuffer(e.data.blob) + } + } + applyBtn.onclick = async function () { + if (nv1.volumes.length < 2) { + return + } + startTime = Date.now() + loadingCircle.classList.remove('hidden') + const niiBuffer = await nv1.saveImage({volumeByIndex: 1}).buffer + let nii = await new Blob([niiBuffer], { + type: 'application/octet-stream' + }) + let inName = removeExtension(nv1.volumes[0].name) + '.nii' + let fileNii = await new File([nii], inName) + let outName = removeExtension(nv1.volumes[0].name) + '.mz3' + const isoValue = Number(isoNumber.value) + const largestCheckValue = largestCheck.checked + const bubbleCheckValue = bubbleCheck.checked + const shrinkValue = Math.min(Math.max(Number(shrinkPct.value) / 100, 0.01), 1) + const smoothValue = smoothSlide.value + Nii2meshWorker.postMessage({ + blob: fileNii, + percentage: shrinkValue, + simplify_name: outName, + isoValue: isoValue, + onlyLargest: largestCheckValue, + fillBubbles: bubbleCheckValue, + postSmooth: smoothValue + }) + } + createMeshBtn.onclick = function () { + if (nv1.volumes.length < 2) { + window.alert("Segmented image not loaded. Press the 'Segment' button.") + } else { + remeshDialog.show() + } + } + meshCheck.onchange = function () { + nv1.setMeshProperty(nv1.meshes[0].id, 'visible', this.checked) + } + saveMeshBtn.onclick = function () { + if (nv1.meshes.length < 1) { + window.alert("No mesh open for saving. Use 'Create Mesh'.") + } else { + saveDialog.show() + } + } + applySaveBtn.onclick = function () { + if (nv1.meshes.length < 1) { + return + } + let format = 'obj' + if (formatSelect.selectedIndex === 0) { + format = 'mz3' + } + if (formatSelect.selectedIndex === 2) { + format = 'stl' + } + NVMeshUtilities.saveMesh(nv1.meshes[0].pts, nv1.meshes[0].tris, `mesh.${format}`, true) + } clipCheck.onchange = function () { if (clipCheck.checked) { nv1.setClipPlane([0, 0, 90]) @@ -50,6 +147,7 @@ async function main() { window.alert('Please open a voxel-based image') return } + startTime = Date.now() loadingCircle.classList.remove('hidden') await closeAllOverlays() await ensureConformed() @@ -118,6 +216,7 @@ async function main() { segmentImg.opacity = opacitySlider1.value / 255 await nv1.addVolume(segmentImg) loadingCircle.classList.add('hidden') + document.getElementById('intensity').innerHTML = ` ${Date.now() - startTime}ms` } function handleLocationChange(data) { document.getElementById("intensity").innerHTML = data.string diff --git a/package-lock.json b/package-lock.json index ca0dd8b..33e9370 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "niivue-brainchop", "version": "0.1.0", "dependencies": { - "@niivue/niivue": "^0.43.3", + "@niivue/niivue": "^0.44.2", "onnxruntime-web": "^1.19.0-dev.20240713-281ed8c12d" }, "devDependencies": { @@ -403,9 +403,10 @@ } }, "node_modules/@niivue/niivue": { - "version": "0.43.3", - "resolved": "https://registry.npmjs.org/@niivue/niivue/-/niivue-0.43.3.tgz", - "integrity": "sha512-pACuepFYebkSPq6qR6171Qz9VnKyz+7ZdgBs5gJ8a9ewdLi0O4SjenJuPw0d8NZDuLEIZp0PVeWbHfeuFae1pg==", + "version": "0.44.2", + "resolved": "https://registry.npmjs.org/@niivue/niivue/-/niivue-0.44.2.tgz", + "integrity": "sha512-ddShcApln/xJQa1dIo7DPpcRPoabBA6n7Wy8gtwA1S6srhZn2PdaPep1VEqdS82ufbFier0SRFE4lVzt7/ZDKw==", + "license": "BSD-2-Clause", "dependencies": { "@lukeed/uuid": "^2.0.1", "@ungap/structured-clone": "^1.2.0", @@ -417,9 +418,22 @@ "rxjs": "^7.8.1" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.13.2" + "@rollup/rollup-linux-x64-gnu": "^4.18.1" } }, + "node_modules/@niivue/niivue/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -634,6 +648,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" diff --git a/package.json b/package.json index 5c42b9d..56fb33a 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "preview": "vite preview" }, "dependencies": { - "@niivue/niivue": "^0.43.3", + "@niivue/niivue": "^0.44.2", "onnxruntime-web": "^1.19.0-dev.20240713-281ed8c12d" }, "devDependencies": { diff --git a/public/nii2mesh.js b/public/nii2mesh.js new file mode 100644 index 0000000..f7877d4 --- /dev/null +++ b/public/nii2mesh.js @@ -0,0 +1 @@ +var Module=typeof Module!="undefined"?Module:{};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}process.on("uncaughtException",ex=>{if(ex!=="unwind"&&!(ex instanceof ExitStatus)&&!(ex.context instanceof ExitStatus)){throw ex}});quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[Emscripten Module object]"}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");var wasmBinaryFile;wasmBinaryFile="nii2mesh.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}else if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["o"];updateMemoryViews();addOnInit(wasmExports["p"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);return false}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var demangle=func=>{demangle.recursionGuard=(demangle.recursionGuard|0)+1;if(demangle.recursionGuard>1)return func;return withStackSave(()=>{try{var s=func;if(s.startsWith("__Z"))s=s.substr(1);var buf=stringToUTF8OnStack(s);var status=stackAlloc(4);var ret=___cxa_demangle(buf,0,0,status);if(HEAP32[status>>2]===0&&ret){return UTF8ToString(ret)}}catch(e){}finally{_free(ret);if(demangle.recursionGuard<2)--demangle.recursionGuard}return func})};var noExitRuntime=Module["noExitRuntime"]||true;var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){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}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i0,ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.getp();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.getp();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.getp();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.getp();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.getp();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=1;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var _abort=()=>{abort("")};var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createDataFile"]=FS.createDataFile;Module["FS_readFile"]=FS.readFile;Module["FS_unlink"]=FS.unlink;var wasmImports={m:___syscall_faccessat,b:___syscall_fcntl64,e:___syscall_ioctl,f:___syscall_openat,h:__emscripten_get_now_is_monotonic,j:_abort,g:_emscripten_get_now,l:_emscripten_memcpy_js,k:_emscripten_resize_heap,n:_exit,a:_fd_close,d:_fd_read,i:_fd_seek,c:_fd_write};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["p"])();var _free=a0=>(_free=wasmExports["q"])(a0);var _simplify=Module["_simplify"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_simplify=Module["_simplify"]=wasmExports["r"])(a0,a1,a2,a3,a4,a5,a6,a7);var ___errno_location=()=>(___errno_location=wasmExports["s"])();var stackSave=()=>(stackSave=wasmExports["u"])();var stackRestore=a0=>(stackRestore=wasmExports["v"])(a0);var stackAlloc=a0=>(stackAlloc=wasmExports["w"])(a0);var ___cxa_demangle=(a0,a1,a2,a3)=>(___cxa_demangle=wasmExports["x"])(a0,a1,a2,a3);Module["FS_readFile"]=FS.readFile;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_unlink"]=FS.unlink;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); diff --git a/public/nii2mesh.wasm b/public/nii2mesh.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e153df1ea590de4c50d98f9b30e9af8ecc940708 GIT binary patch literal 140142 zcmeFadz>a$RqtK9>bZ5-^K?J`OwT3L6H-;V&_gmXNXU)A^bWZVA&}P#C%)=&5Pik& zDCx-%a?Y7#8i*1-h!MguAWEkRCSanR10Ff=fj6T@4H_|CU%Z2&Mg@$3h=S(*{?^|0 zTza~>`0;$+_m6ijPgU*Om$lbkYwfkxUVB&a(wn~9B}wA`Z}*fV>4_7Ge%y&8PCwa+ zc%K|;aH}M{CP$ijB(riPM_Ts8O`??BPPp5SB;*a5xJggk#&0|1QZ20$$MwJ+73f{! zj@PwVB6R@6t?t$%?l`YP>&K6zmfoNVy{{_-=Hn;G)rk!NNaw_@{N16Fj;#xC2r}H}-yObky%^7mI-N_#3(kxB0MkjU2bjqvr zG~Vzo>yh5v+nUxxGvSQ}g=!nqS(0UL)+O13Yo)VU(r)dW>a?aCNn_5nn=Wf7u9Gxe z+H!N00SZUs&4#l-O`g(bGwJ6vo8_lZwOg(BRHoX;{y34qm-(aWlqI!%bTT}5w=32F z{%)h~Zgh|Hx7l`XEnQnnTOCNtKlU@Ny#0)6_XTmf z*bV-~4L<4yA9I60b%Q^1gD2eJU))3>|9+tMFR z2S28}x2Hdz4%XAb_ojpIO9vl!gFknJyWHR}+~6gWqz4H^a!k>wd@mwi|rJ z4gS^*{>}|PtvsJ~pV8aTxxaUVf1nfYjp>~!m%Gw8rGq!qwj12-?smWAPP(6SKko*= z=pJ^z;HH1{9j$xP`J_k+cR^~G{^A8`qe$|nCq>#=;zip3k43Vmmy2m*xo{+udr8-0 zkuH-vC;Ry>J&}@~j8$syuIy3vKtj#_Nw<1ckD)Cy)#n|BlDx?B2jPPg%Dh%oDb-aO znP->%jjNSgt{VRHXS^5?od3so?JW0qRml~NrT#UPr$kb^BJqhq9C|?8))C)Xp3VJQ zL4mX`U=0C78cL)^7W$lC005i7ST5;SS~OHO8JDRqZ_(-gj{K9kYg=EhpofX?tf<4j zv7)X!f6Ho>ESF7i;k;WVhx6I$6+O^q09TIe{^55C_`{^~ez{E2rF6+ZVu?k1mG${a zcP&@4b-@akPSv=wvE<+Pu2lai?Qc`nH@|9?PIQ}j(NK4~MJAX#T|vK??kQWL-EQSn ztT}lvVBZ%WvZbO?wu_A34KrHD^tN!8y~lvGh1aB; z=0#J3sgC>Xs$S|p@UA#4O+da4fQ3`&;i&GKHew7GgP9jCkP7aAVPBQ`^qBwnPo@F5 zBBlTI(g@Y{oPR&4;D10x7VtpZE#LR^MGL4Xu>iqpkR2nC)8*C$>7Lj@Dl-)HK^b}W z7{cb&ak2|H^P?9<^TnjbUO9#n7{gyWl&*p`|7aM!rUr@o0-{R%NkHU3AQs7TWt2JU zcp69is$NSNGUO@AZoo&R2dk0$P@^*Pf9o0(_%UJ=xNcdc(UQ)S>8W zqNQf2M6?uXcyFlh6q;&|NJTV7`AAdEe>F{QK|8|^L&g*ILwl#tj}ZCQ(NA-0`U#ym zm3~Oyj(%!l9|8<-h4GbOtodUWNg4+$Vfg$XGI5j$*2wWNgd;_Av&NDliapM0_{vPk?n{O{cSortEJ5m}(w9b56w zTP`IU#0dL}^s?ka_-V+H0A=(a`43SI#~iEL1{FLBn%e;?quKz$9zmG+)2PPXyy5}e zpK;Z~F@OPVm_J)8oWxMWDECU_Pv%d*xuj+QA{VUh8>`Dz8w#R8<`t?6H zX+p{~lBQq#XtqjihgN~Gb0?KaJ|{uKBT7bK`?XPHU(-&Ibdrz#Llmlb#1 z7pB$J7t1u@@((Y%`~)rbSE}i=k}zQ7zx3y`5)3tUAvj6Omks?sKfF-UhnuV9W|QO% z2Alynag#^{VU~IZ+!=|2U*|s#t=g!Jix-6PZABVHvj#)B?gF!>D5#Z=1Y%WPRA}>o zLx@#QGyzp9r8~`p5`|vXzLrUoj;BkWky9xUvU0R=JgmN4kir}RD&7yF0!bsGXHdCU ztyatiSObD9@=1UTbVgXXTdq0)s=gM@6%o1tNspJ+i==2X2<;KGMy@W?^aRZ~UWr}N z00N#F;8tLa5xYYFfiRipC)icJ6H`^vcr{Ikcbc&E|j3LlyI^6aZfo#DwTJu#`q*a zir5Uex?z+%-6;xa5)gBTM#-e+d(yyA9h?*kS0biB>o6npY{TA)b;&L!?*zpHEO7s{Q+s0Inv4iYS_v0EduRb)~a9O_Z4$^;Ymbku=JC0WRC6)lZB z5>7%*U3FJ3@Upc)8>u87*r)R<&^Q`kXh8FA(Knrk<~yjG!e%l)@+J7Pfz6i2hZZSv zxTHOea2Q;~=>qUE{50J-Q8+LQV7Z|jo{%1t)w)J=Mg3t!_MiwhbknV*s1CJ&aXAac zK)KyEm5jz!R2N26Acr9i1ki#2#wdk$0(k^I%?O|s2%t442pW=HVG1pil)8<8eP0%X zu`TEuGOO$sF{?(;q>Q+a{tVf?F)4Bwuay6cxTa^2k6&(j@C}QgBXiwlhgK2>o|Md^TEeX}$Wj7+eyB|z1J8>a(-^tC| z`Wk;4dL(Nx?YqmEP5vYA{+)L>ZxR6O57GnOJn=xhSu1jxRp7E<{;QXqdlX-+8v?7jCDg;Vv0kkU-oxlxnf(DfMgUdzB z6r(c5jEVz58ASJrfJs+YtF-S!_LPQEjG>ocNu9vn$qnbAi$;7y;-0y#??qDlQh|y} zj)hB+UaKeSMJP1=;xdo9Iu<*puGvUFZZ#H(sEvEm^ffTS^r$kD>oEvDWQ6HxqiQTm zn;K$Yy$Tj+l?b^2upj|Lnr5KHPR%MJZgjfB@fyDxm;XDQ@V`dt-CO`0mMgi95 zdq#iDM$PPKKwpv=GC~4gi}adtd_u-hi3_6>SO;V|qe6seJu(i{89F?W2yD&G^>C(3 z5T8i4a^?`xJrWCb@tQb;cWi#z4xgqsY{qA2C>^)NCoMMoQ;UWWwd|h(MnGf6%#2>> zJgTwO@h?7*N;gFTx6avpN2xq_q>gSuMK!sQWev6KCY5QwN#2)PVFD zP#!MOi2NkjP1aDfn^N?L)a<5B`h$dtmEBil!EQ=weL{9qt*gjpLV<0K*-TM2RPzQ` zimCwxnz57wRRd0d4$1~-!^09)w^U*@k+CE!qB;bAk+CE{NYxNB(MhnB1RDL>!zFf- zOGiE%`X)^Bms$h6(7(u)SY3#wsGyVRj4b3$DB8;v`c{jM1v$i+LHnY%rU+n?w~VbM z`hsQ;iH9jX6q1f>g_w0~%_9mw8j6L0uo=7@n#427HwJgrJDK+y|8gqTO>lbfz67ZZ%7=u4@pouDmjw6Oc;|=bFkx=)ZvO{Iy%BmSxctVYviYV_;<&ob}1^aj)nOMX- zwa&{Fhs3LO-V~JwGmW>xJ=rx}jiB;?p+p2F%~rL`uYt=c`o%QE80wHPhFX?2L|>7{ zKOzgWm0OaNIHkc1i!MkOeKrj05DE%!KsKOKB}fw^YM|(=GH*ofchEnT#z- z+77xU+D|NEEN|ki13g+169-Y)VPFMsrE0$xvqd^BxBp6=7LoZLXz`%L07Q(CNzn)c zA=BG^AhsrC-~*}RU{EbWNdqBc`rTF}nChCsB&Bfv;N5MDiW{QhklCmh+ekPFc$6#< zUEtDC9;ldfGkJN|i~0HmFlByL3ZL9B*!w6kHs=En4<-(W;)*=A801d6LKbOU8iEOK zQljYDj>fZ1J^=<~tGNiUMdMtemr9orjl=ju8qc8dY)cwPbXa$XKD;5$1C4`Vr)j7; zoQ9f3$Dj!VVRCTWX{ZTtH;2S+leJAlCal9W)HLF@X{Z^dAvy$cTUX?Ti~Un?$B5ff z4TLd=9i5M;fVdlhxSfb7bB9A)i6O)=(C$iia9S*9CxPGMUp}TizL;i?U9qo zj8SO;at+rmCS>f;$;AC;f?`CBc4`s9pbMEneAp~(C^CB&DIu~k{N|XJefblU{M|*` z8Tv3ABsC;K_N7buTQs!(_iy)CY=_u1?vtkh|HOeLLCobRaZCPOvNChYp7JTX%d^iY z%Q7iXD^Fi2_Z553N_dQanptD8V{X1RHC^W2**@9Yon0>N&Fm~iGY}vKmruc9(|Y82!P>9A?Go-z$OIZdlESoY}+;gbEx6HavolO1f=UD1Flc|6H zTuVKBGWD~UTI!~HKN(WboXq<-A+?%J{lX5y7XroJgacE(t0@Jc(8mA@Oy zs^6b8i^2cEbNVy;v!s8a{AEUX-KUI|Bl|m_XDy#TnfkVnx^FV|jUjbmEOpzKzyEos zw7hq$94$Zc3yC#-+F0_o)jdS!%{@V4jF01o173EIrEXi@_Z~W>wq0Z8fNm{N#m>pp z--s~JPbUA;!=WoX#*@uihaJ&>f#%9RSM-pv0G#!oEh~9nml%^T!{A2S-WektAV?*0 z>#xHDPdi;)*=yCz$rZLFT&8TamDW9dwk$inshQJHNA@)R&r_z^EDAsfFs3pm>E~a@ z9z}Ahlm9R#M{22)KNpiDxzx!Ynjn{u8hn+sko2Eo9e4d_oBrVcB1H8hA$}c3auCcFsx_37}hhddb*=}hIvqbq;8Bx99X+h>>Jgf*^0F4!U|y8 z)p{~d0o@{?-6A0Dw<~(kFz-b3{Z|F{wg?QNpY=k}p9&*CXOyoxq%9~(v+`C*uPK-% z+AR>?js3+HJH(2*0Yx`u8`s!i$jz)7!!D+>e3MXyxL~5=4HkpcfBeTYjFtY16U}WY zJyG@&L-vukYsiEaQ)JR^FCX<%>qCkEwb0MKG+z%Yoi$VsQ>f}x)I%mcY5q)wSN6230+5&6plKv=u^&io zCu{{IYjlv{ktMRo62=Z6O0FUYMWL3jsZj9(Rh;{@xAiv&HP}>)KLQt;VPiqe`1Wm&B%vM9Fi1xzEb8CLY#* zMS@#F!%~ztnYd*^mLNA5tm%I`kU%z6LFR*42P^2k{!^9Iu z?%A%=Kia-hMpb&@4Xt59mDwpu2OJvKBauHnQSVi%_ zcxjZ}{gie{1MHn93mvN*{=WuY@51aNv-@~oEc^G?(q7Rkaw3nHc-wPrRK`l|S@v(0 zYGm_+O4#gR0MNou5Ay@B_3T*^*o&A=a3b8iS6E+6FSXl1*P;W0FD_!Cn>ULvcx&@K zpqPxQ3r)7X=bpgT;?AX&v$P6v4*_^Q6>Fm07ghi^JTARzSO6-Gnkc z6EHfA?xb%^hoN`Z)4TrW-brNM`yp-7AZl_QMx(^>K9 zD@!>CV#7A*VtAZ@*DJ;k+M&}QNgz79BV=(;mCgPc5kxZy_5V=x?3>_M{<9J=M zhp%BVo~K*Nj-LfbQbrS-0P&XL@G07tB=WF;baV@m?AWY$`&$fuwruI3(b3p2>cA7m zCdsuLD7e-fUVwZkbZiHdgw1;s) zl5|w({`3f8EIc*JhW{Gfbcc2U;@T9>q9gQUPDv?YUF^>hvCt*70e&S*O*`q%jX`~P zgxaWVe|9%ezuYhe=NG9!?%#y0!I>8HryyEGkMEo;dnaXYw6X}A$+E8Q-t9Q6uISBx zBH=1vgriD6=KF}*#7&FSy`DKvM!i0`vZ%u(gZLLcc%urVI_OZ8D&=%zM$qXZhD zQ6-ETeSIyaOa|1AswvR>EH(OihI`m3_?2N38-35?*67SBjmp^-2QoCOge@A?z|zEc zPeVUx{DQ3-SDdg7?huCczcLswpiP=Escs<{&8m!oagPKe_(w9%FylIZdpeSg+%s~L zjOxJd3bhstp*O1otiifv|5`aOB=v5wG5$Pqb*CbwCYo(c$YaWDsD%;S=3oTJd}#Z# z@MA5Nxu?dKwJls#Ab$0dG(g$(&kX}SMpHo33($;_)+a*ynyw6Q5FXVNC^h}1#@S}xQ^#4l_$lKorPnPxrNz^~f<(~71%`xqicLzJ?Z-T|3h)tgcX zSSU9fDkdzeh=jm}V+o8KvOo!=&JU?;LI4F>5UH%`pM5Gd1;UvW4flT1=m!N}Fqrib z=tq%w6QV&0BN&GA$V5XBerhp@h$xpX4$zFz5RIQo!*_nlU=U)65LFv66x0DcQWJn8 z*Yp$M64pmx3`u#PB$U7iK0i!GJEsmT@o1n>jjOA9VpNS4h9Q)X02u3D zYWd8;6=GHT?^VrhQo5`dDL3LS}n&oDjRdeYj;>A*q&etWcdiZ=ak z8X!&o32EItt0%}4X<%n~+Vt{0*p02&)-Q5&D6LBe>ry%gk`Z83r__oR``e`n`i=}_ zZDeTle}YcpBQiJXGKvRS^-m+tESTmd%=@;JMg0hl6Vn_RmY_)>RHXH3Ej0KN86Vwr zMYiCNGIe|XW1vL}heo||AW`ssV?Pcm%szP`F`X%g3*;Aq0*FjC6%aun-4D?zbA{<; zO!s^2pGAa2buA5)qsipsOeUYI&5-LsOi%=6wQZ>wXA^UZqkmUR+(4Shmo^QX@;01K zq{zvmTr2r7HOjfsa{mWK7qXiu^M`=()3sf9oq>UJFH6{A%Jv3$+` zVtjfi-&Wn^qcr)$^(ZoO)Vs8@341l#_HBVSLO}xB`Vnnm@XfQ-4Kc%=I6G*ffH+dQ z{p1>w^PC|;Wx&sBbEo{6L7mXNBxfs*=*e+VY04;s7sGK#9cKjivH-Unu#dmyOAgq>VDBGmE9D|8asDEsy;H|a@1W`a zt45^z0ZPB&WNnonwBo^rN7@+%k;@X#69UahD0&uZwsSdrv8$#9-ERR z?dY-Bs#o=t`(8IuMTGOejq%v~0CZyr=%N7{-3MPGt6%)puzIxT&2X5MRHogf{^ad8 zD$IB`{Ry?wg2zFA0FeK*rfZF|!`_SzB1r)&X=sLgsdX>l{aQ^pqCQ198hD9+YgihM^6hQp{E^y~B8f8c7y!_O zNC?eFhYi?E{lnwv8xH>i-)qB91Bw6pz?ACTMFA-$UJNt12u$^I{w@?sU(MCZ^&)JuoMLFBdozF6uHqk#m{-qm{k2#$y{L;fE$bsuq)wHEK_hmxDdBOoLm}0aw1AfRDkP_wtrA(nRnwt?${ye!!p||s?OFI`vRHQbp zQyZ3_`FSG$i^gm`RY9IOC)(G0Bz1iS(5K|P`hik~M{ zPNF?bt4SW-d^K1n6kOm;U|o8o`aXem1A2tQWFiMBluC0@6QM%hBtDb@-eqPDM#+^& zdkX3o`XGJsU{%TQZDc079IP*`DM;&&l_=xT>_QV9*UE>+K{QY>cgY^iV1LrMXTn>7 zw6ke3xJcgr2{Q-e1QPTPcNyRpS^iU;JOO{1G9TuPjydoH{Sv;OzLM}kG~kpNLTRh1 z2og0%(YH9uwC$ZPiWbxURrJK9gZPlNwEuFEA&C%>k`R7WgdHh*6TQ>G@l~E145n?i z7bFVr1dmB6qSKtMsBJncUGhBV;$Fj%+9HvkLcDn8Lns7KQd9C>8aQg4M|Td+G1otP z?|3p*D?rbZKh2pL#2uwe0#_x`=yhQ|J)?r~nEH&6@$k|H?vg|cH(7k0p~u%5+rx~+ z^|EijPG_GB6-b7y5Kqje39aed#Qf^l+}^oCu1`arV&ae6dvHK$B{#g4rhtvBE}+JD z;%gMpVaC(cjAc|1HW_6ka*6xUQPWw0Rf2FlKfK#ByxUh-CFocEo}*PmVMB%Lbq`+l zYW4;7Z^JHN>?gHGU zfh20V`Z5-flKjQ7d96i2ml_C+9L!oLQz+19`bvgBJ=UMA8b;t$YZ60B zpdJ9iLLqXzg+lt*@6GeIh7O=e{aPbz8{>_W`MM-wI$6^-sc3-fNxGQXOQrcM;q-TYEi!6nOyYn=qSXqK~4~9FY zx%0!_MHjH9XKydPAjNZsF<~UL1j$&OFk?v4eF_i(&KtTmc~-Q1==i< zn&E^tD|dOKKTAKf^o}ZhOL#~=`uvxH!t_1ly$lHu{+z&>Braz&Oab>@_IUfY|8dW- z^v39}a>IJO>T&N@o2ulN9IDHoHX+^_2MEyLjhZGxPnfvBk)_li+!x6Tqc|NKBO$Nt z8FH>PKp~GTKLq)mpAg~0&9;|*?=ipkmDj3ezu4cWYArJaF3r@ku)iLDk<)7QcAmF6 zW%lsST-_*I&*7BQqcqbe4_4`Y;7Ty28lMHVeH4mpX#bfV1H|~S zbHbc&VYFxpjp1~~wB`Hta(=9B`XEtB4z->5JO0R~*d+f!m%3YJ%Y1-A+O`#_>fUwi0{ zl6kcH#)==ke&}1l9M+NE9(p6&t%vnBfjj36F<=oHIiTz=+xTRWYyj?Yf%{fan0zDP##aZQzh2+{!g`V1Qwx;j zqldmdfL_0U;-U2j{<^@Ar9S%5cZ4p)=O+%WTQ_1mO?BgU98-9@lr9x?qslaeQni>S zOqb#?6P-wK5-VGiK);hp29=UpGh5&iA%uOiH-Y&HzOot9j9}n{uwgAGlu$vOek?!b zPTVxkjJ8ur6Sa1Vi9O*sg9Tm=y5kUx5*joplKhxPCrta|BDHvB5Im^e-f?TZD#2Yk zIxilsGIh|l2>>G#kK_O|8rAZ~=?x78u@E~?KC~xOk=&K}A2-vP5O^OJ0-0TbEtEv7ZpPF_SJy`UKY2 zprQJl2-SQo=*0uhfHI+Vmt|^jCrrqVfEpHH2uaFVn-NTddbC+U6vZe71xJO$+`yeF zIOHT4Nve+S2;Vft4%ue~a{PXD4>y6abF-N0-^hSKH!P?jyI70@7*mf9Bn^MIKqO&* zirpo&NJ_~rK|D3ezCUYBLbQs$L_^E3|1cHc!Yo=k<>jFxt5w^t?L1m_bd*c~z6yUi z9q3CeNyL`ZMmp11R=H#|8{v{jgLX(v3#vm$mcpC!y2VD0wH=`{@L-ZYD=6IFs_-5P zcS7N|74G;azf)5 zWXcHe1{ep2Q~jqaQgeuD2&u*~QG&raX6qqIF*EdyMZC^~*Qbu*wHNT(^RIuS@T%db z`r1@4diiJCt`ld!COQ~mLm6=^Fn&P#A|J6<;v`Nr##`Wu?PNfxTH~a6s}CLC_|LwVe7|~|1IJ?)66j$PT}Cw z3f2@Xew7Xe&|)hj3{53h5xU8g4UyWSvnYK3mAnoOOGnn2iRbYInBVAp?PTxDD@;A9 zt`v^Tc)$>r@qBSqLJ()3mdp}4-iXH*qPEB#bDEn0W(mQ?ssAzUKd?in(*7&7TU4%2 z0eG67JwQhgmqMdsCm`?A{^eSaW84H;Q>ekq$nV{VK6Vvrk6#0#lyD%EJUXDDKr;5< zkvUU9s8Auy{~6lM{>TKEgZfht3v5@;w0PbjQ^iM-edkInkbXN){( zP_$^2*uU3Q1`7GVBh1|(WAs6_n6Cd_LkFDycqpsnN>T@{iQlk~K*o!D@hmwMz=@>4 z*j6KEb-;ILqZCwH}K|X~;jOGd$m00u?v&oyqO@$p9qXA-M zv_>RL8|2^)HPI5HL?w>pEwfq!HBx6I)QQJea}o2lk)cc?y2SQBJf;kZG8Gy77IXj{ zhR`8;G?d0nnj!>EB4z6Lj|mS-*+`3aq_%zDWC$9@j*0RpoBa#(CC$!Ma|2o~yeU!q zLZ4g>R0uZgua(Bn(_G+791iT8xLohZ-v{gSvR~Pi*Xy{5Ktrx!{F%D8^Vn z*v_e1aQG_w=7d>H&qMyW6+>%8u^ph}@U}2_3Te=?d>)iD`U-4>M!@QxIcva@f8Zqg zy^IAMirJpvwXp*iGPP!owSQ+zqESm9AvBeF@CD@3a1T--j(`BR^aO9Ce5I(}A5POo zP%uJ8L34|u%P0gAmFUVQH{vz?uP8j7V{Rd}1|fqMJ0KEZ{-$HBWI*0%RUkR&6AN;_ z3iy~q`iIpGGuMj(S+*2&Yes|>nCxp7gJ>#X80E*7l;b)RCWt?KVj#`tNc<<> z1oi<($F%_2Rw38FZC9`&=1C8tRECtl!Ru)>1@EKLVlT%K+gF( zLIGMynEzpkujRs8!q?Gz1fA()C^GQ@-L3zh!+p@|9tGydh`S+YNC=8t3Zg=iMn_{K z#nYx0=#P*Na3#6^%gI$T8^>f|UD9yhsG5`G+EEE`-%%aCG!Vk(U!=fh?47K%XudKt z<)&NH{OL5Hi;m50%|<%qS}}G$&KWkcwGbTb$%t~n{OKa&2Yxw_vCW?S^UOAo2&p#| zjB2y(EhbW9c)vI_FvYO8hacIdwz$h+tJeYwX~sevbL>Qmr!aG&7Sx#y$$C@k)8uVH%UrZ1 zzjKW9Fc2ic;WbI{%s*;pC`tvG00IxiXhxJ}@_WCG>=C+1c8G{!-m$lcf$1z*?> zp-7>Q|16`ukE_DUuAJA2?1B1paf95Zku;dTcX`(hyR{2{zlF z$nV&$Olszp;L2Q*~s443CP*_8A}i+84S(!~~3kJ($; z0WYBf{XU*nJ!Pwiv((Cmquli21)1zJ*2)=OA5BYi?9${jb0(&_gmw?K1;<}C3j<@` z=f#Y4@LW>`Cncnq%A9t<*#?%NW?oF68$fo6h|mPIZ2nOt`VamnEkEb*zBK9%>GaTvp=I` z(h27f^$p{R%*tUTHyfZ`4A7|w31o(S=0AFu&Hds+H1ctXTC$(5*wnn91NCi_!fPuvpsg`6XXU#14Z$V~>A*J6KU5xe6(ZgXA2u2wI z!DOp4Oz$x~0*sUtI740ha_yPX3D?&8gee+Tf?8oIC>5r2aCRNKMcRKly?i=#+Qtr) zz)w5*zh!*ef=88BvMROW6_z-_QH7Bt*GD6qH-*sDYdNYYCAiT#wsO%S_2q=S!JHjf z0XJ=(Z1@Nnxcmtz0zTz3XxaFSP2d363Dr65>TL44-sZ3#PY`-?@gY)p!F?-N@G z3_ZMZA%D2zcH%mv=;xCg=*_uouwbGJPmZVca!` z{H<fpfD(Jua@J>b2im^)@Po{oL$&C0@T?O>fZ9(#pA+M4esND;W9Q?4U9nT(25$ zt!6i>9Yte9!PMtwS1bMM^{Tm15o}87bF)H8#d_5*W;Uw1f+{h8H;U%Q`uaND*x#sj z@^H_3)ww*0e@x~rrZ>`g?5rDCu7bqV`1Xm1iq1Q#-AIJi2K?WD>qfPU@>Dvtp?c?( z-Y#;rr8Xo>HYyI;p^0_6cd-sAuIoBPU1Xl!P@!Fdty$#MIIEfvH>#Vvoq8?M0a=xF zF1E9ccNaSX5WNi*ofQ}c3x~OH6njSbdl!Si0iv|EUUbQ;AO1}hQ|m=XZ8q&n(u|(@ zhv#j*pjxDnU3t~lGyggO+*V?MMiAk|4YgMooabi!isli+)+;r_0Fm6Oz>wNvXt?9` zjIR7sYoLofY?Tg;R_G0ur>`sj)ToUV1=ObfDQ9Vzm3g(SK%dK6n|&?uI|fYwP97&p(-558L*rqjzu7*e=gY zIHfi(X19B-Dj=|8_RCg5o|lq2Em}sk#Z;iXCgdcqSueb7hnIPH34zi5hj*VlQ}$+U&~64|NKv&%qD`)w{=2z#ri=)KT?U*!d<(7P)QEq zfjwp``Tc24oGKM;URFj%XMvqysnr&wr5{%WEMd1&c^UP1TW<`$LgtDvLu*n_HQfex z8+whI8iyAs*MGIsnZ>vg0mQ;iypBcU7KMq?i*7OOVwYc$e+S(kDSJ*T079CL1UA7_ z40X#6ZIxr3bAQH@b!4O^|LR1t&N3ufB^g8WZhbx-U(f|l38r-PIo3@+8Y)SwPdJX8 zb%~t8+LBQsFAW$Dt}ja#y^w^8VFgr#6TI*;j^zRKYVknwz33K9h#DF*)MNy!K$-bP z^rKXN*(?AOw7ERu0=%g%BHlh`CXp@nqp$eKQ6S79llwniq6sEWX`}jmH09t{DXjLT z4C<(L(5O*?929LMA!P&j;QPfoWM7DCxC8A@-h5J`W6q2KtyINkH6V7rNch$Px=YY= zOO*UL$S(h})Ixgj{AqJHy}cTya4UAi+SPj2S7w9+eNP2%AsRJJq7o9e0nO0a!1r|#Py^$`Sf@Ow_pqsfYVO^SMi^xHP zlpqm0@NsKpG?gN$L%aM5DJxd*dCGB+xFC&3Dl=N@^ujTJ#w%^53B&_Bc?xRhkWb11 z{z~D#$C%i3D7r?+0{`Q&%~!;EU>octef{X6JC|xj`aptwu=oPfE-IZ~oi8Cng9Inrl>)Qa`bkD?k_*MaGXG0W^GtkZyX)9fK5MJxd- zpqSMV9oaf=oF0M9S~etSNfIC?S$KG5r6n;MMy(|d?7z@`aBU}-%H04*DAYjRvtYtu zowmTET8Wsd&q`!wBf-L|G8B4RiEip2%!0dj+%c*;O%xh2jr$8sh<+TOnFa=a*mM+9 zCKo9%XDFEA`d34j>Bv)b(U`r%5EGvcmS9NJy~V1c#<=WY5)mKCoqUT+-N!;R*Q?6e zX+dT;K}{3&@GLL=*7a<*`^V~G=<9k7p73n&F(|TQCge<)!Gk(w9CFd#=numVW4?78 zB2Z-_ShOGy|D9{mK`Z;IuaAcKp%BmSm-jtLsw73=^H^(W1O11nVR@3(K6R0-q;qaz~yo%b^eNu5%-qe=`sY%vJnh@MC$ zXm1-oCc-EjvMS{w`#6BXMNXDhg7aZiLNT8jV}7I1vv71t^FNF@|rC|j<01P3D^7l1{tf^(=rF6;v&qIYH61D#vVL)e( zDq>C)l$OW|f3Cf-fD}_X|C|MMqP4XmB>Z_uAPWoTR*1K3IAnV8 zYmK9DcnAC!X|Cq@hkPn7coaj_^ zREHX{#o&Q9eU-_MIISrc%O~M3SVv=REl9xUAvBI;hSnKr|uYZt;uO z#aO3O7^UKR_AEcBV8qnF>3)X04_lIPnhI1A6=JDt|Jzwy5D5hrYJVXYXur!P(keNz zx`7k=&`e~r4|mj-)A=mOZ>B?>9D$G!jX|8lmk&?79ufpTuBO#lLi>O+DW*^MpA&*~ zc;`Yu1@AN~x=Kr?Dr1p9Df6g(;LTEP*6bYPIPr?Mi)nrQC&Wb4Cl8DnT=27yh8UbdsB88e!S^>mH z1ThX!bPJ zK(jZe)u%nDsP{*Qmv|8 zrL}dMd(=#hGUZkgFHW?DGKZ^%8m*Y-iBQ3`RA`vYG-;`>jI$)Kj0%loqnI{3t(f9d zIT~zUOB7Ue#xkn`B8@R60kWmoZEHUPCa2t`fCvEat*;sYe9w~r1Q{9-0Eq(I41gko_^iV?q^MLm3&DF$l^~OG#p1)@jc_8zQ~ShChU%hwctN#i-hz-gxO^q2aqzoR_P886T5^sYBBWU+pjN|~tmum)38_eR zuVAPD9hjQM3_X@N-mDvdB->%uk`Ua4_QX+6ie4DZINFSK;W!>n!G?Q{K7#o|g)L2j ztPRNgM||_Slm&(Z2-?N;C<&We#4#28u?!7QAOI@Ux_jGrxy~a&k}at!i(f@AVZn`~ z73eD;fl)z#(G`xu$6UH17k#ic08X4wBuSM6$~J|j1FJ|a=C}-m>6eP$*yR~L{l&5* z|AcOL*Y^e8E`Qaec7%!&wB8hu#Z^g|n#3LGM_g=mI|E)uAveZSbQJX?By^yiDUZ?( zNmASiqJ_84Nme;J!?WnOzo^J2Ash<}{;ZwPK&E+#14b;#pJ@&gJ$0!)iNT4w zV=;hs4N*4zC=Z%berQvP^Oy@!ZMQF>f&{(m!t9s-zH==o33^k{O-58mukaD8=Y~0j z$pV@YgL3RVT*HS~T7KA|mVb4;*OC*#Fdk`uY6LYkPrd*Gr1G$_p$QuI>K$Zw z@&!4^AeR&nZ$a{CGZ3N>XdiY_{pN6oI^3`Y$VHK?aHK41?i}H(Hcsv)3v~wH(JaaH zpKNk6lzj>Bu>?{KiW`{uo#;~WY>tNu=VzoS)pwjcp z*0@H`=<`twvo{gDP%3Dz35^bEdz?01X$WQ1GN-FnIf$%(-0si%nsKO_jJ8{c_9Z6x zk-l$Y2cy`QU8t%54a41|qI<2q%cY|tNO6m}@A&C4{!6t1zRN(GODFYD*r8tvePPT@ zW1}eYwPvu|IEoA=(_WH~rj5y{<)G99m9L>$WOo=`XTZdxlNMEEe|mK|2k2nQ=#Rlf z@5~+#pc#^7_Wj{ogJ>|8wWS+1@q9)9UTv+}_U?m)DP6$8+hOnlxVxHGGSM_6S~cX| z8Yq^Y3kA3?%3HPT`aR;1Tp2|@*><`@XUz%3X=@kqyi>nb!7 zEHfn?3`74|V53PpmH0m`6^h|)pETL~rollTU^g7PJOP5i8^Oq7pBAzmo&!|Mn)6VP z!N$^_>+pn75z3s+92m%~zDg~Dgd@~aIE&TbRupmaz-o$Se0r_}{XpTzoLqvS>ZV;t2;mX&pR69^XB4G*GWi%5S5XNM$NyAfHP=rB) z3h<3K9}8Lds(67zLsCVJ^W2gD6`H91uc}1TgJuA-oToWn;+qSTyPA_%7Vjc8KQ$Qn z8mWF4EXck;5$*dV*!L)rdH!b$ZnxY)Ye0p)kpi{fdo9Hrs=q(Eb|(WPz2~PMOZ=HA zCu{eyvy(a6)S#N#k_tzsFbJctA8dHvsRp91ci~-I++0>B#SO*ah6*1DpRnnlTN3Kb zFH4F1_5g&BhXOqlIvTy$mCGtWx2={lAXjQOYU{LtaN2C6$QX93A|aMbc$tCSM0b!C}7oBuIObH10yXYDrTT2a%a<8 z%SQ4vYGKV%H4q9KJ{zwG#R{b|(J8(D*m+nwu6vKQfwgCKe~A)|$x1QHPFQIr zINC;8v0BC|M+lIyuZ*gH?>6;M6cX;(e8BHCuw(lsKI{|&A!JVQF;+?0PM1h# zzm9Msph2j1HnfS47o|0!i}AOTEMIAwf@n+BFB|>b|LHF!9#b&#jgl4MC*eMaU8p{z z)9ODYcLvQPl@Rrk4ZT#`8K^?CA6RpJXf4o=tuo;=vg{CP z7(E9CTN5JAQ^s*2CINCHQJIAec}neT2K(?StckNT&d=aTFgP$>+irj1=;Mj85kmxXm#O(kAR^b2u87@#J2>9BnRmtJXBf} zb~Y<-S?IJ-=(JcU(B^5O5Hqz4Gj(3<0LHJf*}O35OObv<t87dQ0qVmDrs~1RZFZav9EUj1Yt{@S+@!p+Jb1mc)oKY1E1oClBWJU> zQ%_BAwwiHU@gZwLBfRgHVkdRD?mJ zAfKAZ*q)lmkWMBNvLf<~t5r6ZS{O56ERZcUJ6TF^jj-W1&E47!TX)0^kd$7?2(fWA zifz(^U@gE>#vgRyy%*5|)0~gW=g+=xjqNa%jnP}Ac27x-eK6Tcz^3StogJdb*y5&I zqOzuuKy1WfUCkaW>6j($^0&{Y(Xry+AxMyNq@kP?Og(^uOZEW|V6JD6oT9=3ohlbR!fmu!kkkRa2%gQkd$VYli|;a(bb ziwa}6=*J$s*vsnBK8AzaiV$1z11?i}&^p$VdaWwtca7cqQYF#Uwn@09<5VJ-h5^dXiKH}?8l|!@BAA6kBUx=BDe+U5aV?bAH5ZW=mZv8{(8|VB zuPTD8#o|)Z8A`c;MAe!HgPB7f(684ZML^>aH3OBpmJ6b>#OE*p8`fyKv31L%c8l)+ zqLw?Xc5cz0k_q(4OjRYwv;S; z)Q}6cHwx8^%~4_d%jIOKhGS?pR%{^&EdUnegt*+?f*7@AJ0+f)Wi~iW2dbPxg=t8I z5jjFMbVc3+Rych}O5(IW-7Qk8IXT@rIomq9v2`+m4u+yl zO}4g9Zl9X0Pc6fST9ZUbPy6<&1(R&koj}#KU<-vbv?ls%ma69kO|@gvNc##xLKJKn z3DwSf*p^_~qUdR{XQ1F!r`mH*HP|S4P6~42!qgiQcWvBL&0YS*cm3UOUi)p=9YT4T z(}oN35jLqU2)lT_!L|YN_X{3&lYdZ9)$U?mn*nz4yo2BM^|#~rn!7xSf4*a(ntw+% zcQM;nIM!~3{R=$q(58(BwQ)bVIAaNx`yJZXLR*XL7iWu>GPi-2M#@1_SZbm;dV(6M zPO~16jOI%U8CkT{?ijU`8T1t@mp0m5%#IsXKiH@c<>zJvDFrFqUPSU-u}j_BsZAw< z9_)a=025iRqjpkukaArpbc7QzlZ4)Kl`CPcAYBd#o;q@f!;`$85q=wDY|>$MNqarKyQx(4h2;ucQ003)B|k(Ew~X*|RFll>@tOprMZu)` z@1|i{n*e5=h+`W9@Hrd%jfb4H= zuvO&FDK&CTbgngiOwwT(K|JidTW0?0XaL|g1{0A_p#p2K8-)tQPSwCMf4{v3j;sKu zv$Lf?pl|el(%D*`2SkuVxU71-RmVpGMs-n(Fd|ArKvFB4ePQAlVFX@qB*Wit7!9=W zx}>4rx`C6pi66E_kPs!Pb2cDN@O-&I>wfs3suYCIO-CkKs$y|ikL_N zD!xsX0kYtEy%~#vtj3PAfb@bRx8ctiLmxf1u?gWcd>ZBN4U5)-1z-%1QIpq)z1(#; zQ2qlQmqR&b?)P`G!tDG~9SN>w0I!&e6JDFJ@?{iZUBh;NPlT!_17sBXaSCEEBNe92 zNHqN#>%l1=1DY#R1%ude%>{neyKHj~XM|r%T%tFZG8zJFiqwDuLmD?1^bT)3$z;o5 zOrQsAlN*v<;!i`A*&~~6fdRWg??~>iD_+z;YMTs-mI8%NhI>o~>ZMVt*rH0|n^x0M zl?qvum1+`JWeoa9#%le*c&+p`KyP5H3tP6)2J9MA^98G7+LhBDV~H+^Sz=MlhtOkT zM_#^RKbb8u1I7$?4oRKlCsgc5mAEJ$s62fD#K3tPP7*!` z>=5PQyW^zug>_A6_ChD7hZnh@HL4G!HdT)$UZ%;h92@XS63^uOixf|pNF;%Jcn6(B zDT+kOn5F=X!1`seFB>ovkT1Rkn8Y9Vx9}TQ^9jaW#Q_XmNMAwV6vXq&vB$1B>iH5U zpAm^LHr>(1Zh_ni;_3Z&8ouJ``3SL2g#ZV~(8ydeN+t|tJo(L|IVnRLk{dDvB#jOu zLCIq5v`BdsMsMTk%GPQBfnVSZkIKBr{51NrrBiKc&Ti`3zRX$8$QwZzd zhy}e<0v_-{mcN5fkUU<0FsXp#B)Ui6d0`&^&I^=k;eVzpU_a3t)P(~483w~Au!OkO zKlV9EX;FY`$64#&RjUYlV(sxWE%XCT!)oW2GeE$&MI7oyJv|_~Lu;By4zkcyPBc0h zS@`fjSlh6V+UC2A{)g&Mdq{VZMpl2nhOM}?e2kX1I5Q+8E2ebPe>cjN!YTkX-Lsf;-P7}g#?nZL(}YZtVKR00bda~$ZA40)+rc# z;@hPk_`FSfCaaUYO#AN&dkbg;R z?|uImhYxuyJfd+(SxEDLim`t|>!jXuRytdGOs0v9%K866mZ-=}x34 zcdz!2(cKEeue8r41o=P$GaXBm{NVGWmQmO|JrXSHCKXac1cp2Nj)N)ip2UHA`B(Nqjh4oQk&>p!_9bn0-0vmNY1EvxIN~*2X zWBsIS{38^N{LdWPs{goct=yY344&5dixu+XenR-nA($@t$1Q`O#s}^ni2E@8{dNMNM;qK8f10ONZpv~WcC1(=8>p(F!d4eEToKuftxgu7$Lk@7C^~7G!ENizimuF}Lvu zVKpb8FU`qnZquH6V8-Kb$*Bu+UZG`0B2Nw^b`mahuSeUQXfc#Uv()Du)K}@;oNY_g zU&KMt%3nYoHuJ=z8z5hgUS{N1(LoF-b`&vbvDYS?;$WQBRec(i#J~O>fy74#rbdyI z^uIm-4^D@SSOfalo)`}NNi~4%GYz4+pqN_2q9jYVbdrEMJ}AIn1dDC*iQn9VbrdIy z@RM_{9ln)F>toP7`sN4?eE>wM!#XsbTVW8gGYp>ePhX)w$YTG@Ya1u@Nt@f(*47x= z2RU-vtqRNei=vqb_6y{f4Lhohq8Y(~K8~bW@1t#7hAvWlHo!1qWWYT6atR0W_7Z*I z$aeXR$a{ozkpj8v^Zb(jc{PRJW-Ou8__N_@{G7KrdlimC+b9Z1L#Oyl<4*FJ@Wk^s zsPuRlMv{-e*usxw6zKQ=(uOWUWPNJR>()-ZwmvoIi9@$PgrhXiF9r6ffl4KyuTLiG zJSxr!LZ~0o_jfE3S;0NwR0&=pT09$iK9D97C#U|U_|(eGAn8m^cbEaQ#`F~Dcuw(A zb@Tp+;x&r|))T#O2h^rFPrUjX$1?QRub#F2tAok5rJgzYDjq|l*)RfwuMRJrQ4_?A zVw-OX*!k(UO+0(@)u~PF*WtWL{w?+7XMs$qwpC^J^&|VRjfju=P*6Gl=v&_V7konE z1d;j5f+2|fy@4%wNKi(MKkb`du+a1;atrll{PWlDNOz8QNZIaGG4l)2PEHc=#rlX} z%ZOUW=DBd0;OGuoU^xgwnJu9uX)(~Tqp?l=RcrxsoTue-E@Ug>4%S=|2};5WlIEkm zcSYME0lKs0lWLbT7;`pt@yuJniDna5ut-lSiy`P(BRw0EWA%#w>J{W--FUV41$m;}1=|{fTyYnUk62kJrX*I|+MP>?J;~qy8;$sx2TE#$rmXp*dsN1-8jj@)Ihv+` zX{@07WmtL|BForqN+nRG!#A&rDNRoTRo+x#QL*bNPJS9X!2JR&cn{-Zdd~Tc1RyLk zGupP>9iT%&4y6la18V4+BF|=|Qbzt#)U)VHR=4)5=6LiY9(j6^!U&6*6>9JLH4ZH( zP4(>XDdgq;iHaOo^UZIm^;m zmt>CK&{+$zn&_-WSOBLj|Eq`KLp@IDqZ*1`nu=Z0nnuo2N9+!3#4i%kcmy#Tsn`u= zu^u4C%6Uk$UGDVzN<3%Pf{38)zkt$sN{1WV!sdP8u7tTQ|yxczSv*s7yP zADBP&UYn=UcZB6)709~q<$qeO@UeuEVpoo$DrWsZU0f0`T27@wG$YqfxwDia_Vrs? z{|ETlRi9nCpq?(!y^mn3l#TiLXJ&r3H8V3a-_mp1%;x8(=H2`}R*m)h=g8cina}6R z14i1|P*?Khb}`ugY^mG_NZ2{*$q<$R!A?nxnNFffVsEpBy2!XJ6?4#Mmowr=5BP7w z0|!bZ-QD#Q$Dww2)eq8m3A7y*ny(+M(2m@92;3x6;MxTUpzAx(Hs-V_T5_TW49|}P6Q!xf}Q*9QnHjUD8+yAVqTGs(4Jk$A)0-~p#QuQ^2Ngjqp$X6 zc`GV|#^xa}hNf=kYZ0i^{2!D(#&x=jSvpli?OIyUn^k#DZT-cOIo2z@>01LT*g%7pM)mOHKc?-=0 z<}feTZCZ=OlUbYcJ`&Mn2b{73Jyy^T0qA6C7bp$#EEIIt*%&0O{LX^O#2*Z4 zoU79i=9Hk%rX;#&oTn^PELfu#Dr44T{OsExeGwdEZHE#Td_xfhnI{G@?ELNLuXg5W zgOpgx(Mm(Yra}C=JqN~Q_?fY!a~Hx)2ozA243AT`Dyje!FV#;MHpws5Q&XamQ6Z!P zj&q|!7M52yEiuV&FyjoknUo)}l^@zA`U3~N=Bfl%O!O4Dhw={E7iFQ7V}~gWl(D9A z%cWD5E=#@+`qvv7%hnD53N1e5`44qmSL=XxqGDE482I25+;OTiEiz#6)QV&2yN6*FXzhRQ0|8WNZW1yyx$rUJn^J*CY^hQu_`5HfOZNQmdO#>m~*E;b$7qJCRl zv#N_DP;}0BU7=(Zd?m&pY~qw!)qIdoD$;>7hz;Y^6Y0Ry1*KqkTZdfnnEIF z#_br>W3)MaQ#HMbHd$T`)QK{|&=H9mI+rOD72`?baoDf8k0Cb1{AQ#xY-p0WhcyHF zc+H&6AR}IYv7n7DymvepK{OAWHHyqEx`rjAX4sU3)u zHkEm5xQqCk=$w}51lAX|I4ciO#+vPy%|=C9*y~`b)VqnT?rd21Hv=ppbiD3{m+_JG zzlEVl^)(<|($cD01V^_fp*K9qOQCC$ z9MSIa`FELSU``x@(%4)XWo#LkAV4m@^#2!m6?pj3m=#)sJ3sQ|c* z)|c-sqsE%D6w&31y+xr`x%@@zG$jHt;wky8pb-$+L_!r`)aGLZ*sIWIF~vShBOuIR zO>SIP`604-j&Z>47)C--ZIq>I?Z@Nu21%rOHjV@yoE2}_dy5$#y;oGB_Pj`xZ}q;1 zkgZ?!3d-*wCJPW8Fui-M;_R$j7?DiLPseYL)>m9@r8Y#>u|niewkC=q=28U7=i- zgJW|dfM}}Ko)ZIxoi!-)k{_i^TNw`--I=p(E!tRT+|nO{K?LqNR=P}FHH7`5KmLlM z2&C#?SzcwK!JcFT!>GPVzlFnxKxM<0PZ=uPKV+jgF;0`Hnv@coWL!{!BZ-<^jiY}B zl#JA$kVQtyLDGGhtda0+3&jNCF%A)rTp%R`-gpy49)?9XkF`m-?6>TdPjvW@zadLI zC$h0^O0c6g#Kf>j1f3W(>|2?ZDPTN@`^aK-J7L!n!VP;?CN+Iz?z|*(mL(^fF zsPGBOhR_6KZx2G@(g9&xE)9f$1^J>V5#&qsZlCvEz3T8Pq*{=#QuSpLW$S+hLB4$j z`S!Pq;U&mdTK@J?zzXu6EBeLUm#l>EELe~)`w}$}LJ{583KY7Dy4=nuHCthr9Z*>2 zupgRd*bxzirGH1~|_uK$H!Bve4z#XSdVZ-T;Q?%ISL>^AeWCkf64mOR|DPC)=@;*v_$&c4wWGHbh`Gwkq@+6bA4Q zYiRO8(pi9%cH9ZK9dL_C3%gQU8YWFbTvqu(A_~bmp2IkRjG}e~E-8xD)+e|%>ge*2 zw#dNl&~Kr6@__5eJYz*?zHCvnxFITx|Nm7GFc;8iWVKFajh%kPI?aw^pK&k@{a+x{ zu5w?mS!*q5jyX70ROAsLHn%C7F`1TaZsl zH!R1H0U{_T1Vwp1gN4b;i4QsTma*Z3&)=BHR=2gD-CCZnPi(iTR82ni?stCX(5=<8 zFFXHr_x)^jw*UMdmZUa{XJ2+e-|9|QeN$)jJ$BkM$?L`Wyih6r-16F6>6h+0$L(_C zYagmgfO)^=trj;TD148*s*3X;D$09`#f@qaj1*`4Cqg?d|4691I-3rky$1KeV=a}^H1>2_pX1UBO(IL>+9eWS9nJ&62-HN{K4aw z9r(WEB4rp2;tWLAdF^%JE6^CjamS%sAA*odnyOKroKP=DS)Mp_ygEN*q9cO$EfEJ# z9C}$p+5>S{c}(iF^2!Won@omD8%i5CxyBkcbX(W)P_41LVCUf|L0=kUt~7-g+-uLFPSrUDJb=?w7+kY4yCf^Z7!J|4ccgr&(dtQk z(GduI8X@tI{5miC&y`SCpd|P(DbMCX1ESh_ZiaOEc8c#rDGZl`hP0Mt!=jkL?C zd|5*=3RC*{lQcsqHm60Mg>O>D7fjWK-mmC~vwCC3-6139-i@dQ?33dl2R2{e=)H7r z(F2IG(xoWR)@4t*D79=~#a3o^Ju}Pj6gD^OU0FChj2ltZ0j$fG zf3e?cd|L6e@fx4@j_SOP;>?1Y&n%u=@JI#c=<%FlzaGz`)LSk;_jS8|@5BG_w}-wR z?y>IKCJu^iQ0N>sg6ETA3F3hL$g#nj@`K$qm+wKF9X)$qh~Ea6tKId0Gg2mYyyu&(+gK-9bbY1xjJzZb2WTne9^>n2C8a*8;p9N$*zg$mY_i(%Tn&MgPTRg&>gT*ts zyPmtJ7ti4CI_}OZ4sdrhe`609#h!L4T?&ZEIlG+u~-utz+-r^xvlhDwYc z<*c07%lYCdp{$NYTHyaaJ5zvD$Ak42=IdQyzTTzzy1|548;@aa?EfL|JpiOCl0W_l zyUQ-Kz>t&S%_x!)Ghtgc?8O;|RpGdZrYN z*A^2X`jC$u5Pir;4TwJE;{`+?@{t1UgCDPb5Th;{uYC-pV)Tl~YnL3oRl@(34D%Y* zq{a%y`7HZOEtZUqTC-5ak4_KcJaK~>>m%~4w9|}~RW?6GwK*%hq;Yjsj^j8YS18eN z7av5yB18rsYQ(>_a}=>RxqLHh9T2vt;gp-P(+>_kImPnXv(&yGe8akl_J%6vqs`>; zEczL|J(=^to@@s1LhiWbYdjlWtO7WaoibyxOwgc#*3WIKF161yQ*~ydwA%-@!EtFD zSFJk60JYeEb12w1dAuy0^HkV3&D=4VoVkU^^w*ceLW!0$8v~&J7TDpxaPd)C8^@8r zX(ak225}r+bm>78x|9~OOA4|xMbMEjIWTZ#z#fh{wp3hnXV78>+kn_QpE_l!aijRu zOc#_IV@(`j&i`UZMKYh$)kEB7pEGVbwXY41hy^h?f+O)=vdD>A0juYIF>rwfS$-z+ zhYl_j=dA9(%wz&xkcl=IDsq0YD9=zUr(z<=%C1ewyp7R`Fe|sSIPPnjSEuq@&g&a# z(rAs$%WMlc#3CGG4u_cGfGY}}rC2C!7(ZBNJIG=aa}vwWli{bOBR8fc>>t%GYTnZA zv}geBv~d8>V7HKC=5e3IT)WtsoHWo06J^ns0A!M4QmJd=yvr8diXs4TcvB{{ecIA} zN@s1ea#XS3zO9ObB*aH6laXkosC?<u| zixVH8y~Gp4MeYbX%EUq4fj=v!Z@MSt*inpr>XS!f^g>+!+Lr%>I}t|z&}HEd)uL;_ zT^ULm9qgjU44X-dGWr~kPw_eCl_a?9LjHv6N{itRSF#isR+pvM$8}uIVs$J%I9tY< z8a|^HWJR#^!B62B__P&j(D=5TNTO$3g>SNdku%0Duc5Zf*nIuc2W$-U>+yL!5)Kc33h|)2JRYoo8Xhr+hx7{Lt)oL( zdUOz1AXIuSrPJ+VL;9k+QaclNk9i*RrxxL{=*SA)kV%Hm7V~OSx0_OR(MgoqYfQJq zQd=~hfl2EOj845I!dwy4!tG-7_kZwt`U-`f#Yu`vUwwmT@1?C1ZO+hv5E+`<Lg; z>(7+H{A?$Uf~^Dngz-#y(1}G}w+T=oHg$!}I81qohjYEm4?5hG?aYnW%7<^CEhVz{ zTFqDVq)uFYt?#Wo5;R9ENt8k`EY9y}u~>oxJCcKFozKSq>Ntvd5i9_j6^2;_TV?TtvG|X%t2!#e6tC%^!e$y}7=tuYp3omHtbyio zN{NzE z#OUaqgUU<{=GGL0ZWo(ZP`MstheYlC?#6Q8F11ESZ~mQ!I9mz z6uQQu<+aK}kIE!>h49JYY^6xU6`|Y-8DVL?r+O*qbf`+{K;N-ZwI>C{Q!)M(dNmZ) zKl$qGtsVKF?<_Q56!~v2qP(c>h{?krQe} zR`XbC=b^C5qsM;vRv9D_I%3X2DwSvqrkQ(VH&HARND8{ClTX>0s7W{Gt4&2@X(O^o z1+X%J&%t3KGPyU%1zp#;jxEbnxc$j&wKF~GEI$_1^`>}AiqxHYE)j2~U8C&OJL>4lF& zoRklHqE-`-mwk4!Ml`U`dYW_kD0$6+6g`3V`ymNKEo))P8!a^5V1#_;Ewo0cv(OTf zMSs<-%4Unnlg!`SW@Wks{GkG@7i~Y)ADd&zHDHbbqpu4{ma@dy3F(okmlC$)nf}u8 zVUT0QWb7Xw^2=$;@rtvd&k6iHcE~P%Jgf7Wq-Y_47UYteEbx^Hk{Yjj5P_I&#IKMh zzcxOZ)gjhpN41?0qKqW9Ds+ZzCnB%3r4njdLSZVH@4;Gbxdn{(;1OQ%pU! z(yI*Qa(~`7jO~ajej-+6OfX^7VTh%xy}hv~UE|n34%=gFmV~Wr8+j1xo8XEs-7_XG z4<8-QNmZRV!5ho*`5mgnzCz*`)iLyw(Q%_G(1VKTOU`V&Y0OsNr zZ>{x+;Yfs4$_yPd;UsT>nAVS*wM2KP2Z7XJ*?^95X(Wu>R~Tb%Yi`o)?Bu)r5$HkI z()3J-1-c=(bB_d1p%|8#hOig5i*o#yW8vy6$tJj2B0qbI70YHL)MPVtXNt@FC>CZf zb+SQwvoNx*!G+Bv99Ep%6bOXUBu0{fivU=2v#>excyN^123kWQsT`GAybl&Ts4;#J z1^W0woU$NIH->0KyGgJhUy9klF0_VS7#?<_uV}w_K1iFf-Iv;6CT=jGC2*D0HSEQ7 zQpytx9PP!zqzI#xoFx3<0uBk=ASUJq0deb31RNsZ5dnu#fSCVl1ssxhT7~Q8GpMb) z8v_pUz1e_6uCu_(w=-dpxO^C_Qn0c>Rw9N%TjgV7F}^!Nj+!2Ibel5K$jGO@w+Bvt z_z+lDBG2YYu!KGyRx>5SOnG`H6q3p-TgOD8s~}YTFw_Xmq99a7Ok};l*r`4#7n6`l zTxEBtHQ_2N&xeBWTqPc8WER;jBr>kjr2N-#m2ACcxJMFZ4TkNC7>4@RVi*x}-592{ zd4_R~S({<_-YmlejqDyFjC6T1$BC`5VqOds3Q(hLobC(XoWp6^1gCRds4yfT4j_3F zN12W1_#80wBS?sVY(u269NSqFdO2m{`l+OP6M5?9BaF2n8)fa>c`H}bCcKrObVN2W zo^t}kG1EvNj$k`2+C(DZ4icFw&`Y2Ogv3Z6-wVG1NHF6woQU}aky|;OjAvc_-GpB} zB)~12T?R!m+;GR97HtS=c7~D#xih|%!ITWwKM5m&^h$-Khb1}`1pi1`Y0$=wq=A~( z!>1fEMJc%Us`cm;4M zZP#Na84fJUZ|WW*4vR@hJoUc2$WyPE_sYj$AqrcHP|;s9O14fc<3$$Lpw#c2S;j^v z^TL`OtFS&wW7%Zjm|3I@zXv6Xp;D!+43}cB63(R{P-HB1bCS?Ln0gpyl$jWb({XPb zpppa_!0lMB{u2U|lAzK@j{{?q@Nf;_8!pI6h_^nS!|ElLCAyjK=O}I9(w;-wjX{#1 za|}wDGm~?Tf^q$CTUR7d3UiviHLjbCP%h*j7~7a#EqbBifw2MF;v(&=xIAVr3ONu( zY_W2HB*H#A(`hrFTfmFX-O67F2CUP#@LXMgYW8Y^rt(eU!dwg8jnIAakxuhYWmS&B zjB_xu_Yg`ke@Xc2WObiV%7@FPPALrgu^>IN*Rd5-i^P2jFvEFVLk#vbRSLoFDr&1Z zW;pfnR4}%dC$c22m1DjrgerWAY==}0bK5sQ$P)?CGIkqh%-gaY407s@U)2E`qK z+;BE&1O6(Kml=n~$8tszjBRfsSZrF*SSIgsM#jU>zNXdY6;MqCMGLF*#FUP+@U$YO zcojYXGcm646H{i84nUK|8I$dq^O5kug+>g%!5a=aLe42$rT&y#R&JBloIuTKp14L> zg|t;PjD*5ZFh{Q%%blL9puc9rHMm_+DLvX7-b% zJnNAjn^)y`Rryu<@)K;5VCoXx=W8mDz01C)a7*8djBQar67SJEGH@L^1`i?qS*3mb zeYs0I6%H=wRvea^#^IfHVUw(rW8v)os*?kCGfbO_6KYTGQjZbEwvYh^j0+#g`SzrZ zxzr|w7u5bf-#2M8$D7X5ILtD3gq(x5*&96vB*)B5M3SH+ROF;S^>j zw69x`p`ce_VpbHX6P{!JIGrYRnVu0VS(IGG39N~##^!{%;0crmo{_M70cG$A$$!sb zbdB$}V9bJUIBTU*211BHW`k-*q2q0y7aZbDcIOG-5IvR{={VM;fxFujbBY?BLeMbC zxeSUPX2EeoB4ZdMcSl1o6N08HfHRJ3Wh2f(xThF997Z&OaA$kWXYau$t!{w6Q%&H= zP>8JIn+Z3bfQOuns3N?p&IeYKx-pLBmk+ll?czp^q{$phaTf6pj)v>FDIHcQcQ?qX zmu#)Xf@(#>A^e7)E5tpjv`hq;!Q$VOe~J6CWdJf^<2QdlHeM_(@6q?_uy}agg+^qD zgyDF3t9;~62C5RNM5XQHOzZ)WDk)l{lF^-WL!{D^ToI2(q11T#4hx&ZA{HZ5xN1?M9MeoUgqYq#l8aPV66wYobSj>UTQ%2( zr8HrYYobxUX*>v^MH)rJR)#9V%?fxkQpS^<;UKisc-J%>Sg1HPO{=(y7GnC zH(^&XGNDvw$1Uz;)7rCTg`}{`2!T#{%q{&W0G-?@fKy0=Gt5;UmdcD|UCC+wJiyuh zoU?3-B{<+dvx^XTY$u%1g2GACp?etIK{d7F_Bc^}*(gEF?3A_Iy3~Mr(Qdu1eWP2%Uq!pp1DJ$%qn(heRM{*bqR zG*gSh-Nw?}vDz);5CJV3lq7bE^reo2tU^NiKO9xa6o-70aM7%&1aS9+Tn+OZNmWbJ z3dFvy0!_WN1qZs_-;PZPrf=urg`=s7k>DkbMLAAq{qny~`284T;*TJE@n=wIJG5h$ zE}gm*|I@8=^xmOMGEQ9Pc3nzZm3OIV-KH&&(y}gHaFY`*32gI%3Hr0yo%~7O<*Sy( z)BRW%AjXoqss`u>5$TFLAg-w}Vf{rzM(_01ELY^ST}8HcqHKi}??P%=uW7!u(3(mK zU*|hs%7kk*#u;YBcq(qeWRiZKPa0TK>|-^82vEgIt4aE4K4~9I%IKn`1gk1e`W@Er z_rtt3G}w|7{#Z#nG)=miq+jNf4zZ*|TvEFZrjXhnlk|$^`N0MbpT$$Nr2Y`vCm?jYC3I7m#mh+rk5B` znv)>zW%6stzhG7vmZ|)X3ShT0zrk_gJB+|(J0FMNA+*^OVk50*VI<9bf5M4<-h4N! zn3iIeK8>!5^gm;s+Z8hJ3$sKq&t*x-{89j?U(&Glg$=WX$^V0f+1lsNH0+sX8&>n> zS`B0U_?I*+Q`oTJ|ER|Tjr>2;u%*p5Z0c8QHH@IUQkk>i*6ES%t9A;q8U@LCBfD{! zrZzmVV3$s}DYdxYd^Q&fYLO8=4|Gp?uLXnCbjGys$wGYaOlcfXgw<{;uOQ;!z%(no zBQJ`~^rU8pi7ym1m<`5^_6WF@n#CG(6Iy&hFuWnfh+~G7Sy7*1WnsIMDTd`NgU6w& z(j2qvsVS;YHH+%>??pNpGn7ZWF+i?E+}voa+h`Dw^ai2aZnXI-e@%_6MHr|Szi;b0 z2ohjaLzq_K;^Nv6EzR{jeSUD2nr*F`!+8mraf#ISjeEBWH-kx9OTyu%9}48vCN)q~ zM303pe(IUvp7kXeaIn36Gs*CDwLi{nE!d=it#sO!KruOe z570DK`g|-n8(Qswp*a0}=`ehL>EG$$WB;IFT--uaq8$s9^&1}^$B9>B12n(DlUL~- z%4N}2TPLambmhvJTe)RbhIo&KOdA;b+G`kyXK04fFrb8&MU2fwt9;X~2ee7cD65)D~CMHaA0tGAHi6=I0Z13>29%e;k3~Ps_eG}W` z!ouK)dV*l5>RwJHswY?gyTV(}n7q^^5~6J(I!RPKcOgS?Yep4exuaI3=_a+qoE*NL zTaF7ajS}E&0PL*AsF{>MMnO5_Rv>PZ3-fLhdXB9oA_>iqGmcI#Wn`2AH7)ueO&aln6;utYDKT<-Dj>@Mw06jqm6ef4n z&nK5u&_1m!Xx9i!cI{(47B6+HI~>%Oy5SRvbS&Kqj1qJJYJ_%B5TgWzr1&havdvd) zngS1J;zLg|mzY-z+N~ZKH`&Ga6^C0cm zU9^!%7fYQ}nkf4RB%=hXh=Mu0y+CoMJEne;xSibO+ay0I%LmuAlsZDOO`x4{Hgh=-Sc8)F0yk|fL1BbP64QEXDSRMBA3!)Jbr8mb5v z#k8%Hpi%@fpL=emmC6$07T<{tc5}1PDM2!}fX;iibk4sH^aF5G_Q1x=kWv?A)TBo7A-H5~JezZphQGnl6Ij>7XD1Ogv|91-?Np z$0PhbO|9-EXZVa`fP=Kzs#VYa&kC*Se|)yJT`T8Ho)^wUM@GpA3JU@_A8HaI4t3(B_9U#1 z#X4;zec*Gg4iAl!z6;{QiD!K zwuT8?;lplYn?UuWPsx$t`iB4dyZ1D&D5dIBTLqvFl5;aX;Oy>6B$yslJl%F@2W7;e z4|<$?TDIq?>gk`pnXHCKsy~~4Q{_K`o~Mlf#ujlag6JoypgYk}Bou52$9ge0v-a&E zQrR-?$+N`rCu*n{{X|s^MYVB2P(}lx?Jl+q%Y(w>rNZvx!ir!0$;21R>#4uKL@Bf16<8gTq$v6ey@>zGFctj|Dz7o)eygzzbR(!;#ol#L^p0!++RtJa@U4 zjn-B(qGk~*pQdtbR=YDi*N@yTqmvfaQCj1NNfqzDeK;x50U2Aljbm7w$SQF@%*M)G zUT*Ra-{oj-m(e}_cV0n<9Uj?E#3JV|S1vG=gHRVzbyU#<N?w3`P;hM{k8@K!O z*K{$}7%z&4c9lg24rTOi`EJB4%*&K4A(JWEC@yfv6w4siFu_S{I5;$ap6YqJp=HP1hr-@8FM`KFHSbW5eROrnLG)O3^itQrw z*w~MlD2|Fx1lJ=(Eu~XH`wANOqhf)F|I=SOA$1(V$ajI8ECBwFgg_W)aiD}jwzI}^9kLSqwT*WlcmNBPwvYbs!Ua-e2kH21 z`+#d`)F76W2ZsGs@=iTn%J$NhjkPjj^Qy5h9bpoWMmV;NYd(|>;95UEat9pd1w)?& zoKB3?zg#L{G)2I*$y^cXlT==D93+-bBACjqJ+l?=5Qr3dYr?aubJ>e8PSFwF^tjz@ zqjX`r+;_3AxQO#05*n1quvoVsslKI&kh*L0WZ9>8Xg{@i3dO4?URFr(GC5QbIH#jYLgaw4+{x zM?VNo#oE+?HZ~M+6NoTsqYj2O3!6w`WdG$vvQ7s}S|gDVA8J4>Ackm0q-L>!Xqwu| z8pQ`J1wZaoNDI=2-Dwa62nX}hVO+>XN5%?V9v-xZ<}%$=)(xbfyAcqjP!8Ex#wE@` z!XDL!yn)2k+hLCr6oj~fmELmNm<&^NbI5uQwDmf4@W@Oz`lVa+IumW_dP#j;ZfaEI zk`4{J&8R_H+B2 z@%T0zmmrt+S@kq;E6XySSE31OMXDq=%3p+80k;xoBOTLya<>1A#bCFr&g@q=vfI>p za2As6h~3PjU#2nKCfjH|`7KzrHMQhQLRqmfQT}MQmnE~@t*xt|%#aGtkeh-JVpiJ? zATr0pAY}V{yhR=_(!pJcYo-36#xWp?3TpnY1m#fZb_!1-`#A1JFuV|Mif ztkuM!Df|j2;err*mAGkAS?cK~$9Po0dfFY5)>9|iWq$DW_@VjeJ)z31Pz_hnti)0v zwK3;l3tn=hS`O2YnH@Xe#WC7(=|q-W;H=qlNw{Wf@TPP%yOo>`a5ixX-NfSzyrfcn zlrlhdu_;s4Lu<<9<6xS`J`^P;qnrv{%DgK^8E2xhI-#Te6%{>Ygv*m-<}F8)LLyx= z|6nS_N6bwbGC0e|(@F+nsnrsbVW|+T9Jk??DVHIFR#9J2FtW)4xYjdO@%R*N)TEO= zh;dFE&~Uea5`(kix8ghrCf^#^wi1fPGr|EUPYn6m95I*)$Cw^xXdRT?7(WsXOY}_r z`=WTs`e$@Jz3XXiNpu_YiqgDl6k^OyX7|t=A-HrTx;00$QJm~=LKl<~GP>-7?P9Um z9tT0|ve}KgAk#D9OdAw5$0c2_*<~PPj}CCB`~hwZUfma=orUOJJ7X#Pl%#fm+a-hE z1qZl=h_?;F6au!kL)@?ilhUUD`sQ$qJ8if9qz{B0tWn58EWA(0vrE%E$md?ZX}r1{ zC$~{eOk|iM#3yyr1hkqFQE!vGiFap-OL@Dn8^lbXMPZm@oZu$1rmmW*R#;oqvWnEk z6(AKrXqfw^5YRpd21nScxzEdXN@0yDTuPG@-yM>Sw^%fq^~CzIxhEO$qYYHlVkf!V z=tFD)2S_#W@tc<7;}>b|m#B0Z*dk&X2y>#--TQ^2G zoHy0oGJCjA)L)|5l!vpD`fDKrxM%EKx}Xo;f}rtRU6#Q(fhB!~kQ-_Hf!+;bcL&MK z!LFL#1rICxK{o=Aykz7|SE&m_T0Ln{cvDTVM2%3@JG&`htJRDLm9-5Dzj@~-4 zS~a7!zt%6z^j#wS<{26ouEwpoEgI91=Ddadc0j?PHqw_Mpb$<0>{(;9wiZexR6rs{ zpS*Nt2q(>Xs$0R^1&2%4L__hfvY506iy))&L7byX3-R4;ervAuV4zkee*|H2DCi@4(m-5$s7|Pk7jq23s7#mH=DqVM`45Yy?{h>{$<6s$U{PoFEMT zmz>CX`QvzGqo3XcIq5hC7IYR>KbJ%_46WxW;yKGYEcU#?mPN4Tz?ON~a)Z4P!Bzl! z!NXP?MP}9Kl`z_Oge)Vz5^u*lWOE^|03r_Id<+1K8^x_J+a!6~W#F z_Ad{6(_n8$u(yD{?O|^j?7axK64-klw$fnlMzD8)z3XA`80@16_CBzWJnVggeHg($ z0QRAWePFOv5$t1Nt32#ugMAvoJ^}WrhkatO&m-7pz&`h|&kWWO!RmoEcv!u`zKUS0 zfqms+s}1&L1p5Nmmmcy{#gZ(#x z{Rh~8J?uXQ`yqm@0rrE3tufgDBG`|>{^wyo8mzh`&%0-r42xAO0z10nY<>sE&Wd1X z0z1pY&NSGh2zDN@Ngj5d!Oo3f=Kwp`!_G0-1{Q*!2Xvj!)6%l)(AEW*sUHm%V4)eu$zJ1;$b%%?DhyY8`$k0HrrsgMX))*Zu77?2D>YQ z-2v<_54*!)cSf+e!0z<0xdyu@g3SYVkB7}O*xeEApTO?+uzwnCegwN0*nAJW*I@TY zu={}B?_u{DY({CG=WB3z&5-2?&)4ufFm_V}n+fbD51VPQTO-&kV7GeMEQ8$=!EOe2 zi-+B8u-hZpY+$#0*ldH{7QyBKyUoMq80@YHb_cM#JnRmG-5J5=0=v`0<{Ipt2sRJc zJsvjCV0TBbe*(MP!~SWo`4Q}1VDmlfUW45q!R`ZgzlYstumut90bmO}>;Z#46u}+@ z_K=4?Xt25nRtt<VV2eELF@rrC!5#tjsE0jbu*W0V zQ@|egu%`_6WCVKx*pnXiguxa^uxEfR_ONFR_H+bW0_$!eB2%u;svB@UZ0udohB&0_;T(d&OWcN3fTGz3gEx8SK>v z_6D$5J?ssGy&l0{1NORyy=Jg~MX)!4{maANG}zk_>@8q#d)QkBTN%OL1Gdt`-ZR*{ z5$qjc?|Rrf275n(eFW@%5BtbqA4aebfPLs;9~kW82=*zkk3H;DgMAXgRss9O!&Ye> zeAD^yr=^*xeTLLECJe#Tur`n&9HB;5H@9)@gCS#8oBCtPSBzFF-bX=f~eB(mFYkcuC-CR~O>1KVjUU zIFry`(}S{ULlQ9q5|gdcry!PR(-dUZZZIEr4U#j}E>6XI3bZw}lIxBZlf!XLs_tnS zrzYTHglw6jumrH7pIlGlS2VQZphagFQ_E0g`AtW#TI+tBHW9J1%x>vSU8q)w77jL+ zodjyPHi$dbS^{x%T5|;|_z9G4BNvAdGb0!3Nvom*>MW_>K$&S#lyrYfJzocoN49b6Xgn z)j4L^cwg;i@#F=tdD3JOXJ1HQ{h*Au>N5_Iquv1yhInBzg5YI?4}#Vcg46_E&db7{ za^&2hkv7OkrnS|?BP$eEnjK_{>2Xb_7u0Mk*K`{T_S^Weq9CbU8VC{IDpY`&0>_f@ zwg}RhPRfq2nhfX?^;@#mtpiRprP4}U8psgzx-#fh3}H#D7Y!@^m``4IMNn1@v87`< z1r!~P%jY~M(qI4I)vwkna(0FT72bbmv4{h)HOocLjrjjJYU(|hAaT0&iv7VoE^dm& z4rawXh-sC&*TJ~Jp(jrVuuOCY{>e_`v#|%ZKef}HJHB(u^xRCj-~8g4_V?tU{r;XI z`Tae%GmU_b+UDluQw}p+X|pyY&MdW_vVG7iD7)VtMo*n{D19ZD;_3Q=0t#s&+>9d$AvPssD1 zuE<=s3SwGekdkBV09QY|7mz{-k;1-!v(OpN->6Eo%E96~&SGe53By&b?6Pc^2qnqI zF>9xU&S+3`nxS;qJ8EL;FGOTDAk&t`J#;FH=8Vuc01c~E0$&)~B-@rv43apzV=)$f z)QT0vg7iWcoE@5^S882s#dwEfkEhYPPdx)qXgtwf^X+imX^~s&#u}q9pQd&Gpfy9| z<>FTJxQ4AY#kopt`@88)w!bMqzoKNEvYUdc+vxNb?@!u7K(TuH}xX6e<)EWHYt zh0#Piig)MAY*6C=UF=pAeQxX!4gJxW<*XHK9#Oe%G8R`%$kri-p}Ht*gu@-o8%t!D zaSOeL&nIQVQrdS%d&WNBuYBy_vqqVW9^fF~IV52noo1B>J-1F=r7gx6&^*azFiIWB1qZo28in`o+fITEEN@2I`kN#vuJJ zEzNAIU*gFvr?VzqO^A&HV_*ouo1;6+2Z%C6O*!uyd<8`n`kvB2juH z=kU*TjaC^tvYV;Hglv}y8U>NnQmrO;a6cX0j~JR;6uQvYozofdO_&_dS~S;W!T@ao z^0MhO(}@>$Moqws$*@n&gow-Hg7z%dorB6mz~VX%?x-iS+M=HOYI-` z9?QSKsrRsaJj_*;h3!%HDauvDKNj(q5dS-(^pV@P@OA!H1zXdRrqeo5M_Dj5rL{Gt zlD5*AZnTMTJPg{#)G@V*gZg$uYx|)4xD3~zSTNDnT&sihu%e_Ds%)omEHZV{%?;ep zX-cRN(N2__{~F;MbSl7IEv$q_+S0UEb^*8vE)R%GC}?fB9U1p%ZH3yTD}2~0OTI)Jm;WUev!!$9{s#@XFmMymx zE^igDe041Z{p`xu>Uj9}(~|ntY}nrz_M+7`yrR}H15u=Q%!4?xT(}6Ou>;X~CECLZ zNc|vno6@8J{mg14U+EcVz%U3999bo9!WTA5x|iPe;!LkhANnb6Y5F#`)OIU59i`5- zDpv%3o7!-tLEluiiDj2h-{*>;&)Vtxw3xp46+!Q{)Aw#M{U%ogo2;FF6Na0nrm3t@ z-R0N!%C%dN>6>c$QOWxTeUyBy24woAntoLBK0)uG&y{QApXr@y`cdTJUZ|k=l`Wv( z3kAeHtAbu+q;+#G-9~KvnYUHw$`;7JE@U~~$g)Yxm`Dp`n36~{w9el=Dhm@!<3ggU zP7G~lI-~rbG+-Zm9JFAcb-Bjvm{@77a=H1#epbZ-W@%^1#BNvW_e&Go}R{woXja zFSoqd_5oQ7po+c4ZRQdmlP9xeQ<^++3mWZlwh3wr+4&R6rM&XK74)S`zy<+RZOx~l zzhoWQovk|aft31EV=6UBjYT!Q9rRX=r*9+qpDN1V^DO8_+N;1;f^|XHQ_N zPD!G7O!GKhC7op>IN!2Orf6b4+2Bmxn#|L7?a9ucl+ANhsB6=2Tdt>s-Gm}a$T8&b zH%b`(%#GoBjq)1Te+~XpgT>@aiDN|M6g*MN3)Y9TQS65SO>Z69=B9Yv`eE2*R6pZ* zyJWm8qY}H7xqh4x&J8dOZ*l+BgQpJT8UK`EJ+ix`>yy+*-pmFha8DajCU$4w6KC`~ z&c9?a;VbA+jg^^=c?JX=1~_ZP_Q@hS^C>|MR^)aLq_6`K~z* zhHubTCp6fsyy1yK=|mlMWK&(SahNwtdtK4gJk;RVOM@RwYHne18Es<|Y_ib|7?<&hiDFs-|5sj3}3)Q+zZaC~Nc>@ph|V7ugk%rKJ-4mV3Uq}i-C zeyB~Dj>&95PwVC+kl=^U+NwV$vmx}~KzrbrBu~f$LFf6|;d!SkS8?Zp;WIL$gItiC zk=ZdAuD6|n)}|ZnGI$toLJ*A0WP;fIY*kQIkafh2%x=MmplU{DcYb)=IUvD|%&tMH zxez-c1{w2}REn$`RM@W%&q{7(RB^D-UVCx(2%{fkm+q5v-!`E&&T_OQy=~r|=@WES z{=Pvs{cK@IC3oYshprop(+NI;)dlUH5{kvXb1vqqJQK{glm?^EQ&I0r8BSP!LVT48Nqh^xhXp` z*lA`koEt-@b^|an*mY)5#oJ`}HZ&MAV`eaf57k6m-eN%pOFT^E3)yZ48MdR4Fki@Q zWebDdT_H8@ZD=r*LWWYvRTR=^K_*m3 z^C+Z}V=2BR;f!G0AS}%Ps>`vP%fBq2Ki`tYqbO&D(+BN zzymIer_8*30eQ;Ib_GQJ3zLj8CfPO^?U-blvTU0t$YS?4Bw~_9u7Id-VURJ#AW;Dy z7ZtG5y)_c!RaZdNxiH7}#vD-r)f_|s1J4}aH7#JZDW;DC=u0Rqx;?p;BKP_4(TDNwsmhiVO2(3?z@q>O@<7x1LOsh@pvX z$}7iB+R}L#mzfxe%G7fu?%?i38(A^x{AGW_L#Mh*#2IW7=d_Bp`Cyrngr0I&0>;A9 zC{+nhmI|&@LS3gqHGUG~ZU&~l7OKc+*4kpROIoh1sq&HG+9G6?xw@|6_gBm!y06nL z;<|Wvw{23I>Ri>){KdR)UGkQiL->N#wH?}ar%qR&0i)= z{MDg+W+cuzwud2n9WG>@#9R zn9#M5AGMGlwXh=SXvP$$9SwiYEvy`jsUUgTc6U6{dm9}DQ)}9hmQpzhF75aWTO~uQ z`o8bpAEBeA9XNFjYTCR8uQaw$fh}aQX4u6B)5~XM?Utvkg{G5I`(WDH@+TZcpRl?j z*CQf?bU>L3D3j+|%wx9(?kHni?mn55ie|Y}k(Np~I;y3TB0qC6mmt$^V+cBbOxBK? zVB_;G!zfd!PJu8akcN%@G_Hs}VJ=Qv{VzlYaXr6)3z27@+4X-MQxDdRwohc(ZbpTfBfSQppOm+q>+xi!urL z;%;W`pf5vbWQPUAX6nYpa`XY;%CkB5twtZy*=_YPo!!oVyfIsajQWCPJisq1Xygn^ zAA%7V@JdncwFXOycS`Z^H=@vnVsK?K$uNPL$k|hkO%~kaji`cQ3-dvz6f+-CHS1?_8U9mc z42L4aXZ;*5^v*C6QejO^Fl>e>Hw5C%$mS=zvDjgnK#MxVXVlOULrKSv(pSx#IrB#8 zJ^opio9UmbM;vOh$0#qZk($%Z99{{!C5IBNy};hmdkpt5R$ErI+Xd}S+siA%F>0MX zg>%gmfMTe-@uu-)G)&}=Me~@Lac4~Px<<(6b)mLHIEJ+duprYh;A#iEKwj!D!=_=c zZdh_KO<0(n1$&kvWJPo&P@^u8ZyR)MlD$ypSgXCvARt)dc|_1r9ucm=vy#v?t|UBt zNV(}6FptJ>owz&}O~ba76Mm^3G2&-ewoeYfbPL;r^$~5?%XN90;FN}J;??q4OVvt-K+(6;=ZbjdXNM!SBzHl}oYMfFEkW@3A0M0kvXg_~ zjBS|{0`g$#or`X1F2Od^e^N(6R_zw1j1G8%NstFRZ>P3yQgl0KHp#$bw{y0wv%y%& z8<$P%dAON}FcXk+*olwjFjN~QM(E%VLDGI}(Sz^@Dbjvt(Pz1tHQd3Bix9mvq99GK zH~}lnFv+lj1jCCHM3gj+$u}sQ&Ns<3ZkwiUY9|MtZhQ34RO{AuM$_% z0BetUE*9f8-vEt}LEa~+WO=>o)2I!ki3LLoiW=7Vta6H*5oy|r#IAsqi%&q`%RQ&4X>$0_PR-n$d;%k3V0c zkvrcHeG6>L!=#qOb((7 zj}EVqXM?9EvxdTv{FnIvhWzZ=F(1Ha_sR_yspEt#LE#(s_s z<#Hxw$@cufoICl*6x?;7&ARzbvcF_pbb&W;jP_xFZH5~a638dL4;K^4!nQ=^i~FrQ zbZ~f&bto4;V2fGB=xRfRJ&&RFkNL{flzH2X+c?IxnDI20LQhPnAdZS)P~MCVje{+I zjr3&P3%AB2V2Ob0dW1SiFdFD-JuRj3Wbv3%?Zg`P9Ya068S0UDi`jbOvMXSe zt2~S~HX?l9DA{ji+r3TAh| zDk2t{MW5v}Z$!uA-8|9Ml#d!tw-J1+8=TKL=OT3t8K;pwN+WWcPla>`woSz1xNdkH zLjr#GL(H(X^|*KA<5)eqh5*>p*$F(2MY3E<$rw*$cTz_b_l!v&_m*rNqd@BhCe@YW z!dSQ^XMi-phGzT_m>*MKPE`eB<0FR{_{^Q|3SCZrs>__fDDYRH6?koUAo?0j#Q-qV zaWuoKT{o1P9gmk<$SyASR43E5XcAnOVr>0cPf_Uz3q~wl4n0v4;lc>4mFWRNl_Mag z9cmdWSWd+?lzpRdTOkKah&x$gx#a3?%*A4OVJ=;VNFEF<_RmpICy*`)Pl#8mP-lQURzvLTt!u8 zRT&TbXGQ(=mFpB_R}_wDa>o@t@$!l@ruH zRTlOOe3|A}%kUb5^O|QYWYnRsgQp>88aWV>xaC?m&Q9%6#L}Ld&lD#V$RFYI?Fwll zs&2+j>sD`FBkegmY_61R#GcKRBE{Bt5w$PjiRNX41JsR4X(zG~QCW0UlRNzqvFP** z#iG+Xibc2ING#TqScd^OU064+w~pPImyl6K9bp7(B5J;ioj8!7k*|DD{AR2@%XDG^ z0~n(klNxKk^hgt(8L{>)zm;^kRxI5Gmb1IaIYf5D z3?m(3SEc){XA+It9QE6*HZO0&wkY0awRw3l+oFn1n-})4w5SF2+yWlS<7eZZ-O7p( z*}mh%4$|h0OjF)Ij&(Y?FwekPnVd2$WGJx=hZHfQXSx@g=oQxkZek!**J&`mFM*W< zMX`Ia9T*Jg=1%B)mEsJBN=6{;m5>`Hjo0MD$G;~tQoNoXrAf6CaFfGAF{35Wz62#8 zrs*j2znJn1xh*Ki}XlmI6x{ET^ z$9HX$VWTLk6nv_;ky55;W0_22(fo#+VWv@Zi{{d~5#o(lnrO2c&+I;R8#S)~%o(&a_4YUnIGAG`3sjGPqY7?#2|Z-Gw}4 zlYO;&r3}C(>@qOc#^=qqyGho@!D!tD)bz|4RDgQFaLhL2>}M$9jSXf>1ti!{g*BQX z>quN@tTbEj--;BK(52f7INmtf)IoTjnUGEBSj63=yQKLV#uP(=h2aO@Nuk`WV&f*R@7iCoyTJdgzNr*7NGu4YrQX0mMJp)+zlG2 z@!1mHI)zeC!lY_;Qnb^^l+cae7xGZ3I&to%d$S7!qq(<{(n+O##?Dt#$n~V@U?t7O zDO%NO1W(gG3bl32gIFhpoG^G<89uaPpRKf5Nq&9O7|k(frIl4|OGK)=5X*u$HJuZe@(vMerc~_3;o!1Mr_NTVAm;Y zmlE0_UoBCFU*v$0&%^Ghu>OOeV`05r`;NsVv46Lz56JbMmgF5Hfv1XRCTA*E4ss|K zm0qb{mL(Z)dD>#4zKc_jUZc}^nInsu*6t_M35{=5Tb}+41+)1yuQg25?k)BZw23e1 z7xW5pZ9`}HJ^IDFp?;JbD)r~))c0p=k=v-T?qk03b@BXDBtT9V4J{raGR@cEhl*yg zbjD4A{IyWV&oI8P;;={)<;^IK10LHSmuOlVjf>_e66ne%lb4@$ii|Z8w_emAH=uhz z%DP&I-hfd#=E3bIv`%iWKRImmi>UoGlv0cTCu^7*W2)9BC7yosydBDz);O6J{Tem+ zS|eB<>NOCe31^(sJhJFBjmwm%+WnaD(+EosC!4|8>)WRqEoXDRs!?!L$vA|501D$R z(~~M9nqH|fYLRml3WP4Xa4m%MLylvhUp|OwrP63%RQ^fM7Rg9!iov-Yno1|Dht8VJ zTN(NJJ=)Ob>Pa`bPuk?ZQOVm}U51u-S6Ht(cR&j{%pKsZB`r~S2W2s_=(55g$?*49 zz~z3>$xq$Z9(2s*oX5wb&lYGcYnJ?S^jpZ$h`#mo^-_K|3asay*z~d4diJr?+D`0W zr+36X(CTUekT#Jh->o})X3x*c8z*1s?7GRp!I5q=(HuyaQ7EVC8QgUZiv~BI0B{8Y zUs&Bun|>;&$a>86Ddv!cLhyq0n-uRxF_W(*#sB%Yz`ha>RK{eNKgAUUvDE2>l45ia zfyB!{L7=>Vm=bD6KpOkVI1IDCn0k);i4Jng|Et=Yljg>%O`2P-`VUdn>&h7zC?n-d zYo^D7lGIK9MybZpfa8|ht?s6irob0ykJy+5HbR@qNrXwo5%M)A4B+{8>*mJF7e<61jSvg8>e*B-{Ydw&Z`)uu zZ&fW}x!T54Id~?*0o>mi!fr{vaeF49WVmNIhmAOrt>eZqy09U7@OW=`iLuvwLn zt+e3#9`?QD1iKO~srEA|E?d8Eh4!~@Xt(gW5qKF7lS#|yVJ5AxruO`pmT;?TANw{sN2|Ej8a~I<^tbA0Hk&F&mTrEcL!``pQ^A{{}^E=U)4Q4i5fL zI+!|K>lx$ex>(px`vd6OzR5jx_|Km9({0n{CZapTe&HjF0Q^ko0lO!vm)u)JlJ?Y!=l6?d+N zRV(RqXZ3i;LEaVIlJl2g2G6*OnD+n|h=-f-1H{~HZh=(;0CQVo-GrM`jPvbSS3kWN zwtzo>fwoB1HOj1ahMJ2*g5O$_frU|?z9!D@t%T+z>oj`-{YFmte>r<8oL`yTVIP`* zql6J8^>LBo%uaSnXq_vyNjuQpbQM&0vshLSIsAyk0UiX_2w+B_uza!CWey&Bz3DqDG-8 z+Vr*72e#Dj2-n=a5?yXcfU=gb9nC<9Y>hN4>afNfg)~d3eQWRA!IHDGqFNkdIY(1| zmXdHH`CcQ3c@LFucORWR&bOPVrtJ=zYxl;@xKkuu>{QKC!rBgk#&$I_qB%3&I(0$M z_V9xGON)w#O3jT#Et1y8%8QB0%)B{9q-RC%C!UOjOP<6cVt-^)V;=9Vc(J6B$i`f~ zThe>R2KhZ$JyKhd4jyEBqrULKDM}p(7Ok* z!{%nn8nr_L*~ykh^YhheDTgA>o3_8#wJcAni1AKbFQnwp{01s8=luxw-*{5%Z(U?>cKWYH8nWa z_F-BhM-_3W$xWj!FzZ4%KyzEiEgFyV?UGsCD5{aL)-}W8-9)nWnrCq)ANdk1V*$nV zO_XzbG}YeYllNxy&|wH$$Yq-gn9%`!dABVtmrDM@#d{7^V4rbeq1u3_C|lHG>xW#t zXplf_)B08(#&yA|vN6zB+wP>Ktz0{3!X^@iWq3mb^=sYG$ZdF14!$MaM1Q|xE^6F8 zLV8=HDPHt2?}{v;0u;fgSU$`u`g0N4g)=2ic}mXC0?F_Vqd;pRrTzkw(OQT)ZMKSA z*IEE}wEJ~c98W9M)^%P5WtBC*Z?n*F`~|H`9a7vS8Y`Lzwx{MTCU*tYG)(nJ`-FdD zttQFjjzbYKovVnY_^*T)rjfe0Je9iR+QfD77?(+;j{VV^%!q4t_@D;F;OaSi|cD_6DmKK%1U?$Z8UpWkPnn{!>4%{roe`!jPc-{MgX zLzVBt+{TZewPs=6bGiGzu6(6@{2jTadyanL_Pfu{O&YfQwJTrQCl?F#4)#7VU z?6$*G4Y{jVY;nN*H%+ZN`>Q9P9`SHP?&wp`KIoQfuB>V|(S8V>-O%1u!F;k~(nH*Q!bH)GeI{ey(T-$}4_WRww zm)GufK!;`V%Nla~e6st64b^+rF5PUxqJ`%-ESE_vp;DbqR~Q?>7=Bj(&y*^s;c_IbOV zxZBxPo#$`X`hR5&xiKf)@os$7xmBCJI_8IC;|;l8zFTq7(6=tBTGQn(cbETApDQ`w z;^Eadom>0Gjnn@0#5eW1Blp~O>F2vlt9@q9ux)PrqCR)=z`c5Y*Xrup!(S~u`p(bl zb1!T?eZE8Y7+7D)Td~D!*^|_=cb-i)w|!;FTGw@pZnX&y+2*J z{$*8d-um(CyK8CBO%r2VPQRq~)&bX_boYbxxt(vi?9HWbpI1BT@aJc~et&)LPea-* zeDdv+YtP!_`hEM~Tc7*pz*9dP-QnEYcGC`ede%S5|H_ZuO1HYK>h<3DZN1}N^|{h( z&);hAtJr(Jci%a5YE|F8cY3SU?e)1&p6tHoIZtg_HGlLU&);ND zeQv8of9e0>=F_Wo%FONj*IVmzH=cC$A-lYPVQs~mCq4Mi&Got2yEP1dVv7rF&)H|# zynoE9&)vDI|CEz|KdCl&Z0VMxZ>rDjx8J@ezxCW@wY{?YoHb--eeN&a|51Hg`VUpd z&l&ULJ~QfbeXd&n` z;mn(Nx`y}jKip@7&AXplyX1&b`+my%iWe&me&)KVRk?%S-s33BU;pOa9(;52Q)|zQ ze|mf;@EO18h`oROYzwbAGv(Ce5#9QW#;FHW!heA@Qc zzBao)7dyZ00Y}W8T6Oi|=fC#UZS}c(KUw|Art>eVdZVV_s1NR_&#n3BiR;GRe^~8> z+uzq^bNXxhKYjJbv%fjDYU{sszWPr3^XzRmxOKyd%W9uob7|@T`n&H26E1jQ&Ox;w zJn`(jZRXeK{`lb3)Bdy3gxYq$Tl~!S57p;x`_I?e?Y5g%yXWq2-+0!-`rNJ;AO6aO zr_ZT-nr{tP_@OtT|T>Z8S=ECcE$1qm)0KCYsB5jmyoy3 z>aW{u>C~$I?it+ihS%zI_w0ZCF_Vs(R8{xm-}f1heBFEf#aBN2ud`}T`D#Voc;xTA zEuNY7w;mT(&0Vqo)i-`zpZo7?%Xhit)TyD8$k#6)S-a!G-+y`18u<16{l>pre`)P5WitlP zD{aU<`_`XYzq00psuv#Fb?OG_n>((W_TTRpURqnR!7B$miaxrh@~**m9&>!vb-z33 zt!ulZ4}ZMzz|G&gxayQ;YyNb5K>9ycEWc#sq^ez)|6$MBy2 z(~sV?A$Mf=X%hyFKcecWsSR%i+ce}}xNqs%-OjJB{qJK3?UO>k{`J3WatF=5r1rEa zt#%o>V?%D|IVTRev(41nFQ>FAKW~qQ+^wy)z2%&nPN+I>*7t9A+pi(lE;}-~;nK5e zuR424m-og}|FlP5+H?PltIpZ{jpT<%HRN_3AHU;|!zNXYy*K_<=JK0d?){tA$X2;v&TI3{a)8Jub9~!?+|0f!9_2(?#Y|dZKuNt|-F$bK)c>DQ# z!{2{sn~Q5ZJ$&8VAKzd+diK)YhEMrh)vHr)IP;N@8gf&Xjtw6v{e9IJ6EEri=vNK7 z*brwR3_jwi%l`1yplzMuu(EEf?23Ips4KG%D|5T=^T(^NzIs*elv#c4`>Gvwy7qvb zzpQ&Kx5)+lW2>FPQS%Lk#FFl*u8SZ1@~i#46IIoC;#p8KRx_n-O3StFFUGdiOU(YIsuMd@6ihmd9iNkq%k{f`f5kl z%9a0Cojp@sXP{HsxKI&2pSI0xWPN9{A_mKAklr|)&{lm84{&Kd!i z0Ia_1nzwdbQ8%sni5GYKV=o7+7H}27;GKuw{rH8tSNqSudV^Cpalo-w=X$BGli%*R z|CAT%a`T?Qzthv53xIQ40FJae0iOK)_hH``>P~w7_kA|rzso{L1gjI^RYyH?)#BxK zC3}B#WbIuWI$+G|T%UH{e*1w(EU#NV`>ZXV+;Brz=gP0uPJlbz`JW3)m)9M>f9a2p z&)&r4TqNKUfK!iucjKFu)wNB2{g3+bl@3@V;3|O2?w#Iidu-a(AruHWWy4h0MSG0T9QbTq&m*5+aOp!CmosK{0<5{_sc$b? zTDRq-8;{)M@4X9vOIiS~{7UTvICbC&=RW#O-6iuc*lgbJ-CfQ_0!|62vwHU>Up-xS z_|#`}hwlE6=K!4d?uNA+Jze+7BctE^%Z0rhwgz0%023FCoGb zfb(X&_rWGl)Ln8wtEm^f9k`r}1Y8BM`k4v+cYD09>g25sd8D%Iw#L*3oU&2#z#8S8 z190jF!4DH3s~fg=@7>Nl`3pz*YO53A>J7j9-Q|zgl|MeQ>)?wvc6E-mIsuN|^re3D zAE~?IruN-tRSzlvPT9D5;7F?z;M8TO{o|EIbzdLw@#HIxYVEK!;F1=Afz=6c!Q{_ym}bycy|{RV8=&y{Mh+nR^1{6duN1@9ej$=(Oo z)|EZ{r~Up=xxQ=2A^}$cT)E4zqo+MoxA?XLKHh4mS5XF>vPtv68s(e=ux7KDcX;f9 zx+C}9bho~zd7Wv%B`pA}txkYrKREw|)%VxEe*6|owz<;llCc6#>5W<}%eCrxU)>)L ze)5n55?%`#a83)rk;=IQ;L4s?yb|71_pgrsS^E0H13cNS&K7`y)!7FQx~YEa!~R)U zanmIy9ei3RPg()z2-tqn;MRB5U3&4>XW#J0fd#-NEdW^||WQMcEPIrilb zPC08mm(ze#`Zf<-q?~gAF53K?{Z6>Gu71XsTaNx=z(U9G0xoF*SYvex_`e6wyWys~ z+y1x7zvn0Z?G=rHQ~EUztQPRLeyJ`ex4rhP8|&V$_{V9RRQGjN8tm!jVPmaE3ax&r zRnG^ntQ&gEe=pnnqCPI;NCD69pX&0%yxEH`sk`o$72lk;!M~jDH`r~>!vf`d8d!RK zzm;dyy+88xHo14ZyD|;-N%OFn^4%~XmC*0P0jcC7OqcNK0jVxiPVAhn&VAhf`m4u3 z<&{;nV5S-|IOxSY51*Cm^W(x3kMH8Uu3E5FWL$J(r`x8_ z&Yix={>v`^yKmP>0jCTC_|~(>KXXT}Ri9UP{PM^izR?2C5wL90W}n=dJ9YSyJw~)| z>wqgi2e<^_*wM>}U-{46wKufc_n^)51BigD0Ipnq>%SM?lY3?NH*P+7u@{T60#4Z! zA-;0A{a4+W+hF~Js>+V?*p3u%4!}j9v|bULpWFQN>*rjw!Do(_Vpb=>k$*hs;4L1^ zy}skZVF$L~$kX66)d_Iy+=~{ETaf$U$Zz{sPwnWitr2j_U~<;R_nTasTXDz!Pc9#w zH+%$~12AZP_Ryyu&aK?x!@G`LG|=T7Dc}--E8iG;>Bn`sA6w7Z$>e1>Hu=iOP zcYP%HWvhYDo!pRd2(A27b#8{H-{>FxZ+j%S<<&#BzxY;9gcEpSR@BeY{zn|^3 zXJB=1t`Y714|+e5d+PL~KKOVG-_Dhvs7`?C3m@M74^QS!9#l2pg6H$rf`Cf^9(&>i z9acY?dna?<2N$)^_oslX0PeZ{ITuZNDp$JQrN^cZ&)dfWp1(z^%g|5ndU$be`G8fo z?Y(U)Pd&kI1NQBk`|rOb_t!Nw`}O&W>zQbw+oC7eu`pNJA zx-|Df|0|w2?z1nP{EroI3Bai@&fE5%&*rw8*ZJFiYrKe!v^tgZqcv@R|6FeH*WuXS z9UgUL4+K1at5lb_-kQ3-CxXIzjEqlTfblKfFrF=fQu(SdeOueb0@xhM8$Kx zH(h9YFR(fR4(@ux$|W!6X1&_F=agWO1IDaQfHgx}-I;wU_s6IHa^|rQ`)TCL57o}0 z@Ymwse|zdnxrUJk)qg(M5BZA(oHI1_dDpRj{MW*lUdp|B*sSt?sn!esdhB7x9dg27 zkNZdL)Ioy=ogT}-pLSZ~V=Or8=tGV;>X<{0`+IEfzsHU_ITjrH*Q1Y}aM;PQ|EIUJ z50k69@B7iPVDw_5xY#w6I)j3Y07>3my&x$PSiHo`?9ScQ!0gO=W>znh zG_-M2+S;j7ztna~q4i6!Lu=aNhPJe&HFmK}YTVGqPUxG1TmRvw4}D^%P9B~o{eJGu zclPYr+1)GpJUx%^p5Hn5_x*l*!)@&>5bSK)KN~bp2 zwX5eEl^GA_8tvM2BdeC%r<$!!Xf(64li6%1^yfts#&4;04yt!r5*)9bsnj~5-D%BD zc0#$8$*Rd}PTW5^t{<7~sd}>_@NIe5?o{{eY0TB@vz^v>C!Co)RiUTb)$2!g_Ka<# zGEQ{D@lH6_QR=mJm~Mv?joQ??^69LlOtN-)syWxFmK#k)UTG--p9sg>p{Entt$xg* zQm;2BS){P_RJApqAQ6Q2Y?zu2$7e%juG7qum~Ay>wVPpoGn||4Gz6$M8==|=jY=aN zZ-o7gkTvFJ!bGL5V%C}}KvwZ^;i%R-H&+jxdYEW7>p_JGwL0~yHKxn;npUe)4=3tj zwifEO`RM9RPV2|Qsh(;V9=6tIro;I7++3~NoC>wZR5(?sPlb(@si5`A`ZXw5vwGIa z!c?W+&O$Yttar}MW}$q#S=aWcXCYUsHs>Z}k58yx4~*9ur<)IC;drK4tKoFBRt?wA zHME1WYM7Y}XC^{xBAn3AGnH^{y)rXVtw^{p`GLO0p1tSi`@_iWg{7I<+S#nGm7LTv z-4oh(E2;7EyR|gO!!^e_Li=dge?;qgIE=sh(2-ll4vmi=4u{7MhieXpsY7Aop~|6f zqOv<{RFuPbZR%h+c=)z(`arnjKsa(BOpNFlJ`ncb+7IOBzO^sxWixCp=XI4IB1`dnyyPJ)wM0zsP&o z8+-Q5Z_#mWo6gASF0EgF6TsAV(+#j5nLD?Ktuqg9^O!xF zE3KL&b&;Ga*Bbe4G?UTEbnoh%+uFx$4ei>4S#wIa;Qri}u%*`6GC!O*H}@xRn78K5 z>-&>i_FW(L?3o{Ly}p0xY~prtUD(9^=DM&yn`xG-P2HOs%}%*JH#@6aYMI+txmxK| z%3N&aP3>lVuA^JYp7LBfD>rH?O6Qa~Dvf62+)Q&$XkA?G*~(;gT|b6R*M;(?aBY4` zZt2}EuI-i*sf*1&`S>8h`E-X%zk6bOuF}#c zL%x4JcjxirM&&0O9esLr=2{J{)Li3%a;HgA8e2}+TAevXJ3q^?QXKZ%1d?u?``PdrZ(BuX_S)XfbKj5;dUTID1;lOj7 z%M)`GTA%iH^Q`TfZZ``)+c#FX>=St$NDJgtrlx9o`lytr^s$*=u+_omb$=UpIuB)`NIr%C zrn!X?Pd}JHDe4)komH>PbtcZ#D-&6Lk8Xz3pVN_|Z@ zHaAWA^?X#*jVC*;)zMX_>%833DrZ~Edamo2WIO&olXz!XAlht_9G&Ku??6sklzHDw8tMIjyTrRW^sBIQb9rPJl^ET*bxk-Tvb=g)CrS7AfUaIWdUp$2K74TM_`&$T zeC_muwb}BPYI(!P_J(V(TNB1U`>n9{BR8*J6~aZO5Y}82!X-l?{KUl}T&(}twC+th zE|tAnb8B>Nt$fzW_st=!zD&Q6{6q-nh5eMwj|%%~aePA9$Heh*VILL8qr!e%9FGb6 z32}T{*pG_iQ((n0ER6o2OJSQh_K0hzFgFXkLmYd>wO5!O!rm;7o#NUf%r;?ni(^<^ zj|=++aePMDFN)*y!hT5{pA+^;aXcyP=fv?PVLva9FADn^aeM)+IPQ~AO}>-D+%N2u zIGW9}4>?;`k$B|5O}5683d*ye{mI z#PO%X{*gHTMA$zR#~*_g$5CPK684xl?iSab!i)=hLLB#s>t10_2sUkFvo1@o1QB&7POB?7cN>6EI!nXIBCT1crFC*_|3)G zxnnQKg&ws6i!b(t>}9$4@z}1tYq8S4Ld*F(cgBtdd%5_XCpsL~T@DkU(=8$B7LnuP z`Jy&>;-IBQu{)lkc>KNY#xiy+*voNoKE7_uu^c8o=X|Xvx;%%NH}+3$ z*3bIbG{!}15o598AQo)LM9)0ArTVds_aE5QZ>cf+)HTBf%b1=vNHgYg&eSW81-#>l z{Zl*Ec8?Rc=^8?+bD;JV?Q^%zq#$CGNtV{qu0gLoJ-PmALlR12R+%e9E(hnF#p z_+o8r6%l>r*pqTI{o&P2G&gMw>Cc z`If`u!``4yaW2bY;&bTG(2luS3-iVPsZFfbcOHzv)38%aJdUx%!r1wnk9qirF~(v$ zM$Uu9mpzpFEj5;F?hlrRhWDbmm%=g+#&KeM&5Fi?UyOl^7?_V^!RA~V3+wKjvEgFu z*r`j3iN~C`ugqK%4)o0DI2gxR>^OI98ui1b2SZOIuBGtK&${5On_}WIvHMtjWsrl-*} z4_}PM=A5-;=Ic%j-UqhH3yu`;81ct84qxw$6cdjfKRO)N@wyTlwquO3*!Gu8j-_`U zh=)cTGQ>+)`Jr4&q=ZZ99(Vqt{2ov)Pn#V`X=$bF~S)}UpJlJrMM~b%(=dhhOdd@q= z#AA59Ry@maj~TR2VoYpEWekp8BQw_A$I{*2i}aILg{a_Q?j z2Jb&|H@~^lT;R7BTwXtH*KE1dzQ-mWII;0@e9R51Ma*YC zx#k*<+g#K&ju-uuU+Cur;x6OVN| zzqybE4S#rO#uJluVk~y7?S;b^+wou%4{bTTwedH8(1OJr__1k;5!>~{b`9vALyW~X zmRzyD(Dr9cqbC+}qGt@=IcnIi8(0n+ocJx(%;z{5uY`%Y@FgBD2(JbCVi(O{u6gWm zp$`|092vV7a5Cq0A`aJC)BQC=mwEfe_&8qhXfcPsFKRTwf@9uzY%pM96e)r)a5xbZ$I>7jpb~7(WPP2tOXyOfqPQ!+WaZ!BiXFPGh z<9e8raT-6lf&&8=_J!n+FAZ*NIB4d=PBr7P_3Td^=JdM8{;7?RvDn1H*jUDKY$=}F zIBslkjOiUqiiyWD-dOWkmw6iF7>mukb+FL}Powui}08=qq0F}1?q4}93n z#Xif~-Zxxt*fj7oKkO`rw;p)M0p8aHwObC4pLJX-;=rZ{@7MUfM&)9WfY(MN&Gal=7 z?t3Aa7*GAki{?1cj`^Gi@x@qdQ z8k);BVVvTfueHp6!#r<(EDc{xVnfSX1S7d`Xv$5?E1 z?H9-3_0sA7I%21IW36i)bm3r3Z1mK?yo}+BE=4fDvjh;AZ^o+qgFJn7F~?b+(4%fg2uh%wfk^ zY}X9mZoXr$e|go~@BOsFDIgwufg#7Hrx6Hv#<93LnTN-C&ojo3HI}pShaZfw6w8{- zI~I~dx0_^F17C17Y#JCBg|YG2X)MfH%YN{reoKwtNN;Nj*07jw&D;&U+` z+Z!T29%@PrX|Y~v$8j4Am)8m&$AX>Wt;NQ6{P;PZL713Bt_%3#0UL8L zHh+x8CQfT%8}Hm18;f6xH`X}&Qdje_znJ&lrDqHmJ-*Zq8(+rs=1w)^vAN`)^MkdP z@#f}SjKy}I)XQT){A231cih81OtGU{fo`^jr_vv43iVp&1W`W-i7Y%zm> zTxeK}dGyug=b5L`6R$ChofG=t=$Qxa+!z}}tvOeufdNY$z4w^Iwl22oka8Mp9(r&b z*t8TAkKsn!n&z`6W5+=ZH0ns+@Yp}qw-58K5q7MN?Y!V|UD4)X4xSVfk9E2qAHFnj zvCne$Qu@S9gNx>PQZDCqA(}At_6I9_78sMH{Lme0dF40G~y#x z^sVhU=<(;krs20#TMBOtIM6a*%ELTyQx|N$4PF{!xU7Lc zc8nu-#$HRA{hBZj-sj-84mi#gY50-@JlOQa#(_;t%keCQ7c7ql4#$O^a)GD04vbgQ zj5+W(e>`8*_WHp=P1#S_Me)Q+g9n=)4i0lK$0fG~>q`vi$MGzON0YibcE;Wt%i(+u zEPID|u^qSbSg96EZd z#}_Qk`NlrW*-PoeMGc9E-tnYdJ_k>FuE-d?^Cxy|7Qx~pNS-seqL|nZy!GSx|6leM zs_Ye4TtOJUM-8fwZ$bKSMfk}zI)BlcH>otM*S=lZ@^XQ-;Sw+)$Nu+sR;|5SFCXYO z5x$vey@{aIeLu+Rpp%z{vETf?RclwR3uC{f{;huo@BGJVy{|w`KXvYV_^cNvK6aAjx`eD5a>cGnW+YdLZ@*DnW2(L6kIH~?g^+Sq>M$erkj*Eojxbh4&_v8Ry z@{WBe*@`)gj@+u3-QAhLv}!>%-S}pu$qM!bs(?7 ztC7ap0UCdCTE_+**7<4K zE9Nq~{kEpwJ=m%q@4d9{4!^MMfZ)0AQ;}}vaB0K65~>_4ZTN0keWi5OZV6SYVd!1- zjndolzO(M)=dRKC%$o3+0GwuwPcG90NZ78YF zj+8e1K=EbG(%ZiwzwCph%k@pEVLB_l<^O1Yx>I_~Y4x?U7nS}%=j+Pn8lA7}{1x== z(q$i~m)|d_pE+3C@H6y>N*mrsUn{M9k9210r8UGeGqb96m-%&1UHxFDUP3t90e>sGk-8ZNkmgOY0iK&CU#6 z`VsosRi(4^?J$(jcZM!{QTPwetuEKqx87UYFfCk5d6ei?uiK^5nklXMIq9~P&zI%b z*8E+XZ?{Y9pJS|b`nuMot@WYrWa~;lqOYyHh@N(+z4*G})OsD>Ya3;+xYtI8Z^_@^ zdf@DAOS_Bv$5rC?o_>0O&N~yGYm4a|)ob@^XCs{tMLJh?7U#1m(YdaW&d5={C$29< zK0ky!Pw&!vT7m6TK~k^oHM?%}ivi zNay)T=j7bt`fW{g-c>~B#>3f}NMo~jy%(MvpfQ|ij1AL(3kdT}nJ ziO#knI=gPwdri9{?1LXi8s`USY)>?H6ww&jervO#SM2d}x+tG}#qYYkK0s?{qIF{- ztsT;;>Wz!M2X8*F7b30u&MdCou0(5h5iQlO-P_dEZo7D$&x->z^d+(j?ma(KL}O&z zfyQLL+15MxdZo+nKc9@WcAZ_E&)!7qrb1fVc`M*_);iREFLCc)Hza=N_2>YteTml1 zMYML^qSqnMug`3xvF_aBe11037%QSNvNL}NbuXKPdfVi|sRP|-pO+)OhX&}~lIY#~ z2KA~vz5UW~4Sz5|Z-1i4L(IybON;Z%dU{VsdM6)TTu&az4OmdB#kF@swg~fTjC(-)3B3h$6kDY6DPGx$* zxSuAE@^ahg8TR!^_o)H8hotjf9e%DjTu66>%C(+ z-ygmf9*MNdzqmN3`x3265v^Uf>20+0pFuy2G(I*!Vyxo z-#NWJK*!xvoY(z{)&oVfMt2`=^1kEN@n-iI zibapFc}>?z&v`yOK)ar3&lJ%f*`{BYx-V3BqFif_L|U8w^5Q)8=d1*!_!KcMYrJcOAnoEzYf#Xtj%I z?LN*or?`Z9PA^3|^#MBiRWYxjeg(?^-lbm|3e<4h`}DT>+Egv8_8u2raOBpC_M

aJaozL?xIjaXFe__}j?QoPBfYP;>Hf(u&+Ag@ zIIpJ$XzI~nfu=rQSJoWa(feGnV0RBb6ls-zd2xRFn9H?v+s@ZZx3~gYyWd@JPE_j2 zs*U`7QQ&XZqc>{rRvOi;IuK91=M^Js zfqhc;OFC%u>EE-pRq|RX#XR<&Ync6&#lD)#eg8_&_Yw6g|1L5-Hc>lXnI7wO{5P_n z6_NMKs{?fYYEQ?{%zv$j&gh7K2hmqP=;^Aezsm7_1o3tEM5K9C38Z!S>xt%vi)fCF z^0)f=i%%G8ewFy0-?Ia>KGM_rRrUP+{BP)3xsIdVzn>pyXtSIudzg|dd)W27Z zwWizsbs84G^ZNDxt-sULdQ3g*^tg@{^BNtdcJHrsP7Tz2G}1hzizv2^)H$FG|S}#Oev%2Z66&E#pvkq$b4|K#i zeM#dLYdAW*zx$nX2l6kE)1O=yXl|E|^Ls`1Q{qJPAL>B!AL;nVI=pUA%U)4)WYp`{ zdn)PH@`*_6cHMZ>{Jt#iIKO{VNNd}XiTiIo$~VIK=EeQwa`8K_X9j5fR-*MxA*~zl z%o^3E{@X=|M-wN9-ougJRlgd-KNa6U)A7%BP{(I={0kkfVjXwQtDx~(r16L} z()#@?amMv~u879SX!pOH-FDRJuZIyhGUt$b{~s$HlGjS--_o2 z9dFignU1gP_=XPeg?}e|#l5gQ|CMaP8oeIrJSv?R#ly90o!^%I?{!$`o3dBb8A*Sy zp08h38m`~^Ut7FZFNuGBr1z~NdZVKU^mR%4?lOH35>mQ5P4%*5&0dZ)&r0(@h%?Ud zcQk%E()^D_G)MH`R=a;Y=>I#5+r{nNUX}fy5}n`G_}h`rcM9oj>;HoXFB~~N6=|K+ zLtwh+e^199v*!s*k=daH`q=jCx2sW#zEY|3+c!m3Dg}fLx!H|KmCq_>W4f zT^j_+V|_*bFX=ee+1(F7CCLA6(0XywIRA?J|E%M`==iTX{+o{fuH(Bp{y+z9NdEY} zsw4LMp2q(}$NvmtKmL4a?dq34y-Fkg8QIu}f1|W^)sVheO8uIW<~Z~8C-hP)PL#sf zi|Q}+KXD6V=bsS%;a*(Ae^%pF`gdB-s=o~U8XYh2;4IRYIk_r~y{i6VIP?uxPkf=Y Jw)FOo{a-dtMZEw3 literal 0 HcmV?d00001 diff --git a/public/nii2meshWorker.js b/public/nii2meshWorker.js new file mode 100644 index 0000000..5a4c504 --- /dev/null +++ b/public/nii2meshWorker.js @@ -0,0 +1,55 @@ +self.addEventListener('message', function(e) { + const file = e.data.blob + const percentage = e.data.percentage || 0.5 + const simplify_name = e.data.simplify_name + const isoValue = e.data.isoValue || NaN + onlyLargest = e.data.onlyLargest || false + fillBubbles = e.data.fillBubbles || false + postSmooth = e.data.postSmooth || 0 + verbose = e.data.berbose || true + prepare_and_simplify(file, percentage, simplify_name, isoValue, onlyLargest, fillBubbles, postSmooth, verbose) +}, false) + +var Module = { + 'print': function(text) { + console.log(text) + self.postMessage({"log":text}) + } +} + +self.importScripts("nii2mesh.js?rnd="+Math.random()) + +let last_file_name = undefined + +function prepare_and_simplify(file, percentage, simplify_name, isoValue = 1, onlyLargest = false, fillBubbles = false , postSmooth = 0, verbose = true) { + var filename = file.name + // if simplify on the same file, don't even read the file + if (filename === last_file_name) { + console.log("skipping load and create data file") + simplify(filename, percentage, simplify_name, isoValue, onlyLargest, fillBubbles, postSmooth, verbose) + return + } else { // remove last file in memory + if (last_file_name !== undefined) + Module.FS_unlink(last_file_name) + } + last_file_name = filename + var fr = new FileReader() + fr.readAsArrayBuffer(file) + fr. onloadend = function (e) { + var data = new Uint8Array(fr.result) + Module.FS_createDataFile(".", filename, data, true, true) + simplify(filename, percentage, simplify_name, isoValue, onlyLargest, fillBubbles, postSmooth, verbose) + } +} + +function simplify(filename, percentage, simplify_name, isoValue = 1, onlyLargest = false, fillBubbles = false , postSmooth = 0, verbose = true) { + Module.ccall("simplify", // c function name + undefined, // return + ["string", "number", "string", "number","boolean","boolean","number","boolean"], // param + [filename, percentage, simplify_name, isoValue, onlyLargest, fillBubbles,postSmooth, verbose] + ) + let out_bin = Module.FS_readFile(simplify_name) + // sla should work for binary mz3 + let file = new Blob([out_bin], {type: 'application/sla'}) + self.postMessage({"blob":file}) +}