diff --git a/bins/1.0.0.0/html5/index.apple-touch-icon.png b/bins/1.0.0.0/html5/index.apple-touch-icon.png new file mode 100644 index 0000000..7bf43af Binary files /dev/null and b/bins/1.0.0.0/html5/index.apple-touch-icon.png differ diff --git a/bins/1.0.0.0/html5/index.audio.worklet.js b/bins/1.0.0.0/html5/index.audio.worklet.js new file mode 100644 index 0000000..ea4d8cb --- /dev/null +++ b/bins/1.0.0.0/html5/index.audio.worklet.js @@ -0,0 +1,211 @@ +/*************************************************************************/ +/* audio.worklet.js */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +class RingBuffer { + constructor(p_buffer, p_state, p_threads) { + this.buffer = p_buffer; + this.avail = p_state; + this.threads = p_threads; + this.rpos = 0; + this.wpos = 0; + } + + data_left() { + return this.threads ? Atomics.load(this.avail, 0) : this.avail; + } + + space_left() { + return this.buffer.length - this.data_left(); + } + + read(output) { + const size = this.buffer.length; + let from = 0; + let to_write = output.length; + if (this.rpos + to_write > size) { + const high = size - this.rpos; + output.set(this.buffer.subarray(this.rpos, size)); + from = high; + to_write -= high; + this.rpos = 0; + } + if (to_write) { + output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from); + } + this.rpos += to_write; + if (this.threads) { + Atomics.add(this.avail, 0, -output.length); + Atomics.notify(this.avail, 0); + } else { + this.avail -= output.length; + } + } + + write(p_buffer) { + const to_write = p_buffer.length; + const mw = this.buffer.length - this.wpos; + if (mw >= to_write) { + this.buffer.set(p_buffer, this.wpos); + this.wpos += to_write; + if (mw === to_write) { + this.wpos = 0; + } + } else { + const high = p_buffer.subarray(0, mw); + const low = p_buffer.subarray(mw); + this.buffer.set(high, this.wpos); + this.buffer.set(low); + this.wpos = low.length; + } + if (this.threads) { + Atomics.add(this.avail, 0, to_write); + Atomics.notify(this.avail, 0); + } else { + this.avail += to_write; + } + } +} + +class GodotProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.threads = false; + this.running = true; + this.lock = null; + this.notifier = null; + this.output = null; + this.output_buffer = new Float32Array(); + this.input = null; + this.input_buffer = new Float32Array(); + this.port.onmessage = (event) => { + const cmd = event.data['cmd']; + const data = event.data['data']; + this.parse_message(cmd, data); + }; + } + + process_notify() { + if (this.notifier) { + Atomics.add(this.notifier, 0, 1); + Atomics.notify(this.notifier, 0); + } + } + + parse_message(p_cmd, p_data) { + if (p_cmd === 'start' && p_data) { + const state = p_data[0]; + let idx = 0; + this.threads = true; + this.lock = state.subarray(idx, ++idx); + this.notifier = state.subarray(idx, ++idx); + const avail_in = state.subarray(idx, ++idx); + const avail_out = state.subarray(idx, ++idx); + this.input = new RingBuffer(p_data[1], avail_in, true); + this.output = new RingBuffer(p_data[2], avail_out, true); + } else if (p_cmd === 'stop') { + this.running = false; + this.output = null; + this.input = null; + } else if (p_cmd === 'start_nothreads') { + this.output = new RingBuffer(p_data[0], p_data[0].length, false); + } else if (p_cmd === 'chunk') { + this.output.write(p_data); + } + } + + static array_has_data(arr) { + return arr.length && arr[0].length && arr[0][0].length; + } + + process(inputs, outputs, parameters) { + if (!this.running) { + return false; // Stop processing. + } + if (this.output === null) { + return true; // Not ready yet, keep processing. + } + const process_input = GodotProcessor.array_has_data(inputs); + if (process_input) { + const input = inputs[0]; + const chunk = input[0].length * input.length; + if (this.input_buffer.length !== chunk) { + this.input_buffer = new Float32Array(chunk); + } + if (!this.threads) { + GodotProcessor.write_input(this.input_buffer, input); + this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer }); + } else if (this.input.space_left() >= chunk) { + GodotProcessor.write_input(this.input_buffer, input); + this.input.write(this.input_buffer); + } else { + this.port.postMessage('Input buffer is full! Skipping input frame.'); + } + } + const process_output = GodotProcessor.array_has_data(outputs); + if (process_output) { + const output = outputs[0]; + const chunk = output[0].length * output.length; + if (this.output_buffer.length !== chunk) { + this.output_buffer = new Float32Array(chunk); + } + if (this.output.data_left() >= chunk) { + this.output.read(this.output_buffer); + GodotProcessor.write_output(output, this.output_buffer); + if (!this.threads) { + this.port.postMessage({ 'cmd': 'read', 'data': chunk }); + } + } else { + this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); + } + } + this.process_notify(); + return true; + } + + static write_output(dest, source) { + const channels = dest.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < dest[ch].length; sample++) { + dest[ch][sample] = source[sample * channels + ch]; + } + } + } + + static write_input(dest, source) { + const channels = source.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < source[ch].length; sample++) { + dest[sample * channels + ch] = source[ch][sample]; + } + } + } +} + +registerProcessor('godot-processor', GodotProcessor); diff --git a/bins/1.0.0.0/html5/index.html b/bins/1.0.0.0/html5/index.html new file mode 100644 index 0000000..01e7836 --- /dev/null +++ b/bins/1.0.0.0/html5/index.html @@ -0,0 +1,248 @@ + + + + + + The Lost Memory + + + + + + + + HTML5 canvas appears to be unsupported in the current browser.
+ Please try updating or use a different browser. +
+
+ + + +
+ + + + + + diff --git a/bins/1.0.0.0/html5/index.icon.png b/bins/1.0.0.0/html5/index.icon.png new file mode 100644 index 0000000..8ac2686 Binary files /dev/null and b/bins/1.0.0.0/html5/index.icon.png differ diff --git a/bins/1.0.0.0/html5/index.js b/bins/1.0.0.0/html5/index.js new file mode 100644 index 0000000..1c18e52 --- /dev/null +++ b/bins/1.0.0.0/html5/index.js @@ -0,0 +1,796 @@ + +var Godot = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + + return ( +function(Godot) { + Godot = Godot || {}; + +var Module=typeof Godot!="undefined"?Godot:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});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,setWindowTitle;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(_scriptDir){scriptDirectory=_scriptDir}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)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.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"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var getTempRet0=()=>tempRet0;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||false;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)}}function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(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=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function 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}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||33554432;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}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();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);FS.quit();TTY.shutdown();IDBFS.quit();runtimeExited=true}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);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="godot.javascript.opt.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["dk"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["rk"];addOnInit(Module["asm"]["ek"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return Number(HEAPF64[ptr>>3]);default:abort("invalid type for getValue: "+type)}return null}function getWasmTableEntry(funcPtr){return wasmTable.get(funcPtr)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function ___call_sighandler(fp,sig){getWasmTableEntry(fp)(sig)}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,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else return function(){abort("randomDevice")}}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){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function zeroMemory(address,size){HEAPU8.fill(0,address,address+size)}function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(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:function(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:function(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:function(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:function(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:function(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:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(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:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(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:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(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{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function(mount){return MEMFS.mount.apply(null,arguments)},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(this.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>{return PATH.join2(root,p)}}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={"timestamp":stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(this.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={"timestamp":cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{"timestamp":stat.mtime,"mode":stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{"timestamp":stat.mtime,"mode":stat.mode,"contents":node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>{callback(null,event.target.result)};req.onerror=e=>{callback(this.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=e=>{done(this.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};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(FS.cwd(),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.normalizeArray(path.split("/").filter(p=>!!p),false);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},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},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:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);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;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,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 random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);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.getStream(fd);if(!stream)throw new FS.ErrnoError(8);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.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,"IDBFS":IDBFS}},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;_fflush(0);for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.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||[])}else{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},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(Browser.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)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(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]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}else{data=new Uint8Array(data)}}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___syscall_accept4(fd,addr,addrlen,flags){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___syscall_bind(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}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 instanceof FS.ErrnoError))throw e;return-e.errno}}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}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.get();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 instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getsockname(fd,addr,addrlen){try{err("__syscall_getsockname "+fd);var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getsockopt(fd,level,optname,optval,optlen){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.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:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~4352;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.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 instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_symlink(target,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __dlinit(main_dso_handle){}var dlopenMissingError="To use dlopen, you need enable dynamic linking, see https://github.com/emscripten-core/emscripten/wiki/Linking";function __dlopen_js(filename,flag){abort(dlopenMissingError)}function __dlsym_js(handle,symbol){abort(dlopenMissingError)}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function __gmtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function __localtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function _tzset_impl(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}function _abort(){abort("")}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){runtimeKeepalivePush();Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();function _emscripten_webgl_do_commit_frame(){if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(GL.currentContext.defaultFbo){GL.blitOffscreenFramebuffer(GL.currentContext);return 0}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0}function _emscripten_webgl_commit_frame(){return _emscripten_webgl_do_commit_frame()}function runtimeKeepalivePush(){runtimeKeepaliveCounter+=1}function _exit(status){exit(status)}function maybeExit(){if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}function callUserCallback(func,synchronous){if(runtimeExited||ABORT){return}if(synchronous){func();return}try{func();maybeExit()}catch(e){handleException(e)}}function runtimeKeepalivePop(){runtimeKeepaliveCounter-=1}function safeSetTimeout(func,timeout){runtimeKeepalivePush();return setTimeout(function(){runtimeKeepalivePop();callUserCallback(func)},timeout)}var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",function(){finish(audio)},false);audio.onerror=function audio_onerror(event){if(done)return;out("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},handledByPreloadPlugin:function(byteArray,fullname,finish,onerror){Browser.init();var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:typeof WebGL2RenderingContext!="undefined"?2:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func){return safeSetTimeout(func)},safeRequestAnimationFrame:function(func){runtimeKeepalivePush();return Browser.requestAnimationFrame(function(){runtimeKeepalivePop();callUserCallback(func)})},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(webGLContextAttributes.renderViaOffscreenBackBuffer)webGLContextAttributes["preserveDrawingBuffer"]=true;if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},enableOffscreenFramebufferAttributes:function(webGLContextAttributes){webGLContextAttributes.renderViaOffscreenBackBuffer=true;webGLContextAttributes.preserveDrawingBuffer=true},createOffscreenFramebuffer:function(context){var gl=context.GLctx;var fbo=gl.createFramebuffer();gl.bindFramebuffer(36160,fbo);context.defaultFbo=fbo;context.defaultFboForbidBlitFramebuffer=false;if(gl.getContextAttributes().antialias){context.defaultFboForbidBlitFramebuffer=true}else{var firefoxMatch=navigator.userAgent.toLowerCase().match(/firefox\/(\d\d)/);if(firefoxMatch!=null){var firefoxVersion=firefoxMatch[1];context.defaultFboForbidBlitFramebuffer=firefoxVersion<67}}context.defaultColorTarget=gl.createTexture();context.defaultDepthTarget=gl.createRenderbuffer();GL.resizeOffscreenFramebuffer(context);gl.bindTexture(3553,context.defaultColorTarget);gl.texParameteri(3553,10241,9728);gl.texParameteri(3553,10240,9728);gl.texParameteri(3553,10242,33071);gl.texParameteri(3553,10243,33071);gl.texImage2D(3553,0,6408,gl.canvas.width,gl.canvas.height,0,6408,5121,null);gl.framebufferTexture2D(36160,36064,3553,context.defaultColorTarget,0);gl.bindTexture(3553,null);var depthTarget=gl.createRenderbuffer();gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.canvas.width,gl.canvas.height);gl.framebufferRenderbuffer(36160,36096,36161,context.defaultDepthTarget);gl.bindRenderbuffer(36161,null);var vertices=[-1,-1,-1,1,1,-1,1,1];var vb=gl.createBuffer();gl.bindBuffer(34962,vb);gl.bufferData(34962,new Float32Array(vertices),35044);gl.bindBuffer(34962,null);context.blitVB=vb;var vsCode="attribute vec2 pos;"+"varying lowp vec2 tex;"+"void main() { tex = pos * 0.5 + vec2(0.5,0.5); gl_Position = vec4(pos, 0.0, 1.0); }";var vs=gl.createShader(35633);gl.shaderSource(vs,vsCode);gl.compileShader(vs);var fsCode="varying lowp vec2 tex;"+"uniform sampler2D sampler;"+"void main() { gl_FragColor = texture2D(sampler, tex); }";var fs=gl.createShader(35632);gl.shaderSource(fs,fsCode);gl.compileShader(fs);var blitProgram=gl.createProgram();gl.attachShader(blitProgram,vs);gl.attachShader(blitProgram,fs);gl.linkProgram(blitProgram);context.blitProgram=blitProgram;context.blitPosLoc=gl.getAttribLocation(blitProgram,"pos");gl.useProgram(blitProgram);gl.uniform1i(gl.getUniformLocation(blitProgram,"sampler"),0);gl.useProgram(null);context.defaultVao=undefined;if(gl.createVertexArray){context.defaultVao=gl.createVertexArray();gl.bindVertexArray(context.defaultVao);gl.enableVertexAttribArray(context.blitPosLoc);gl.bindVertexArray(null)}},resizeOffscreenFramebuffer:function(context){var gl=context.GLctx;if(context.defaultColorTarget){var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);gl.texImage2D(3553,0,6408,gl.drawingBufferWidth,gl.drawingBufferHeight,0,6408,5121,null);gl.bindTexture(3553,prevTextureBinding)}if(context.defaultDepthTarget){var prevRenderBufferBinding=gl.getParameter(36007);gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.drawingBufferWidth,gl.drawingBufferHeight);gl.bindRenderbuffer(36161,prevRenderBufferBinding)}},blitOffscreenFramebuffer:function(context){var gl=context.GLctx;var prevScissorTest=gl.getParameter(3089);if(prevScissorTest)gl.disable(3089);var prevFbo=gl.getParameter(36006);if(gl.blitFramebuffer&&!context.defaultFboForbidBlitFramebuffer){gl.bindFramebuffer(36008,context.defaultFbo);gl.bindFramebuffer(36009,null);gl.blitFramebuffer(0,0,gl.canvas.width,gl.canvas.height,0,0,gl.canvas.width,gl.canvas.height,16384,9728)}else{gl.bindFramebuffer(36160,null);var prevProgram=gl.getParameter(35725);gl.useProgram(context.blitProgram);var prevVB=gl.getParameter(34964);gl.bindBuffer(34962,context.blitVB);var prevActiveTexture=gl.getParameter(34016);gl.activeTexture(33984);var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);var prevBlend=gl.getParameter(3042);if(prevBlend)gl.disable(3042);var prevCullFace=gl.getParameter(2884);if(prevCullFace)gl.disable(2884);var prevDepthTest=gl.getParameter(2929);if(prevDepthTest)gl.disable(2929);var prevStencilTest=gl.getParameter(2960);if(prevStencilTest)gl.disable(2960);function draw(){gl.vertexAttribPointer(context.blitPosLoc,2,5126,false,0,0);gl.drawArrays(5,0,4)}if(context.defaultVao){var prevVAO=gl.getParameter(34229);gl.bindVertexArray(context.defaultVao);draw();gl.bindVertexArray(prevVAO)}else{var prevVertexAttribPointer={buffer:gl.getVertexAttrib(context.blitPosLoc,34975),size:gl.getVertexAttrib(context.blitPosLoc,34339),stride:gl.getVertexAttrib(context.blitPosLoc,34340),type:gl.getVertexAttrib(context.blitPosLoc,34341),normalized:gl.getVertexAttrib(context.blitPosLoc,34922),pointer:gl.getVertexAttribOffset(context.blitPosLoc,34373)};var maxVertexAttribs=gl.getParameter(34921);var prevVertexAttribEnables=[];for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _emscripten_glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])}function _emscripten_glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _emscripten_glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _emscripten_glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _emscripten_glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _emscripten_glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _emscripten_glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _emscripten_glBindTransformFeedback(target,id){GLctx["bindTransformFeedback"](target,GL.transformFeedbacks[id])}function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBindVertexArrayOES(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _emscripten_glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _emscripten_glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _emscripten_glClear(x0){GLctx["clear"](x0)}function _emscripten_glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _emscripten_glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _emscripten_glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,HEAP32,value>>2)}function _emscripten_glClearBufferuiv(buffer,drawbuffer,value){GLctx["clearBufferuiv"](buffer,drawbuffer,HEAPU32,value>>2)}function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _emscripten_glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}}function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _emscripten_glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage3D(x0,x1,x2,x3,x4,x5,x6,x7,x8){GLctx["copyTexSubImage3D"](x0,x1,x2,x3,x4,x5,x6,x7,x8)}function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _emscripten_glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteTransformFeedbacks(n,ids){for(var i=0;i>2];var transformFeedback=GL.transformFeedbacks[id];if(!transformFeedback)continue;GLctx["deleteTransformFeedback"](transformFeedback);transformFeedback.name=0;GL.transformFeedbacks[id]=null}}function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedARB(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedEXT(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedNV(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var tempFixedLengthArray=[];function _emscripten_glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawBuffersEXT(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawBuffersWEBGL(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedARB(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedEXT(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedNV(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawRangeElements(mode,start,end,count,type,indices){_glDrawElements(mode,count,type,indices)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glEndQuery(x0){GLctx["endQuery"](x0)}function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}function _emscripten_glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _emscripten_glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _emscripten_glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _emscripten_glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _emscripten_glGenTransformFeedbacks(n,ids){__glGenObject(n,ids,"createTransformFeedback",GL.transformFeedbacks)}function _emscripten_glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniformBlockName(program,uniformBlockIndex,bufSize,length,uniformBlockName){program=GL.programs[program];var result=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);if(!result)return;if(uniformBlockName&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(result,uniformBlockName,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}}function _emscripten_glGetActiveUniformBlockiv(program,uniformBlockIndex,pname,params){if(!params){GL.recordError(1281);return}program=GL.programs[program];if(pname==35393){var name=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);HEAP32[params>>2]=name.length+1;return}var result=GLctx["getActiveUniformBlockParameter"](program,uniformBlockIndex,pname);if(result===null)return;if(pname==35395){for(var i=0;i>2]=result[i]}}else{HEAP32[params>>2]=result}}function _emscripten_glGetActiveUniformsiv(program,uniformCount,uniformIndices,pname,params){if(!params){GL.recordError(1281);return}if(uniformCount>0&&uniformIndices==0){GL.recordError(1281);return}program=GL.programs[program];var ids=[];for(var i=0;i>2])}var result=GLctx["getActiveUniforms"](program,ids,pname);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _emscripten_glGetBufferParameteri64v(target,value,data){if(!data){GL.recordError(1281);return}writeI53ToI64(data,GLctx.getBufferParameter(target,value))}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _emscripten_glGetFragDataLocation(program,name){return GLctx["getFragDataLocation"](GL.programs[program],UTF8ToString(name))}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function emscriptenWebGLGetIndexed(target,index,data,type){if(!data){GL.recordError(1281);return}var result=GLctx["getIndexedParameter"](target,index);var ret;switch(typeof result){case"boolean":ret=result?1:0;break;case"number":ret=result;break;case"object":if(result===null){switch(target){case 35983:case 35368:ret=0;break;default:{GL.recordError(1280);return}}}else if(result instanceof WebGLBuffer){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}switch(type){case 1:writeI53ToI64(data,ret);break;case 0:HEAP32[data>>2]=ret;break;case 2:HEAPF32[data>>2]=ret;break;case 4:HEAP8[data>>0]=ret?1:0;break;default:throw"internal emscriptenWebGLGetIndexed() error, bad type: "+type}}function _emscripten_glGetInteger64i_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,1)}function _emscripten_glGetInteger64v(name_,p){emscriptenWebGLGet(name_,p,1)}function _emscripten_glGetIntegeri_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,0)}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _emscripten_glGetInternalformativ(target,internalformat,pname,bufSize,params){if(bufSize<0){GL.recordError(1281);return}if(!params){GL.recordError(1281);return}var ret=GLctx["getInternalformatParameter"](target,internalformat,pname);if(ret===null)return;for(var i=0;i>2]=ret[i]}}function _emscripten_glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryiv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getQuery"](target,pname)}function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _emscripten_glGetSamplerParameterfv(sampler,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetSamplerParameteriv(sampler,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _emscripten_glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _emscripten_glGetSynciv(sync,pname,bufSize,length,values){if(bufSize<0){GL.recordError(1281);return}if(!values){GL.recordError(1281);return}var ret=GLctx.getSyncParameter(GL.syncs[sync],pname);if(ret!==null){HEAP32[values>>2]=ret;if(length)HEAP32[length>>2]=1}}function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTransformFeedbackVarying(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx["getTransformFeedbackVarying"](program,index);if(!info)return;if(name&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _emscripten_glGetUniformIndices(program,uniformCount,uniformNames,uniformIndices){if(!uniformIndices){GL.recordError(1281);return}if(uniformCount>0&&(uniformNames==0||uniformIndices==0)){GL.recordError(1281);return}program=GL.programs[program];var names=[];for(var i=0;i>2]));var result=GLctx["getUniformIndices"](program,names);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function emscriptenWebGLGetUniform(program,location,params,type){if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}}function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function _emscripten_glGetUniformuiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}}function _emscripten_glGetVertexAttribIiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribIuiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}function _emscripten_glInvalidateFramebuffer(target,numAttachments,attachments){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateFramebuffer"](target,list)}function _emscripten_glInvalidateSubFramebuffer(target,numAttachments,attachments,x,y,width,height){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateSubFramebuffer"](target,list,x,y,width,height)}function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}function _emscripten_glIsQuery(id){var query=GL.queries[id];if(!query)return 0;return GLctx["isQuery"](query)}function _emscripten_glIsQueryEXT(id){var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}function _emscripten_glIsSampler(id){var sampler=GL.samplers[id];if(!sampler)return 0;return GLctx["isSampler"](sampler)}function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}function _emscripten_glIsSync(sync){return GLctx.isSync(GL.syncs[sync])}function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}function _emscripten_glIsTransformFeedback(id){return GLctx["isTransformFeedback"](GL.transformFeedbacks[id])}function _emscripten_glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}function _emscripten_glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _emscripten_glPauseTransformFeedback(){GLctx["pauseTransformFeedback"]()}function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _emscripten_glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _emscripten_glProgramParameteri(program,pname,value){GL.recordError(1280)}function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)}function _emscripten_glReadBuffer(x0){GLctx["readBuffer"](x0)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _emscripten_glReleaseShaderCompiler(){}function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _emscripten_glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _emscripten_glResumeTransformFeedback(){GLctx["resumeTransformFeedback"]()}function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}function _emscripten_glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameterfv(sampler,pname,params){var param=HEAPF32[params>>2];GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteriv(sampler,pname,params){var param=HEAP32[params>>2];GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _emscripten_glShaderBinary(){GL.recordError(1280)}function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _emscripten_glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _emscripten_glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _emscripten_glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}function _emscripten_glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _emscripten_glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _emscripten_glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _emscripten_glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}var miniTempWebGLFloatBuffers=[];function _emscripten_glUniform1fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}var __miniTempWebGLIntBuffers=[];function _emscripten_glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _emscripten_glUniform1uiv(location,count,value){count&&GLctx.uniform1uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count)}function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2ui(location,v0,v1){GLctx.uniform2ui(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2uiv(location,count,value){count&&GLctx.uniform2uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*2)}function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3);return}if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3ui(location,v0,v1,v2){GLctx.uniform3ui(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3uiv(location,count,value){count&&GLctx.uniform3uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*3)}function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4);return}if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4ui(location,v0,v1,v2,v3){GLctx.uniform4ui(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4uiv(location,count,value){count&&GLctx.uniform4uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*4)}function _emscripten_glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix2x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*6)}function _emscripten_glUniformMatrix2x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*8)}function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix3x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*6)}function _emscripten_glUniformMatrix3x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*12)}function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix4x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*8)}function _emscripten_glUniformMatrix4x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*12)}function _emscripten_glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _emscripten_glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorARB(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorEXT(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorNV(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribI4i(x0,x1,x2,x3,x4){GLctx["vertexAttribI4i"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4iv(index,v){GLctx.vertexAttribI4i(index,HEAP32[v>>2],HEAP32[v+4>>2],HEAP32[v+8>>2],HEAP32[v+12>>2])}function _emscripten_glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4uiv(index,v){GLctx.vertexAttribI4ui(index,HEAPU32[v>>2],HEAPU32[v+4>>2],HEAPU32[v+8>>2],HEAPU32[v+12>>2])}function _emscripten_glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _emscripten_glWaitSync(sync,flags,timeoutLo,timeoutHi){GLctx.waitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let 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=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl&&!contextAttributes.renderViaOffscreenBackBuffer){contextAttributes.renderViaOffscreenBackBuffer=true}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}function _emscripten_webgl_destroy_context(contextHandle){if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}function _emscripten_webgl_init_context_attributes(attributes){var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1}function _emscripten_webgl_make_context_current(contextHandle){var success=GL.makeContextCurrent(contextHandle);return success?0:-5}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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 instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);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.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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}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 instanceof FS.ErrnoError))throw e;return e.errno}}function _getTempRet0(){return getTempRet0()}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _glBlendEquation(x0){GLctx["blendEquation"](x0)}function _glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _glClear(x0){GLctx["clear"](x0)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx["clearDepth"](x0)}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _glFinish(){GLctx["finish"]()}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _glGetUniformLocation(program,name){name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]}GLctx["invalidateFramebuffer"](target,list)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _glProgramParameteri(program,pname,value){GL.recordError(1280)}function _glReadBuffer(x0){GLctx["readBuffer"](x0)}function _glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}function _glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}var GodotRuntime={get_func:function(ptr){return wasmTable.get(ptr)},error:function(){err.apply(null,Array.from(arguments))},print:function(){out.apply(null,Array.from(arguments))},malloc:function(p_size){return _malloc(p_size)},free:function(p_ptr){_free(p_ptr)},getHeapValue:function(p_ptr,p_type){return getValue(p_ptr,p_type)},setHeapValue:function(p_ptr,p_value,p_type){setValue(p_ptr,p_value,p_type)},heapSub:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.subarray(p_ptr/bytes,p_ptr/bytes+p_len)},heapSlice:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.slice(p_ptr/bytes,p_ptr/bytes+p_len)},heapCopy:function(p_dst,p_src,p_ptr){const bytes=p_src.BYTES_PER_ELEMENT;return p_dst.set(p_src,p_ptr/bytes)},parseString:function(p_ptr){return UTF8ToString(p_ptr)},parseStringArray:function(p_ptr,p_size){const strings=[];const ptrs=GodotRuntime.heapSub(HEAP32,p_ptr,p_size);ptrs.forEach(function(ptr){strings.push(GodotRuntime.parseString(ptr))});return strings},strlen:function(p_str){return lengthBytesUTF8(p_str)},allocString:function(p_str){const length=GodotRuntime.strlen(p_str)+1;const c_str=GodotRuntime.malloc(length);stringToUTF8(p_str,c_str,length);return c_str},allocStringArray:function(p_strings){const size=p_strings.length;const c_ptr=GodotRuntime.malloc(size*4);for(let i=0;i>2)+i]=GodotRuntime.allocString(p_strings[i])}return c_ptr},freeStringArray:function(p_ptr,p_len){for(let i=0;i>2)+i])}GodotRuntime.free(p_ptr)},stringToHeap:function(p_str,p_ptr,p_len){return stringToUTF8Array(p_str,HEAP8,p_ptr,p_len)}};var GodotConfig={canvas:null,locale:"en",canvas_resize_policy:2,virtual_keyboard:false,persistent_drops:false,on_execute:null,on_exit:null,init_config:function(p_opts){GodotConfig.canvas_resize_policy=p_opts["canvasResizePolicy"];GodotConfig.canvas=p_opts["canvas"];GodotConfig.locale=p_opts["locale"]||GodotConfig.locale;GodotConfig.virtual_keyboard=p_opts["virtualKeyboard"];GodotConfig.persistent_drops=!!p_opts["persistentDrops"];GodotConfig.on_execute=p_opts["onExecute"];GodotConfig.on_exit=p_opts["onExit"];if(p_opts["focusCanvas"]){GodotConfig.canvas.focus()}},locate_file:function(file){return Module["locateFile"](file)},clear:function(){GodotConfig.canvas=null;GodotConfig.locale="en";GodotConfig.canvas_resize_policy=2;GodotConfig.virtual_keyboard=false;GodotConfig.persistent_drops=false;GodotConfig.on_execute=null;GodotConfig.on_exit=null}};var ERRNO_CODES={};var GodotFS={_idbfs:false,_syncing:false,_mount_points:[],is_persistent:function(){return GodotFS._idbfs?1:0},init:function(persistentPaths){GodotFS._idbfs=false;if(!Array.isArray(persistentPaths)){return Promise.reject(new Error("Persistent paths must be an array"))}if(!persistentPaths.length){return Promise.resolve()}GodotFS._mount_points=persistentPaths.slice();function createRecursive(dir){try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}}GodotFS._mount_points.forEach(function(path){createRecursive(path);FS.mount(IDBFS,{},path)});return new Promise(function(resolve,reject){FS.syncfs(true,function(err){if(err){GodotFS._mount_points=[];GodotFS._idbfs=false;GodotRuntime.print(`IndexedDB not available: ${err.message}`)}else{GodotFS._idbfs=true}resolve(err)})})},deinit:function(){GodotFS._mount_points.forEach(function(path){try{FS.unmount(path)}catch(e){GodotRuntime.print("Already unmounted",e)}if(GodotFS._idbfs&&IDBFS.dbs[path]){IDBFS.dbs[path].close();delete IDBFS.dbs[path]}});GodotFS._mount_points=[];GodotFS._idbfs=false;GodotFS._syncing=false},sync:function(){if(GodotFS._syncing){GodotRuntime.error("Already syncing!");return Promise.resolve()}GodotFS._syncing=true;return new Promise(function(resolve,reject){FS.syncfs(false,function(error){if(error){GodotRuntime.error(`Failed to save IDB file system: ${error.message}`)}GodotFS._syncing=false;resolve(error)})})},copy_to_fs:function(path,buffer){const idx=path.lastIndexOf("/");let dir="/";if(idx>0){dir=path.slice(0,idx)}try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}FS.writeFile(path,new Uint8Array(buffer))}};var GodotOS={request_quit:function(){},_async_cbs:[],_fs_sync_promise:null,atexit:function(p_promise_cb){GodotOS._async_cbs.push(p_promise_cb)},cleanup:function(exit_code){const cb=GodotConfig.on_exit;GodotFS.deinit();GodotConfig.clear();if(cb){cb(exit_code)}},finish_async:function(callback){GodotOS._fs_sync_promise.then(function(err){const promises=[];GodotOS._async_cbs.forEach(function(cb){promises.push(new Promise(cb))});return Promise.all(promises)}).then(function(){return GodotFS.sync()}).then(function(err){setTimeout(function(){callback()},0)})}};var GodotAudio={ctx:null,input:null,driver:null,interval:0,init:function(mix_rate,latency,onstatechange,onlatencyupdate){const opts={};if(mix_rate){opts["sampleRate"]=mix_rate}const ctx=new(window.AudioContext||window.webkitAudioContext)(opts);GodotAudio.ctx=ctx;ctx.onstatechange=function(){let state=0;switch(ctx.state){case"suspended":state=0;break;case"running":state=1;break;case"closed":state=2;break}onstatechange(state)};ctx.onstatechange();GodotAudio.interval=setInterval(function(){let computed_latency=0;if(ctx.baseLatency){computed_latency+=GodotAudio.ctx.baseLatency}if(ctx.outputLatency){computed_latency+=GodotAudio.ctx.outputLatency}onlatencyupdate(computed_latency)},1e3);GodotOS.atexit(GodotAudio.close_async);return ctx.destination.channelCount},create_input:function(callback){if(GodotAudio.input){return 0}function gotMediaInput(stream){try{GodotAudio.input=GodotAudio.ctx.createMediaStreamSource(stream);callback(GodotAudio.input)}catch(e){GodotRuntime.error("Failed creaating input.",e)}}if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){navigator.mediaDevices.getUserMedia({"audio":true}).then(gotMediaInput,function(e){GodotRuntime.error("Error getting user media.",e)})}else{if(!navigator.getUserMedia){navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia}if(!navigator.getUserMedia){GodotRuntime.error("getUserMedia not available.");return 1}navigator.getUserMedia({"audio":true},gotMediaInput,function(e){GodotRuntime.print(e)})}return 0},close_async:function(resolve,reject){const ctx=GodotAudio.ctx;GodotAudio.ctx=null;if(!ctx){resolve();return}if(GodotAudio.interval){clearInterval(GodotAudio.interval);GodotAudio.interval=0}if(GodotAudio.input){GodotAudio.input.disconnect();GodotAudio.input=null}let closed=Promise.resolve();if(GodotAudio.driver){closed=GodotAudio.driver.close()}closed.then(function(){return ctx.close()}).then(function(){ctx.onstatechange=null;resolve()}).catch(function(e){ctx.onstatechange=null;GodotRuntime.error("Error closing AudioContext",e);resolve()})}};function _godot_audio_capture_start(){return GodotAudio.create_input(function(input){input.connect(GodotAudio.driver.get_node())})}function _godot_audio_capture_stop(){if(GodotAudio.input){const tracks=GodotAudio.input["mediaStream"]["getTracks"]();for(let i=0;i=size){const high=size-wpos;wbuf.set(buffer.subarray(wpos,size));pending_samples-=high;wpos=0}if(pending_samples>0){wbuf.set(buffer.subarray(wpos,wpos+pending_samples),tot_sent-pending_samples)}port.postMessage({"cmd":"chunk","data":wbuf.subarray(0,tot_sent)});wpos+=pending_samples;pending_samples=0}this.receive=function(recv_buf){const buffer=GodotRuntime.heapSub(HEAPF32,p_in_buf,p_in_size);const from=rpos;let to_write=recv_buf.length;let high=0;if(rpos+to_write>=p_in_size){high=p_in_size-rpos;buffer.set(recv_buf.subarray(0,high),rpos);to_write-=high;rpos=0}if(to_write){buffer.set(recv_buf.subarray(high,to_write),rpos)}in_callback(from,recv_buf.length);rpos+=to_write};this.consumed=function(size,port){pending_samples+=size;send(port)}}GodotAudioWorklet.ring_buffer=new RingBuffer;GodotAudioWorklet.promise.then(function(){const node=GodotAudioWorklet.worklet;const buffer=GodotRuntime.heapSlice(HEAPF32,p_out_buf,p_out_size);node.connect(GodotAudio.ctx.destination);node.port.postMessage({"cmd":"start_nothreads","data":[buffer,p_in_size]});node.port.onmessage=function(event){if(!GodotAudioWorklet.worklet){return}if(event.data["cmd"]==="read"){const read=event.data["data"];GodotAudioWorklet.ring_buffer.consumed(read,GodotAudioWorklet.worklet.port)}else if(event.data["cmd"]==="input"){const buf=event.data["data"];if(buf.length>p_in_size){GodotRuntime.error("Input chunk is too big");return}GodotAudioWorklet.ring_buffer.receive(buf)}else{GodotRuntime.error(event.data)}}})},get_node:function(){return GodotAudioWorklet.worklet},close:function(){return new Promise(function(resolve,reject){if(GodotAudioWorklet.promise===null){return}GodotAudioWorklet.promise.then(function(){GodotAudioWorklet.worklet.port.postMessage({"cmd":"stop","data":null});GodotAudioWorklet.worklet.disconnect();GodotAudioWorklet.worklet=null;GodotAudioWorklet.promise=null;resolve()}).catch(function(err){})})}};function _godot_audio_worklet_create(channels){try{GodotAudioWorklet.create(channels)}catch(e){GodotRuntime.error("Error starting AudioDriverWorklet",e);return 1}return 0}function _godot_audio_worklet_start_no_threads(p_out_buf,p_out_size,p_out_callback,p_in_buf,p_in_size,p_in_callback){const out_callback=GodotRuntime.get_func(p_out_callback);const in_callback=GodotRuntime.get_func(p_in_callback);GodotAudioWorklet.start_no_threads(p_out_buf,p_out_size,out_callback,p_in_buf,p_in_size,in_callback)}function _godot_js_config_canvas_id_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(`#${GodotConfig.canvas.id}`,p_ptr,p_ptr_max)}function _godot_js_config_locale_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(GodotConfig.locale,p_ptr,p_ptr_max)}var GodotDisplayCursor={shape:"auto",visible:true,cursors:{},set_style:function(style){GodotConfig.canvas.style.cursor=style},set_shape:function(shape){GodotDisplayCursor.shape=shape;let css=shape;if(shape in GodotDisplayCursor.cursors){const c=GodotDisplayCursor.cursors[shape];css=`url("${c.url}") ${c.x} ${c.y}, auto`}if(GodotDisplayCursor.visible){GodotDisplayCursor.set_style(css)}},clear:function(){GodotDisplayCursor.set_style("");GodotDisplayCursor.shape="auto";GodotDisplayCursor.visible=true;Object.keys(GodotDisplayCursor.cursors).forEach(function(key){URL.revokeObjectURL(GodotDisplayCursor.cursors[key]);delete GodotDisplayCursor.cursors[key]})},lockPointer:function(){const canvas=GodotConfig.canvas;if(canvas.requestPointerLock){canvas.requestPointerLock()}},releasePointer:function(){if(document.exitPointerLock){document.exitPointerLock()}},isPointerLocked:function(){return document.pointerLockElement===GodotConfig.canvas}};var GodotEventListeners={handlers:[],has:function(target,event,method,capture){return GodotEventListeners.handlers.findIndex(function(e){return e.target===target&&e.event===event&&e.method===method&&e.capture===capture})!==-1},add:function(target,event,method,capture){if(GodotEventListeners.has(target,event,method,capture)){return}function Handler(p_target,p_event,p_method,p_capture){this.target=p_target;this.event=p_event;this.method=p_method;this.capture=p_capture}GodotEventListeners.handlers.push(new Handler(target,event,method,capture));target.addEventListener(event,method,capture)},clear:function(){GodotEventListeners.handlers.forEach(function(h){h.target.removeEventListener(h.event,h.method,h.capture)});GodotEventListeners.handlers.length=0}};function _emscripten_webgl_do_get_current_context(){return GL.currentContext?GL.currentContext.handle:0}function _emscripten_webgl_get_current_context(){return _emscripten_webgl_do_get_current_context()}var GodotDisplayScreen={desired_size:[0,0],hidpi:true,getPixelRatio:function(){return GodotDisplayScreen.hidpi?window.devicePixelRatio||1:1},isFullscreen:function(){const elem=document.fullscreenElement||document.mozFullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(elem){return elem===GodotConfig.canvas}return document.fullscreen||document.mozFullScreen||document.webkitIsFullscreen},hasFullscreen:function(){return document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled},requestFullscreen:function(){if(!GodotDisplayScreen.hasFullscreen()){return 1}const canvas=GodotConfig.canvas;try{const promise=(canvas.requestFullscreen||canvas.msRequestFullscreen||canvas.mozRequestFullScreen||canvas.mozRequestFullscreen||canvas.webkitRequestFullscreen).call(canvas);if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},exitFullscreen:function(){if(!GodotDisplayScreen.isFullscreen()){return 0}try{const promise=document.exitFullscreen();if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},_updateGL:function(){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){GL.resizeOffscreenFramebuffer(gl)}},updateSize:function(){const isFullscreen=GodotDisplayScreen.isFullscreen();const wantsFullWindow=GodotConfig.canvas_resize_policy===2;const noResize=GodotConfig.canvas_resize_policy===0;const wwidth=GodotDisplayScreen.desired_size[0];const wheight=GodotDisplayScreen.desired_size[1];const canvas=GodotConfig.canvas;let width=wwidth;let height=wheight;if(noResize){if(canvas.width!==width||canvas.height!==height){GodotDisplayScreen.desired_size=[canvas.width,canvas.height];GodotDisplayScreen._updateGL();return 1}return 0}const scale=GodotDisplayScreen.getPixelRatio();if(isFullscreen||wantsFullWindow){width=window.innerWidth*scale;height=window.innerHeight*scale}const csw=`${width/scale}px`;const csh=`${height/scale}px`;if(canvas.style.width!==csw||canvas.style.height!==csh||canvas.width!==width||canvas.height!==height){canvas.width=width;canvas.height=height;canvas.style.width=csw;canvas.style.height=csh;GodotDisplayScreen._updateGL();return 1}return 0}};var GodotDisplayVK={textinput:null,textarea:null,available:function(){return GodotConfig.virtual_keyboard&&"ontouchstart"in window},init:function(input_cb){function create(what){const elem=document.createElement(what);elem.style.display="none";elem.style.position="absolute";elem.style.zIndex="-1";elem.style.background="transparent";elem.style.padding="0px";elem.style.margin="0px";elem.style.overflow="hidden";elem.style.width="0px";elem.style.height="0px";elem.style.border="0px";elem.style.outline="none";elem.readonly=true;elem.disabled=true;GodotEventListeners.add(elem,"input",function(evt){const c_str=GodotRuntime.allocString(elem.value);input_cb(c_str,elem.selectionEnd);GodotRuntime.free(c_str)},false);GodotEventListeners.add(elem,"blur",function(evt){elem.style.display="none";elem.readonly=true;elem.disabled=true},false);GodotConfig.canvas.insertAdjacentElement("beforebegin",elem);return elem}GodotDisplayVK.textinput=create("input");GodotDisplayVK.textarea=create("textarea");GodotDisplayVK.updateSize()},show:function(text,multiline,start,end){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}if(GodotDisplayVK.textinput.style.display!==""||GodotDisplayVK.textarea.style.display!==""){GodotDisplayVK.hide()}GodotDisplayVK.updateSize();const elem=multiline?GodotDisplayVK.textarea:GodotDisplayVK.textinput;elem.readonly=false;elem.disabled=false;elem.value=text;elem.style.display="block";elem.focus();elem.setSelectionRange(start,end)},hide:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}[GodotDisplayVK.textinput,GodotDisplayVK.textarea].forEach(function(elem){elem.blur();elem.style.display="none";elem.value=""})},updateSize:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}const rect=GodotConfig.canvas.getBoundingClientRect();function update(elem){elem.style.left=`${rect.left}px`;elem.style.top=`${rect.top}px`;elem.style.width=`${rect.width}px`;elem.style.height=`${rect.height}px`}update(GodotDisplayVK.textinput);update(GodotDisplayVK.textarea)},clear:function(){if(GodotDisplayVK.textinput){GodotDisplayVK.textinput.remove();GodotDisplayVK.textinput=null}if(GodotDisplayVK.textarea){GodotDisplayVK.textarea.remove();GodotDisplayVK.textarea=null}}};var GodotDisplay={window_icon:"",findDPI:function(){function testDPI(dpi){return window.matchMedia(`(max-resolution: ${dpi}dpi)`).matches}function bisect(low,high,func){const mid=parseInt((high-low)/2+low,10);if(high-low<=1){return func(high)?high:low}if(func(mid)){return bisect(low,mid,func)}return bisect(mid,high,func)}try{const dpi=bisect(0,800,testDPI);return dpi>=96?dpi:96}catch(e){return 96}}};function _godot_js_display_alert(p_text){window.alert(GodotRuntime.parseString(p_text))}function _godot_js_display_canvas_focus(){GodotConfig.canvas.focus()}function _godot_js_display_canvas_is_focused(){return document.activeElement===GodotConfig.canvas}function _godot_js_display_clipboard_get(callback){const func=GodotRuntime.get_func(callback);try{navigator.clipboard.readText().then(function(result){const ptr=GodotRuntime.allocString(result);func(ptr);GodotRuntime.free(ptr)}).catch(function(e){})}catch(e){}}function _godot_js_display_clipboard_set(p_text){const text=GodotRuntime.parseString(p_text);if(!navigator.clipboard||!navigator.clipboard.writeText){return 1}navigator.clipboard.writeText(text).catch(function(e){GodotRuntime.error("Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:",e)});return 0}function _godot_js_display_cursor_is_hidden(){return!GodotDisplayCursor.visible}function _godot_js_display_cursor_is_locked(){return GodotDisplayCursor.isPointerLocked()?1:0}function _godot_js_display_cursor_lock_set(p_lock){if(p_lock){GodotDisplayCursor.lockPointer()}else{GodotDisplayCursor.releasePointer()}}function _godot_js_display_cursor_set_custom_shape(p_shape,p_ptr,p_len,p_hotspot_x,p_hotspot_y){const shape=GodotRuntime.parseString(p_shape);const old_shape=GodotDisplayCursor.cursors[shape];if(p_len>0){const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});const url=URL.createObjectURL(png);GodotDisplayCursor.cursors[shape]={url:url,x:p_hotspot_x,y:p_hotspot_y}}else{delete GodotDisplayCursor.cursors[shape]}if(shape===GodotDisplayCursor.shape){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}if(old_shape){URL.revokeObjectURL(old_shape.url)}}function _godot_js_display_cursor_set_shape(p_string){GodotDisplayCursor.set_shape(GodotRuntime.parseString(p_string))}function _godot_js_display_cursor_set_visible(p_visible){const visible=p_visible!==0;if(visible===GodotDisplayCursor.visible){return}GodotDisplayCursor.visible=visible;if(visible){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}else{GodotDisplayCursor.set_style("none")}}function _godot_js_display_desired_size_set(width,height){GodotDisplayScreen.desired_size=[width,height];GodotDisplayScreen.updateSize()}function _godot_js_display_fullscreen_cb(callback){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);function change_cb(evt){if(evt.target===canvas){func(GodotDisplayScreen.isFullscreen())}}GodotEventListeners.add(document,"fullscreenchange",change_cb,false);GodotEventListeners.add(document,"mozfullscreenchange",change_cb,false);GodotEventListeners.add(document,"webkitfullscreenchange",change_cb,false)}function _godot_js_display_fullscreen_exit(){return GodotDisplayScreen.exitFullscreen()}function _godot_js_display_fullscreen_request(){return GodotDisplayScreen.requestFullscreen()}function _godot_js_display_glGetBufferSubData(target,offset,size,data){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){gl.GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}}function _godot_js_display_has_webgl(p_version){if(p_version!==1&&p_version!==2){return false}try{return!!document.createElement("canvas").getContext(p_version===2?"webgl2":"webgl")}catch(e){}return false}function _godot_js_display_is_swap_ok_cancel(){const win=["Windows","Win64","Win32","WinCE"];const plat=navigator.platform||"";if(win.indexOf(plat)!==-1){return 1}return 0}function _godot_js_display_notification_cb(callback,p_enter,p_exit,p_in,p_out){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);const notif=[p_enter,p_exit,p_in,p_out];["mouseover","mouseleave","focus","blur"].forEach(function(evt_name,idx){GodotEventListeners.add(canvas,evt_name,function(){func(notif[idx])},true)})}function _godot_js_display_pixel_ratio_get(){return GodotDisplayScreen.getPixelRatio()}function _godot_js_display_screen_dpi_get(){return GodotDisplay.findDPI()}function _godot_js_display_screen_size_get(width,height){const scale=GodotDisplayScreen.getPixelRatio();GodotRuntime.setHeapValue(width,window.screen.width*scale,"i32");GodotRuntime.setHeapValue(height,window.screen.height*scale,"i32")}function _godot_js_display_setup_canvas(p_width,p_height,p_fullscreen,p_hidpi){const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"contextmenu",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"webglcontextlost",function(ev){alert("WebGL context lost, please reload the page");ev.preventDefault()},false);GodotDisplayScreen.hidpi=!!p_hidpi;switch(GodotConfig.canvas_resize_policy){case 0:GodotDisplayScreen.desired_size=[canvas.width,canvas.height];break;case 1:GodotDisplayScreen.desired_size=[p_width,p_height];break;default:canvas.style.position="absolute";canvas.style.top=0;canvas.style.left=0;break}GodotDisplayScreen.updateSize();if(p_fullscreen){GodotDisplayScreen.requestFullscreen()}}function _godot_js_display_size_update(){const updated=GodotDisplayScreen.updateSize();if(updated){GodotDisplayVK.updateSize()}return updated}function _godot_js_display_touchscreen_is_available(){return"ontouchstart"in window}function _godot_js_display_vk_available(){return GodotDisplayVK.available()}function _godot_js_display_vk_cb(p_input_cb){const input_cb=GodotRuntime.get_func(p_input_cb);if(GodotDisplayVK.available()){GodotDisplayVK.init(input_cb)}}function _godot_js_display_vk_hide(){GodotDisplayVK.hide()}function _godot_js_display_vk_show(p_text,p_multiline,p_start,p_end){const text=GodotRuntime.parseString(p_text);const start=p_start>0?p_start:0;const end=p_end>0?p_end:start;GodotDisplayVK.show(text,p_multiline,start,end)}function _godot_js_display_window_blur_cb(callback){const func=GodotRuntime.get_func(callback);GodotEventListeners.add(window,"blur",function(){func()},false)}function _godot_js_display_window_icon_set(p_ptr,p_len){let link=document.getElementById("-gd-engine-icon");if(link===null){link=document.createElement("link");link.rel="icon";link.id="-gd-engine-icon";document.head.appendChild(link)}const old_icon=GodotDisplay.window_icon;const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});GodotDisplay.window_icon=URL.createObjectURL(png);link.href=GodotDisplay.window_icon;if(old_icon){URL.revokeObjectURL(old_icon)}}function _godot_js_display_window_size_get(p_width,p_height){GodotRuntime.setHeapValue(p_width,GodotConfig.canvas.width,"i32");GodotRuntime.setHeapValue(p_height,GodotConfig.canvas.height,"i32")}function _godot_js_display_window_title_set(p_data){document.title=GodotRuntime.parseString(p_data)}function _godot_js_eval(p_js,p_use_global_ctx,p_union_ptr,p_byte_arr,p_byte_arr_write,p_callback){const js_code=GodotRuntime.parseString(p_js);let eval_ret=null;try{if(p_use_global_ctx){const global_eval=eval;eval_ret=global_eval(js_code)}else{eval_ret=eval(js_code)}}catch(e){GodotRuntime.error(e)}switch(typeof eval_ret){case"boolean":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"i32");return 1;case"number":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"double");return 3;case"string":GodotRuntime.setHeapValue(p_union_ptr,GodotRuntime.allocString(eval_ret),"*");return 4;case"object":if(eval_ret===null){break}if(ArrayBuffer.isView(eval_ret)&&!(eval_ret instanceof Uint8Array)){eval_ret=new Uint8Array(eval_ret.buffer)}else if(eval_ret instanceof ArrayBuffer){eval_ret=new Uint8Array(eval_ret)}if(eval_ret instanceof Uint8Array){const func=GodotRuntime.get_func(p_callback);const bytes_ptr=func(p_byte_arr,p_byte_arr_write,eval_ret.length);HEAPU8.set(eval_ret,bytes_ptr);return 20}break}return 0}var IDHandler={_last_id:0,_references:{},get:function(p_id){return IDHandler._references[p_id]},add:function(p_data){const id=++IDHandler._last_id;IDHandler._references[id]=p_data;return id},remove:function(p_id){delete IDHandler._references[p_id]}};var GodotFetch={onread:function(id,result){const obj=IDHandler.get(id);if(!obj){return}if(result.value){obj.chunks.push(result.value)}obj.reading=false;obj.done=result.done},onresponse:function(id,response){const obj=IDHandler.get(id);if(!obj){return}let chunked=false;response.headers.forEach(function(value,header){const v=value.toLowerCase().trim();const h=header.toLowerCase().trim();if(h==="transfer-encoding"&&v==="chunked"){chunked=true}});obj.status=response.status;obj.response=response;obj.reader=response.body.getReader();obj.chunked=chunked},onerror:function(id,err){GodotRuntime.error(err);const obj=IDHandler.get(id);if(!obj){return}obj.error=err},create:function(method,url,headers,body){const obj={request:null,response:null,reader:null,error:null,done:false,reading:false,status:0,chunks:[],bodySize:-1};const id=IDHandler.add(obj);const init={method:method,headers:headers,body:body};obj.request=fetch(url,init);obj.request.then(GodotFetch.onresponse.bind(null,id)).catch(GodotFetch.onerror.bind(null,id));return id},free:function(id){const obj=IDHandler.get(id);if(!obj){return}IDHandler.remove(id);if(!obj.request){return}obj.request.then(function(response){response.abort()}).catch(function(e){})},read:function(id){const obj=IDHandler.get(id);if(!obj){return}if(obj.reader&&!obj.reading){if(obj.done){obj.reader=null;return}obj.reading=true;obj.reader.read().then(GodotFetch.onread.bind(null,id)).catch(GodotFetch.onerror.bind(null,id))}}};function _godot_js_fetch_body_length_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.bodySize}function _godot_js_fetch_create(p_method,p_url,p_headers,p_headers_size,p_body,p_body_size){const method=GodotRuntime.parseString(p_method);const url=GodotRuntime.parseString(p_url);const headers=GodotRuntime.parseStringArray(p_headers,p_headers_size);const body=p_body_size?GodotRuntime.heapSlice(HEAP8,p_body,p_body_size):null;return GodotFetch.create(method,url,headers.map(function(hv){const idx=hv.indexOf(":");if(idx<=0){return[]}return[hv.slice(0,idx).trim(),hv.slice(idx+1).trim()]}).filter(function(v){return v.length===2}),body)}function _godot_js_fetch_free(id){GodotFetch.free(id)}function _godot_js_fetch_http_status_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}return obj.status}function _godot_js_fetch_is_chunked(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.chunked?1:0}function _godot_js_fetch_read_chunk(p_id,p_buf,p_buf_size){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}let to_read=p_buf_size;const chunks=obj.chunks;while(to_read&&chunks.length){const chunk=obj.chunks[0];if(chunk.length>to_read){GodotRuntime.heapCopy(HEAP8,chunk.slice(0,to_read),p_buf);chunks[0]=chunk.slice(to_read);to_read=0}else{GodotRuntime.heapCopy(HEAP8,chunk,p_buf);to_read-=chunk.length;chunks.pop()}}if(!chunks.length){GodotFetch.read(p_id)}return p_buf_size-to_read}function _godot_js_fetch_read_headers(p_id,p_parse_cb,p_ref){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 1}const cb=GodotRuntime.get_func(p_parse_cb);const arr=[];obj.response.headers.forEach(function(v,h){arr.push(`${h}:${v}`)});const c_ptr=GodotRuntime.allocStringArray(arr);cb(arr.length,c_ptr,p_ref);GodotRuntime.freeStringArray(c_ptr,arr.length);return 0}function _godot_js_fetch_state_get(p_id){const obj=IDHandler.get(p_id);if(!obj){return-1}if(obj.error){return-1}if(!obj.response){return 0}if(obj.reader){return 1}if(obj.done){return 2}return-1}var GodotInputGamepads={samples:[],get_pads:function(){try{const pads=navigator.getGamepads();if(pads){return pads}return[]}catch(e){return[]}},get_samples:function(){return GodotInputGamepads.samples},get_sample:function(index){const samples=GodotInputGamepads.samples;return index=0){os="Android"}else if(ua.indexOf("Linux")>=0){os="Linux"}else if(ua.indexOf("iPhone")>=0){os="iOS"}else if(ua.indexOf("Macintosh")>=0){os="MacOSX"}else if(ua.indexOf("Windows")>=0){os="Windows"}const id=pad.id;const exp1=/vendor: ([0-9a-f]{4}) product: ([0-9a-f]{4})/i;const exp2=/^([0-9a-f]+)-([0-9a-f]+)-/i;let vendor="";let product="";if(exp1.test(id)){const match=exp1.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}else if(exp2.test(id)){const match=exp2.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}if(!vendor||!product){return`${os}Unknown`}return os+vendor+product}};var GodotInputDragDrop={promises:[],pending_files:[],add_entry:function(entry){if(entry.isDirectory){GodotInputDragDrop.add_dir(entry)}else if(entry.isFile){GodotInputDragDrop.add_file(entry)}else{GodotRuntime.error("Unrecognized entry...",entry)}},add_dir:function(entry){GodotInputDragDrop.promises.push(new Promise(function(resolve,reject){const reader=entry.createReader();reader.readEntries(function(entries){for(let i=0;i{const path=elem["path"];GodotFS.copy_to_fs(DROP+path,elem["data"]);let idx=path.indexOf("/");if(idx===-1){drops.push(DROP+path)}else{const sub=path.substr(0,idx);idx=sub.indexOf("/");if(idx<0&&drops.indexOf(DROP+sub)===-1){drops.push(DROP+sub)}}files.push(DROP+path)});GodotInputDragDrop.promises=[];GodotInputDragDrop.pending_files=[];callback(drops);if(GodotConfig.persistent_drops){GodotOS.atexit(function(resolve,reject){GodotInputDragDrop.remove_drop(files,DROP);resolve()})}else{GodotInputDragDrop.remove_drop(files,DROP)}})},remove_drop:function(files,drop_path){const dirs=[drop_path.substr(0,drop_path.length-1)];files.forEach(function(file){FS.unlink(file);let dir=file.replace(drop_path,"");let idx=dir.lastIndexOf("/");while(idx>0){dir=dir.substr(0,idx);if(dirs.indexOf(drop_path+dir)===-1){dirs.push(drop_path+dir)}idx=dir.lastIndexOf("/")}});dirs.sort(function(a,b){const al=(a.match(/\//g)||[]).length;const bl=(b.match(/\//g)||[]).length;if(al>bl){return-1}else if(al{if(GodotWebXR.session&&GodotWebXR.space){const onFrame=function(time,frame){GodotWebXR.frame=frame;GodotWebXR.pose=frame.getViewerPose(GodotWebXR.space);callback(time);GodotWebXR.frame=null;GodotWebXR.pose=null};GodotWebXR.session.requestAnimationFrame(onFrame)}else{GodotWebXR.orig_requestAnimationFrame(callback)}},monkeyPatchRequestAnimationFrame:enable=>{if(GodotWebXR.orig_requestAnimationFrame===null){GodotWebXR.orig_requestAnimationFrame=Browser.requestAnimationFrame}Browser.requestAnimationFrame=enable?GodotWebXR.requestAnimationFrame:GodotWebXR.orig_requestAnimationFrame},pauseResumeMainLoop:()=>{Browser.mainLoop.pause();window.setTimeout(function(){Browser.mainLoop.resume()},0)},shaderProgram:null,programInfo:null,buffer:null,vsSource:"\n\t\t\tconst vec2 scale = vec2(0.5, 0.5);\n\t\t\tattribute vec4 aVertexPosition;\n\n\t\t\tvarying highp vec2 vTextureCoord;\n\n\t\t\tvoid main () {\n\t\t\t\tgl_Position = aVertexPosition;\n\t\t\t\tvTextureCoord = aVertexPosition.xy * scale + scale;\n\t\t\t}\n\t\t",fsSource:"\n\t\t\tvarying highp vec2 vTextureCoord;\n\n\t\t\tuniform sampler2D uSampler;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D(uSampler, vTextureCoord);\n\t\t\t}\n\t\t",initShaderProgram:(gl,vsSource,fsSource)=>{const vertexShader=GodotWebXR.loadShader(gl,gl.VERTEX_SHADER,vsSource);const fragmentShader=GodotWebXR.loadShader(gl,gl.FRAGMENT_SHADER,fsSource);const shaderProgram=gl.createProgram();gl.attachShader(shaderProgram,vertexShader);gl.attachShader(shaderProgram,fragmentShader);gl.linkProgram(shaderProgram);if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)){GodotRuntime.error(`Unable to initialize the shader program: ${gl.getProgramInfoLog(shaderProgram)}`);return null}return shaderProgram},loadShader:(gl,type,source)=>{const shader=gl.createShader(type);gl.shaderSource(shader,source);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){GodotRuntime.error(`An error occurred compiling the shader: ${gl.getShaderInfoLog(shader)}`);gl.deleteShader(shader);return null}return shader},initBuffer:gl=>{const positionBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);const positions=[-1,-1,1,-1,-1,1,1,1];gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW);return positionBuffer},blitTexture:(gl,texture)=>{if(GodotWebXR.shaderProgram===null){GodotWebXR.shaderProgram=GodotWebXR.initShaderProgram(gl,GodotWebXR.vsSource,GodotWebXR.fsSource);GodotWebXR.programInfo={program:GodotWebXR.shaderProgram,attribLocations:{vertexPosition:gl.getAttribLocation(GodotWebXR.shaderProgram,"aVertexPosition")},uniformLocations:{uSampler:gl.getUniformLocation(GodotWebXR.shaderProgram,"uSampler")}};GodotWebXR.buffer=GodotWebXR.initBuffer(gl)}const orig_program=gl.getParameter(gl.CURRENT_PROGRAM);gl.useProgram(GodotWebXR.shaderProgram);gl.bindBuffer(gl.ARRAY_BUFFER,GodotWebXR.buffer);gl.vertexAttribPointer(GodotWebXR.programInfo.attribLocations.vertexPosition,2,gl.FLOAT,false,0,0);gl.enableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,texture);gl.uniform1i(GodotWebXR.programInfo.uniformLocations.uSampler,0);gl.drawArrays(gl.TRIANGLE_STRIP,0,4);gl.bindTexture(gl.TEXTURE_2D,null);gl.disableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition);gl.bindBuffer(gl.ARRAY_BUFFER,null);gl.useProgram(orig_program)},controllers:[],sampleControllers:()=>{if(!GodotWebXR.session){return}let other_index=2;const controllers=[];GodotWebXR.session.inputSources.forEach(input_source=>{if(input_source.targetRayMode==="tracked-pointer"){if(input_source.handedness==="right"){controllers[1]=input_source}else if(input_source.handedness==="left"||!controllers[0]){controllers[0]=input_source}}else{controllers[other_index++]=input_source}});GodotWebXR.controllers=controllers},getControllerId:input_source=>GodotWebXR.controllers.indexOf(input_source)};function _godot_webxr_commit_for_eye(p_eye,p_texture_id){if(!GodotWebXR.session||!GodotWebXR.pose){return}const view_index=p_eye===2?1:0;const glLayer=GodotWebXR.session.renderState.baseLayer;const view=GodotWebXR.pose.views[view_index];const viewport=glLayer.getViewport(view);const gl=GodotWebXR.gl;const orig_framebuffer=gl.getParameter(gl.FRAMEBUFFER_BINDING);const orig_viewport=gl.getParameter(gl.VIEWPORT);gl.bindFramebuffer(gl.FRAMEBUFFER,glLayer.framebuffer);gl.viewport(viewport.x,viewport.y,viewport.width,viewport.height);GodotWebXR.blitTexture(gl,GL.textures[p_texture_id]);gl.bindFramebuffer(gl.FRAMEBUFFER,orig_framebuffer);gl.viewport(orig_viewport[0],orig_viewport[1],orig_viewport[2],orig_viewport[3])}function _godot_webxr_get_bounds_geometry(){if(!GodotWebXR.space||!GodotWebXR.space.boundsGeometry){return 0}const point_count=GodotWebXR.space.boundsGeometry.length;if(point_count===0){return 0}const buf=GodotRuntime.malloc((point_count*3+1)*4);GodotRuntime.setHeapValue(buf,point_count,"i32");for(let i=0;i=GodotWebXR.controllers.length){return 0}const controller=GodotWebXR.controllers[p_controller];if(!controller){return 0}switch(controller.targetRayMode){case"gaze":return 1;case"tracked-pointer":return 2;case"screen":return 3;default:break}return 0}function _godot_webxr_get_controller_transform(p_controller){if(!GodotWebXR.session||!GodotWebXR.frame){return 0}const controller=GodotWebXR.controllers[p_controller];if(!controller){return 0}const frame=GodotWebXR.frame;const space=GodotWebXR.space;const pose=frame.getPose(controller.targetRaySpace,space);if(!pose){return 0}const matrix=pose.transform.matrix;const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_projection_for_eye(p_eye){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const view_index=p_eye===2?1:0;const matrix=GodotWebXR.pose.views[view_index].projectionMatrix;const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_render_targetsize(){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const glLayer=GodotWebXR.session.renderState.baseLayer;const view=GodotWebXR.pose.views[0];const viewport=glLayer.getViewport(view);const buf=GodotRuntime.malloc(2*4);GodotRuntime.setHeapValue(buf+0,viewport.width,"i32");GodotRuntime.setHeapValue(buf+4,viewport.height,"i32");return buf}function _godot_webxr_get_transform_for_eye(p_eye){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const views=GodotWebXR.pose.views;let matrix;if(p_eye===0){matrix=GodotWebXR.pose.transform.matrix}else{matrix=views[p_eye-1].transform.matrix}const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_view_count(){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}return GodotWebXR.pose.views.length}function _godot_webxr_get_visibility_state(){if(!GodotWebXR.session||!GodotWebXR.session.visibilityState){return 0}return GodotRuntime.allocString(GodotWebXR.session.visibilityState)}function _godot_webxr_initialize(p_session_mode,p_required_features,p_optional_features,p_requested_reference_spaces,p_on_session_started,p_on_session_ended,p_on_session_failed,p_on_controller_changed,p_on_input_event,p_on_simple_event){GodotWebXR.monkeyPatchRequestAnimationFrame(true);const session_mode=GodotRuntime.parseString(p_session_mode);const required_features=GodotRuntime.parseString(p_required_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const optional_features=GodotRuntime.parseString(p_optional_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const requested_reference_space_types=GodotRuntime.parseString(p_requested_reference_spaces).split(",").map(s=>s.trim());const onstarted=GodotRuntime.get_func(p_on_session_started);const onended=GodotRuntime.get_func(p_on_session_ended);const onfailed=GodotRuntime.get_func(p_on_session_failed);const oncontroller=GodotRuntime.get_func(p_on_controller_changed);const oninputevent=GodotRuntime.get_func(p_on_input_event);const onsimpleevent=GodotRuntime.get_func(p_on_simple_event);const session_init={};if(required_features.length>0){session_init["requiredFeatures"]=required_features}if(optional_features.length>0){session_init["optionalFeatures"]=optional_features}navigator.xr.requestSession(session_mode,session_init).then(function(session){GodotWebXR.session=session;session.addEventListener("end",function(evt){onended()});session.addEventListener("inputsourceschange",function(evt){let controller_changed=false;[evt.added,evt.removed].forEach(lst=>{lst.forEach(input_source=>{if(input_source.targetRayMode==="tracked-pointer"){controller_changed=true}})});if(controller_changed){oncontroller()}});["selectstart","selectend","select","squeezestart","squeezeend","squeeze"].forEach((input_event,index)=>{session.addEventListener(input_event,function(evt){GodotWebXR.sampleControllers();oninputevent(index,GodotWebXR.getControllerId(evt.inputSource))})});session.addEventListener("visibilitychange",function(evt){const c_str=GodotRuntime.allocString("visibility_state_changed");onsimpleevent(c_str);GodotRuntime.free(c_str)});const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle).GLctx;GodotWebXR.gl=gl;gl.makeXRCompatible().then(function(){session.updateRenderState({baseLayer:new XRWebGLLayer(session,gl)});function onReferenceSpaceSuccess(reference_space,reference_space_type){GodotWebXR.space=reference_space;reference_space.onreset=function(evt){const c_str=GodotRuntime.allocString("reference_space_reset");onsimpleevent(c_str);GodotRuntime.free(c_str)};GodotWebXR.pauseResumeMainLoop();window.setTimeout(function(){const c_str=GodotRuntime.allocString(reference_space_type);onstarted(c_str);GodotRuntime.free(c_str)},0)}function requestReferenceSpace(){const reference_space_type=requested_reference_space_types.shift();session.requestReferenceSpace(reference_space_type).then(refSpace=>{onReferenceSpaceSuccess(refSpace,reference_space_type)}).catch(()=>{if(requested_reference_space_types.length===0){const c_str=GodotRuntime.allocString("Unable to get any of the requested reference space types");onfailed(c_str);GodotRuntime.free(c_str)}else{requestReferenceSpace()}})}requestReferenceSpace()}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to make WebGL context compatible with WebXR: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to start session: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}function _godot_webxr_is_controller_connected(p_controller){if(!GodotWebXR.session||!GodotWebXR.frame){return false}return!!GodotWebXR.controllers[p_controller]}function _godot_webxr_is_session_supported(p_session_mode,p_callback){const session_mode=GodotRuntime.parseString(p_session_mode);const cb=GodotRuntime.get_func(p_callback);if(navigator.xr){navigator.xr.isSessionSupported(session_mode).then(function(supported){const c_str=GodotRuntime.allocString(session_mode);cb(c_str,supported?1:0);GodotRuntime.free(c_str)})}else{const c_str=GodotRuntime.allocString(session_mode);cb(c_str,0);GodotRuntime.free(c_str)}}function _godot_webxr_is_supported(){return!!navigator.xr}function _godot_webxr_sample_controller_data(){GodotWebXR.sampleControllers()}function _godot_webxr_uninitialize(){if(GodotWebXR.session){GodotWebXR.session.end().catch(e=>{})}GodotWebXR.session=null;GodotWebXR.space=null;GodotWebXR.frame=null;GodotWebXR.pose=null;GodotWebXR.monkeyPatchRequestAnimationFrame(false);GodotWebXR.pauseResumeMainLoop()}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}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.staticInit();Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}Module["request_quit"]=function(){GodotOS.request_quit()};Module["onExit"]=GodotOS.cleanup;GodotOS._fs_sync_promise=Promise.resolve();Module["initConfig"]=GodotConfig.init_config;Module["initFS"]=GodotFS.init;Module["copyToFS"]=GodotFS.copy_to_fs;ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};GodotOS.atexit(function(resolve,reject){GodotDisplayCursor.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotEventListeners.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotDisplayVK.clear();resolve()});GodotJSWrapper.proxies=new Map;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?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 asmLibraryArg={"Xc":___call_sighandler,"Rc":___syscall__newselect,"Mc":___syscall_accept4,"Lc":___syscall_bind,"rd":___syscall_chdir,"qd":___syscall_chmod,"Kc":___syscall_connect,"sd":___syscall_faccessat,"Fa":___syscall_fcntl64,"fd":___syscall_getcwd,"Wc":___syscall_getdents64,"Jc":___syscall_getsockname,"Ic":___syscall_getsockopt,"mb":___syscall_ioctl,"Hc":___syscall_listen,"ad":___syscall_lstat64,"_c":___syscall_mkdirat,"$c":___syscall_newfstatat,"nb":___syscall_openat,"Zc":___syscall_poll,"Vc":___syscall_readlinkat,"Gc":___syscall_recvfrom,"Sc":___syscall_renameat,"Tc":___syscall_rmdir,"Fc":___syscall_sendto,"jb":___syscall_socket,"bd":___syscall_stat64,"Qc":___syscall_statfs64,"Pc":___syscall_symlink,"Uc":___syscall_unlinkat,"nd":__dlinit,"pd":__dlopen_js,"od":__dlsym_js,"Va":__emscripten_date_now,"id":__emscripten_get_now_is_monotonic,"Ec":__emscripten_throw_longjmp,"jd":__gmtime_js,"kd":__localtime_js,"md":__tzset_js,"ja":_abort,"qb":_emscripten_cancel_main_loop,"Jh":_emscripten_force_exit,"Ua":_emscripten_get_now,"yi":_emscripten_glActiveTexture,"xi":_emscripten_glAttachShader,"mf":_emscripten_glBeginQuery,"Qi":_emscripten_glBeginQueryEXT,"Ue":_emscripten_glBeginTransformFeedback,"wi":_emscripten_glBindAttribLocation,"vi":_emscripten_glBindBuffer,"Qe":_emscripten_glBindBufferBase,"Re":_emscripten_glBindBufferRange,"ui":_emscripten_glBindFramebuffer,"ti":_emscripten_glBindRenderbuffer,"Td":_emscripten_glBindSampler,"si":_emscripten_glBindTexture,"Kd":_emscripten_glBindTransformFeedback,"Ze":_emscripten_glBindVertexArray,"Hi":_emscripten_glBindVertexArrayOES,"ri":_emscripten_glBlendColor,"qi":_emscripten_glBlendEquation,"pi":_emscripten_glBlendEquationSeparate,"ni":_emscripten_glBlendFunc,"mi":_emscripten_glBlendFuncSeparate,"af":_emscripten_glBlitFramebuffer,"li":_emscripten_glBufferData,"ki":_emscripten_glBufferSubData,"ji":_emscripten_glCheckFramebufferStatus,"ii":_emscripten_glClear,"re":_emscripten_glClearBufferfi,"se":_emscripten_glClearBufferfv,"ue":_emscripten_glClearBufferiv,"te":_emscripten_glClearBufferuiv,"hi":_emscripten_glClearColor,"gi":_emscripten_glClearDepthf,"fi":_emscripten_glClearStencil,"ce":_emscripten_glClientWaitSync,"ei":_emscripten_glColorMask,"bi":_emscripten_glCompileShader,"ai":_emscripten_glCompressedTexImage2D,"rf":_emscripten_glCompressedTexImage3D,"$h":_emscripten_glCompressedTexSubImage2D,"qf":_emscripten_glCompressedTexSubImage3D,"pe":_emscripten_glCopyBufferSubData,"_h":_emscripten_glCopyTexImage2D,"Zh":_emscripten_glCopyTexSubImage2D,"sf":_emscripten_glCopyTexSubImage3D,"Yh":_emscripten_glCreateProgram,"Xh":_emscripten_glCreateShader,"Wh":_emscripten_glCullFace,"Vh":_emscripten_glDeleteBuffers,"Uh":_emscripten_glDeleteFramebuffers,"Th":_emscripten_glDeleteProgram,"of":_emscripten_glDeleteQueries,"Si":_emscripten_glDeleteQueriesEXT,"Sh":_emscripten_glDeleteRenderbuffers,"Vd":_emscripten_glDeleteSamplers,"Rh":_emscripten_glDeleteShader,"de":_emscripten_glDeleteSync,"Qh":_emscripten_glDeleteTextures,"Jd":_emscripten_glDeleteTransformFeedbacks,"Ye":_emscripten_glDeleteVertexArrays,"Gi":_emscripten_glDeleteVertexArraysOES,"Ph":_emscripten_glDepthFunc,"Oh":_emscripten_glDepthMask,"Nh":_emscripten_glDepthRangef,"Mh":_emscripten_glDetachShader,"Lh":_emscripten_glDisable,"Kh":_emscripten_glDisableVertexAttribArray,"Ih":_emscripten_glDrawArrays,"he":_emscripten_glDrawArraysInstanced,"Ci":_emscripten_glDrawArraysInstancedANGLE,"Bf":_emscripten_glDrawArraysInstancedARB,"Cf":_emscripten_glDrawArraysInstancedEXT,"td":_emscripten_glDrawArraysInstancedNV,"hf":_emscripten_glDrawBuffers,"xf":_emscripten_glDrawBuffersEXT,"Di":_emscripten_glDrawBuffersWEBGL,"Hh":_emscripten_glDrawElements,"ge":_emscripten_glDrawElementsInstanced,"Bi":_emscripten_glDrawElementsInstancedANGLE,"yf":_emscripten_glDrawElementsInstancedARB,"zf":_emscripten_glDrawElementsInstancedEXT,"Af":_emscripten_glDrawElementsInstancedNV,"vf":_emscripten_glDrawRangeElements,"Gh":_emscripten_glEnable,"Fh":_emscripten_glEnableVertexAttribArray,"lf":_emscripten_glEndQuery,"Pi":_emscripten_glEndQueryEXT,"Se":_emscripten_glEndTransformFeedback,"fe":_emscripten_glFenceSync,"Eh":_emscripten_glFinish,"Dh":_emscripten_glFlush,"Ch":_emscripten_glFramebufferRenderbuffer,"Bh":_emscripten_glFramebufferTexture2D,"_e":_emscripten_glFramebufferTextureLayer,"Ah":_emscripten_glFrontFace,"zh":_emscripten_glGenBuffers,"xh":_emscripten_glGenFramebuffers,"pf":_emscripten_glGenQueries,"Ti":_emscripten_glGenQueriesEXT,"wh":_emscripten_glGenRenderbuffers,"Wd":_emscripten_glGenSamplers,"vh":_emscripten_glGenTextures,"Id":_emscripten_glGenTransformFeedbacks,"Xe":_emscripten_glGenVertexArrays,"Fi":_emscripten_glGenVertexArraysOES,"yh":_emscripten_glGenerateMipmap,"uh":_emscripten_glGetActiveAttrib,"th":_emscripten_glGetActiveUniform,"je":_emscripten_glGetActiveUniformBlockName,"ke":_emscripten_glGetActiveUniformBlockiv,"ne":_emscripten_glGetActiveUniformsiv,"sh":_emscripten_glGetAttachedShaders,"rh":_emscripten_glGetAttribLocation,"qh":_emscripten_glGetBooleanv,"Xd":_emscripten_glGetBufferParameteri64v,"ph":_emscripten_glGetBufferParameteriv,"nh":_emscripten_glGetError,"mh":_emscripten_glGetFloatv,"Ee":_emscripten_glGetFragDataLocation,"lh":_emscripten_glGetFramebufferAttachmentParameteriv,"Yd":_emscripten_glGetInteger64i_v,"_d":_emscripten_glGetInteger64v,"Ve":_emscripten_glGetIntegeri_v,"kh":_emscripten_glGetIntegerv,"wd":_emscripten_glGetInternalformativ,"Dd":_emscripten_glGetProgramBinary,"ih":_emscripten_glGetProgramInfoLog,"jh":_emscripten_glGetProgramiv,"Ji":_emscripten_glGetQueryObjecti64vEXT,"Mi":_emscripten_glGetQueryObjectivEXT,"Ii":_emscripten_glGetQueryObjectui64vEXT,"jf":_emscripten_glGetQueryObjectuiv,"Li":_emscripten_glGetQueryObjectuivEXT,"kf":_emscripten_glGetQueryiv,"Ni":_emscripten_glGetQueryivEXT,"hh":_emscripten_glGetRenderbufferParameteriv,"Md":_emscripten_glGetSamplerParameterfv,"Nd":_emscripten_glGetSamplerParameteriv,"fh":_emscripten_glGetShaderInfoLog,"eh":_emscripten_glGetShaderPrecisionFormat,"ch":_emscripten_glGetShaderSource,"gh":_emscripten_glGetShaderiv,"bh":_emscripten_glGetString,"qe":_emscripten_glGetStringi,"Zd":_emscripten_glGetSynciv,"ah":_emscripten_glGetTexParameterfv,"$g":_emscripten_glGetTexParameteriv,"Oe":_emscripten_glGetTransformFeedbackVarying,"le":_emscripten_glGetUniformBlockIndex,"oe":_emscripten_glGetUniformIndices,"Yg":_emscripten_glGetUniformLocation,"_g":_emscripten_glGetUniformfv,"Zg":_emscripten_glGetUniformiv,"Fe":_emscripten_glGetUniformuiv,"Me":_emscripten_glGetVertexAttribIiv,"Le":_emscripten_glGetVertexAttribIuiv,"Vg":_emscripten_glGetVertexAttribPointerv,"Xg":_emscripten_glGetVertexAttribfv,"Wg":_emscripten_glGetVertexAttribiv,"Tg":_emscripten_glHint,"Ad":_emscripten_glInvalidateFramebuffer,"zd":_emscripten_glInvalidateSubFramebuffer,"Sg":_emscripten_glIsBuffer,"Rg":_emscripten_glIsEnabled,"Qg":_emscripten_glIsFramebuffer,"Pg":_emscripten_glIsProgram,"nf":_emscripten_glIsQuery,"Ri":_emscripten_glIsQueryEXT,"Og":_emscripten_glIsRenderbuffer,"Ud":_emscripten_glIsSampler,"Ng":_emscripten_glIsShader,"ee":_emscripten_glIsSync,"Mg":_emscripten_glIsTexture,"Hd":_emscripten_glIsTransformFeedback,"We":_emscripten_glIsVertexArray,"Ei":_emscripten_glIsVertexArrayOES,"Lg":_emscripten_glLineWidth,"Kg":_emscripten_glLinkProgram,"Fd":_emscripten_glPauseTransformFeedback,"Ig":_emscripten_glPixelStorei,"Hg":_emscripten_glPolygonOffset,"Cd":_emscripten_glProgramBinary,"Bd":_emscripten_glProgramParameteri,"Oi":_emscripten_glQueryCounterEXT,"wf":_emscripten_glReadBuffer,"Gg":_emscripten_glReadPixels,"Fg":_emscripten_glReleaseShaderCompiler,"Eg":_emscripten_glRenderbufferStorage,"$e":_emscripten_glRenderbufferStorageMultisample,"Ed":_emscripten_glResumeTransformFeedback,"Dg":_emscripten_glSampleCoverage,"Pd":_emscripten_glSamplerParameterf,"Od":_emscripten_glSamplerParameterfv,"Sd":_emscripten_glSamplerParameteri,"Qd":_emscripten_glSamplerParameteriv,"Cg":_emscripten_glScissor,"Bg":_emscripten_glShaderBinary,"Ag":_emscripten_glShaderSource,"zg":_emscripten_glStencilFunc,"xg":_emscripten_glStencilFuncSeparate,"wg":_emscripten_glStencilMask,"vg":_emscripten_glStencilMaskSeparate,"ug":_emscripten_glStencilOp,"tg":_emscripten_glStencilOpSeparate,"sg":_emscripten_glTexImage2D,"uf":_emscripten_glTexImage3D,"rg":_emscripten_glTexParameterf,"qg":_emscripten_glTexParameterfv,"pg":_emscripten_glTexParameteri,"og":_emscripten_glTexParameteriv,"yd":_emscripten_glTexStorage2D,"xd":_emscripten_glTexStorage3D,"mg":_emscripten_glTexSubImage2D,"tf":_emscripten_glTexSubImage3D,"Pe":_emscripten_glTransformFeedbackVaryings,"lg":_emscripten_glUniform1f,"kg":_emscripten_glUniform1fv,"jg":_emscripten_glUniform1i,"ig":_emscripten_glUniform1iv,"De":_emscripten_glUniform1ui,"ze":_emscripten_glUniform1uiv,"hg":_emscripten_glUniform2f,"gg":_emscripten_glUniform2fv,"fg":_emscripten_glUniform2i,"eg":_emscripten_glUniform2iv,"Ce":_emscripten_glUniform2ui,"ye":_emscripten_glUniform2uiv,"dg":_emscripten_glUniform3f,"ag":_emscripten_glUniform3fv,"$f":_emscripten_glUniform3i,"_f":_emscripten_glUniform3iv,"Be":_emscripten_glUniform3ui,"we":_emscripten_glUniform3uiv,"Zf":_emscripten_glUniform4f,"Yf":_emscripten_glUniform4fv,"Xf":_emscripten_glUniform4i,"Wf":_emscripten_glUniform4iv,"Ae":_emscripten_glUniform4ui,"ve":_emscripten_glUniform4uiv,"ie":_emscripten_glUniformBlockBinding,"Vf":_emscripten_glUniformMatrix2fv,"gf":_emscripten_glUniformMatrix2x3fv,"ef":_emscripten_glUniformMatrix2x4fv,"Uf":_emscripten_glUniformMatrix3fv,"ff":_emscripten_glUniformMatrix3x2fv,"cf":_emscripten_glUniformMatrix3x4fv,"Tf":_emscripten_glUniformMatrix4fv,"df":_emscripten_glUniformMatrix4x2fv,"bf":_emscripten_glUniformMatrix4x3fv,"Rf":_emscripten_glUseProgram,"Qf":_emscripten_glValidateProgram,"Pf":_emscripten_glVertexAttrib1f,"Of":_emscripten_glVertexAttrib1fv,"Nf":_emscripten_glVertexAttrib2f,"Mf":_emscripten_glVertexAttrib2fv,"Lf":_emscripten_glVertexAttrib3f,"Kf":_emscripten_glVertexAttrib3fv,"Jf":_emscripten_glVertexAttrib4f,"If":_emscripten_glVertexAttrib4fv,"Ld":_emscripten_glVertexAttribDivisor,"Ai":_emscripten_glVertexAttribDivisorANGLE,"Df":_emscripten_glVertexAttribDivisorARB,"Ef":_emscripten_glVertexAttribDivisorEXT,"ud":_emscripten_glVertexAttribDivisorNV,"Ke":_emscripten_glVertexAttribI4i,"He":_emscripten_glVertexAttribI4iv,"Je":_emscripten_glVertexAttribI4ui,"Ge":_emscripten_glVertexAttribI4uiv,"Ne":_emscripten_glVertexAttribIPointer,"Gf":_emscripten_glVertexAttribPointer,"Ff":_emscripten_glViewport,"$d":_emscripten_glWaitSync,"hd":_emscripten_memcpy_big,"Ta":_emscripten_resize_heap,"pb":_emscripten_set_main_loop,"fb":_emscripten_webgl_commit_frame,"Cc":_emscripten_webgl_create_context,"bc":_emscripten_webgl_destroy_context,"Oc":_emscripten_webgl_init_context_attributes,"xc":_emscripten_webgl_make_context_current,"dd":_environ_get,"ed":_environ_sizes_get,"ua":_fd_close,"cd":_fd_fdstat_get,"lb":_fd_read,"Ac":_fd_seek,"kb":_fd_write,"k":_getTempRet0,"Sa":_getaddrinfo,"Pb":_getnameinfo,"c":_glActiveTexture,"Na":_glAttachShader,"bb":_glBeginTransformFeedback,"vb":_glBindAttribLocation,"b":_glBindBuffer,"P":_glBindBufferBase,"e":_glBindFramebuffer,"_":_glBindRenderbuffer,"a":_glBindTexture,"m":_glBindVertexArray,"D":_glBlendEquation,"X":_glBlendFunc,"w":_glBlendFuncSeparate,"ha":_glBlitFramebuffer,"q":_glBufferData,"K":_glBufferSubData,"M":_glCheckFramebufferStatus,"J":_glClear,"qa":_glClearBufferfv,"O":_glClearColor,"aa":_glClearDepthf,"N":_glColorMask,"ka":_glCompileShader,"Ab":_glCompressedTexImage2D,"gj":_glCompressedTexSubImage2D,"zb":_glCompressedTexSubImage3D,"ej":_glCopyBufferSubData,"_a":_glCopyTexSubImage2D,"$a":_glCreateProgram,"Da":_glCreateShader,"ra":_glCullFace,"L":_glDeleteBuffers,"F":_glDeleteFramebuffers,"Q":_glDeleteProgram,"U":_glDeleteRenderbuffers,"I":_glDeleteShader,"A":_glDeleteTextures,"ea":_glDeleteVertexArrays,"Y":_glDepthFunc,"H":_glDepthMask,"i":_glDisable,"p":_glDisableVertexAttribArray,"B":_glDrawArrays,"ya":_glDrawArraysInstanced,"Ja":_glDrawBuffers,"ba":_glDrawElements,"Ka":_glDrawElementsInstanced,"s":_glEnable,"j":_glEnableVertexAttribArray,"ab":_glEndTransformFeedback,"Db":_glFinish,"Z":_glFramebufferRenderbuffer,"x":_glFramebufferTexture2D,"fj":_glFramebufferTextureLayer,"Bb":_glFrontFace,"C":_glGenBuffers,"E":_glGenFramebuffers,"ga":_glGenRenderbuffers,"v":_glGenTextures,"W":_glGenVertexArrays,"R":_glGenerateMipmap,"Cb":_glGetError,"wb":_glGetFloatv,"$":_glGetIntegerv,"Zi":_glGetProgramBinary,"tb":_glGetProgramInfoLog,"Ea":_glGetProgramiv,"Oa":_glGetShaderInfoLog,"Vi":_glGetShaderSource,"da":_glGetShaderiv,"wa":_glGetString,"dj":_glGetStringi,"Xi":_glGetUniformBlockIndex,"va":_glGetUniformLocation,"lj":_glInvalidateFramebuffer,"ub":_glLinkProgram,"la":_glPixelStorei,"bj":_glProgramBinary,"_i":_glProgramParameteri,"ia":_glReadBuffer,"cb":_glReadPixels,"fa":_glRenderbufferStorage,"Ga":_glRenderbufferStorageMultisample,"T":_glScissor,"Pa":_glShaderSource,"r":_glTexImage2D,"Ia":_glTexImage3D,"g":_glTexParameterf,"d":_glTexParameteri,"ij":_glTexStorage2D,"Ha":_glTexSubImage2D,"Qa":_glTexSubImage3D,"$i":_glTransformFeedbackVaryings,"f":_glUniform1f,"u":_glUniform1i,"db":_glUniform1iv,"xb":_glUniform1ui,"Za":_glUniform2f,"n":_glUniform2fv,"Ca":_glUniform2i,"ma":_glUniform2iv,"Ya":_glUniform3f,"V":_glUniform3fv,"Ba":_glUniform3i,"xa":_glUniform4f,"y":_glUniform4fv,"Aa":_glUniform4i,"Wi":_glUniformBlockBinding,"sb":_glUniformMatrix2fv,"rb":_glUniformMatrix3fv,"o":_glUniformMatrix4fv,"pa":_glUseProgram,"z":_glVertexAttrib4f,"S":_glVertexAttrib4fv,"G":_glVertexAttribDivisor,"pj":_glVertexAttribI4ui,"La":_glVertexAttribIPointer,"h":_glVertexAttribPointer,"t":_glViewport,"di":_godot_audio_capture_start,"cg":_godot_audio_capture_stop,"be":_godot_audio_has_script_processor,"dc":_godot_audio_has_worklet,"bk":_godot_audio_init,"ck":_godot_audio_is_available,"kj":_godot_audio_resume,"yc":_godot_audio_script_create,"nc":_godot_audio_script_start,"Ub":_godot_audio_worklet_create,"ak":_godot_audio_worklet_start_no_threads,"Sb":_godot_js_config_canvas_id_get,"dh":_godot_js_config_locale_get,"_b":_godot_js_display_alert,"me":_godot_js_display_canvas_focus,"xe":_godot_js_display_canvas_is_focused,"ld":_godot_js_display_clipboard_get,"vd":_godot_js_display_clipboard_set,"Te":_godot_js_display_cursor_is_hidden,"Ie":_godot_js_display_cursor_is_locked,"Wa":_godot_js_display_cursor_lock_set,"ob":_godot_js_display_cursor_set_custom_shape,"Hf":_godot_js_display_cursor_set_shape,"Xa":_godot_js_display_cursor_set_visible,"yg":_godot_js_display_desired_size_set,"oc":_godot_js_display_fullscreen_cb,"Sf":_godot_js_display_fullscreen_exit,"bg":_godot_js_display_fullscreen_request,"Rj":_godot_js_display_glGetBufferSubData,"ib":_godot_js_display_has_webgl,"Yc":_godot_js_display_is_swap_ok_cancel,"lc":_godot_js_display_notification_cb,"cc":_godot_js_display_pixel_ratio_get,"ec":_godot_js_display_screen_dpi_get,"Jg":_godot_js_display_screen_size_get,"gd":_godot_js_display_setup_canvas,"Ug":_godot_js_display_size_update,"ae":_godot_js_display_touchscreen_is_available,"jc":_godot_js_display_vk_available,"kc":_godot_js_display_vk_cb,"hc":_godot_js_display_vk_hide,"ic":_godot_js_display_vk_show,"mc":_godot_js_display_window_blur_cb,"Yb":_godot_js_display_window_icon_set,"ng":_godot_js_display_window_size_get,"Zb":_godot_js_display_window_title_set,"zi":_godot_js_eval,"qj":_godot_js_fetch_body_length_get,"Aj":_godot_js_fetch_create,"Jb":_godot_js_fetch_free,"nj":_godot_js_fetch_http_status_get,"rj":_godot_js_fetch_is_chunked,"oj":_godot_js_fetch_read_chunk,"mj":_godot_js_fetch_read_headers,"eb":_godot_js_fetch_state_get,"pc":_godot_js_input_drop_files_cb,"rc":_godot_js_input_gamepad_cb,"fc":_godot_js_input_gamepad_sample,"Rd":_godot_js_input_gamepad_sample_count,"Gd":_godot_js_input_gamepad_sample_get,"sc":_godot_js_input_key_cb,"wc":_godot_js_input_mouse_button_cb,"vc":_godot_js_input_mouse_move_cb,"uc":_godot_js_input_mouse_wheel_cb,"qc":_godot_js_input_paste_cb,"tc":_godot_js_input_touch_cb,"Wb":_godot_js_input_vibrate_handheld,"oi":_godot_js_os_download_buffer,"ac":_godot_js_os_execute,"oh":_godot_js_os_finish_async,"Rb":_godot_js_os_fs_is_persistent,"gc":_godot_js_os_fs_sync,"$b":_godot_js_os_hw_concurrency_get,"Tb":_godot_js_os_request_quit_cb,"Xb":_godot_js_os_shell_open,"Qb":_godot_js_pwa_cb,"Vb":_godot_js_pwa_update,"Ob":_godot_js_rtc_datachannel_close,"Vj":_godot_js_rtc_datachannel_connect,"Sj":_godot_js_rtc_datachannel_destroy,"Wj":_godot_js_rtc_datachannel_get_buffered_amount,"_j":_godot_js_rtc_datachannel_id_get,"Xj":_godot_js_rtc_datachannel_is_negotiated,"$j":_godot_js_rtc_datachannel_is_ordered,"Uj":_godot_js_rtc_datachannel_label_get,"Zj":_godot_js_rtc_datachannel_max_packet_lifetime_get,"Yj":_godot_js_rtc_datachannel_max_retransmits_get,"Tj":_godot_js_rtc_datachannel_protocol_get,"Nb":_godot_js_rtc_datachannel_ready_state_get,"Mb":_godot_js_rtc_datachannel_send,"Qj":_godot_js_rtc_pc_close,"Lj":_godot_js_rtc_pc_create,"Kj":_godot_js_rtc_pc_datachannel_create,"Lb":_godot_js_rtc_pc_destroy,"Mj":_godot_js_rtc_pc_ice_candidate_add,"Oj":_godot_js_rtc_pc_local_description_set,"Pj":_godot_js_rtc_pc_offer_create,"Nj":_godot_js_rtc_pc_remote_description_set,"Kb":_godot_js_websocket_buffered_amount,"Ij":_godot_js_websocket_close,"Hj":_godot_js_websocket_create,"Ib":_godot_js_websocket_destroy,"Jj":_godot_js_websocket_send,"Yi":_godot_js_wrapper_create_cb,"Ki":_godot_js_wrapper_create_object,"Ui":_godot_js_wrapper_interface_get,"aj":_godot_js_wrapper_object_call,"hj":_godot_js_wrapper_object_get,"yb":_godot_js_wrapper_object_getvar,"jj":_godot_js_wrapper_object_set,"cj":_godot_js_wrapper_object_setvar,"ci":_godot_js_wrapper_object_unref,"vj":_godot_webxr_commit_for_eye,"Ej":_godot_webxr_get_bounds_geometry,"Fb":_godot_webxr_get_controller_axes,"sj":_godot_webxr_get_controller_buttons,"uj":_godot_webxr_get_controller_count,"Ra":_godot_webxr_get_controller_target_ray_mode,"tj":_godot_webxr_get_controller_transform,"wj":_godot_webxr_get_projection_for_eye,"yj":_godot_webxr_get_render_targetsize,"xj":_godot_webxr_get_transform_for_eye,"Dj":_godot_webxr_get_view_count,"Fj":_godot_webxr_get_visibility_state,"Bj":_godot_webxr_initialize,"Gb":_godot_webxr_is_controller_connected,"Gj":_godot_webxr_is_session_supported,"Cj":_godot_webxr_is_supported,"Hb":_godot_webxr_sample_controller_data,"zj":_godot_webxr_uninitialize,"za":invoke_ii,"na":invoke_iii,"gb":invoke_iiii,"hb":invoke_iiiii,"Dc":invoke_iiiiii,"Bc":invoke_iiiiiii,"zc":invoke_iij,"ca":invoke_vi,"oa":invoke_vii,"ta":invoke_viii,"sa":invoke_viiii,"Ma":invoke_viiiiiii,"l":_setTempRet0,"Eb":_strftime,"Nc":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["ek"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["fk"]).apply(null,arguments)};var __Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=function(){return(__Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=Module["asm"]["gk"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["hk"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["ik"]).apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return(_htonl=Module["_htonl"]=Module["asm"]["jk"]).apply(null,arguments)};var _htons=Module["_htons"]=function(){return(_htons=Module["_htons"]=Module["asm"]["kk"]).apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return(_ntohs=Module["_ntohs"]=Module["asm"]["lk"]).apply(null,arguments)};var _fflush=Module["_fflush"]=function(){return(_fflush=Module["_fflush"]=Module["asm"]["mk"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["nk"]).apply(null,arguments)};var __emwebxr_on_input_event=Module["__emwebxr_on_input_event"]=function(){return(__emwebxr_on_input_event=Module["__emwebxr_on_input_event"]=Module["asm"]["ok"]).apply(null,arguments)};var __emwebxr_on_simple_event=Module["__emwebxr_on_simple_event"]=function(){return(__emwebxr_on_simple_event=Module["__emwebxr_on_simple_event"]=Module["asm"]["pk"]).apply(null,arguments)};var ___funcs_on_exit=Module["___funcs_on_exit"]=function(){return(___funcs_on_exit=Module["___funcs_on_exit"]=Module["asm"]["qk"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["sk"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["tk"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["uk"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["vk"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["wk"]).apply(null,arguments)};function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iij(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iij(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["cwrap"]=cwrap;Module["callMain"]=callMain;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach(arg=>{HEAP32[argv_ptr++]=allocateUTF8OnStack(arg)});HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exit(ret,true);return ret}catch(e){return handleException(e)}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!keepRuntimeAlive()){exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=false;if(Module["noInitialRun"])shouldRunNow=false;run(); + + + return Godot.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Godot; +else if (typeof define === 'function' && define['amd']) + define([], function() { return Godot; }); +else if (typeof exports === 'object') + exports["Godot"] = Godot; + +const Preloader = /** @constructor */ function () { // eslint-disable-line no-unused-vars + function getTrackedResponse(response, load_status) { + function onloadprogress(reader, controller) { + return reader.read().then(function (result) { + if (load_status.done) { + return Promise.resolve(); + } + if (result.value) { + controller.enqueue(result.value); + load_status.loaded += result.value.length; + } + if (!result.done) { + return onloadprogress(reader, controller); + } + load_status.done = true; + return Promise.resolve(); + }); + } + const reader = response.body.getReader(); + return new Response(new ReadableStream({ + start: function (controller) { + onloadprogress(reader, controller).then(function () { + controller.close(); + }); + }, + }), { headers: response.headers }); + } + + function loadFetch(file, tracker, fileSize, raw) { + tracker[file] = { + total: fileSize || 0, + loaded: 0, + done: false, + }; + return fetch(file).then(function (response) { + if (!response.ok) { + return Promise.reject(new Error(`Failed loading file '${file}'`)); + } + const tr = getTrackedResponse(response, tracker[file]); + if (raw) { + return Promise.resolve(tr); + } + return tr.arrayBuffer(); + }); + } + + function retry(func, attempts = 1) { + function onerror(err) { + if (attempts <= 1) { + return Promise.reject(err); + } + return new Promise(function (resolve, reject) { + setTimeout(function () { + retry(func, attempts - 1).then(resolve).catch(reject); + }, 1000); + }); + } + return func().catch(onerror); + } + + const DOWNLOAD_ATTEMPTS_MAX = 4; + const loadingFiles = {}; + const lastProgress = { loaded: 0, total: 0 }; + let progressFunc = null; + + const animateProgress = function () { + let loaded = 0; + let total = 0; + let totalIsValid = true; + let progressIsFinal = true; + + Object.keys(loadingFiles).forEach(function (file) { + const stat = loadingFiles[file]; + if (!stat.done) { + progressIsFinal = false; + } + if (!totalIsValid || stat.total === 0) { + totalIsValid = false; + total = 0; + } else { + total += stat.total; + } + loaded += stat.loaded; + }); + if (loaded !== lastProgress.loaded || total !== lastProgress.total) { + lastProgress.loaded = loaded; + lastProgress.total = total; + if (typeof progressFunc === 'function') { + progressFunc(loaded, total); + } + } + if (!progressIsFinal) { + requestAnimationFrame(animateProgress); + } + }; + + this.animateProgress = animateProgress; + + this.setProgressFunc = function (callback) { + progressFunc = callback; + }; + + this.loadPromise = function (file, fileSize, raw = false) { + return retry(loadFetch.bind(null, file, loadingFiles, fileSize, raw), DOWNLOAD_ATTEMPTS_MAX); + }; + + this.preloadedFiles = []; + this.preload = function (pathOrBuffer, destPath, fileSize) { + let buffer = null; + if (typeof pathOrBuffer === 'string') { + const me = this; + return this.loadPromise(pathOrBuffer, fileSize).then(function (buf) { + me.preloadedFiles.push({ + path: destPath || pathOrBuffer, + buffer: buf, + }); + return Promise.resolve(); + }); + } else if (pathOrBuffer instanceof ArrayBuffer) { + buffer = new Uint8Array(pathOrBuffer); + } else if (ArrayBuffer.isView(pathOrBuffer)) { + buffer = new Uint8Array(pathOrBuffer.buffer); + } + if (buffer) { + this.preloadedFiles.push({ + path: destPath, + buffer: pathOrBuffer, + }); + return Promise.resolve(); + } + return Promise.reject(new Error('Invalid object for preloading')); + }; +}; + +/** + * An object used to configure the Engine instance based on godot export options, and to override those in custom HTML + * templates if needed. + * + * @header Engine configuration + * @summary The Engine configuration object. This is just a typedef, create it like a regular object, e.g.: + * + * ``const MyConfig = { executable: 'godot', unloadAfterInit: false }`` + * + * @typedef {Object} EngineConfig + */ +const EngineConfig = {}; // eslint-disable-line no-unused-vars + +/** + * @struct + * @constructor + * @ignore + */ +const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-vars + const cfg = /** @lends {InternalConfig.prototype} */ { + /** + * Whether the unload the engine automatically after the instance is initialized. + * + * @memberof EngineConfig + * @default + * @type {boolean} + */ + unloadAfterInit: true, + /** + * The HTML DOM Canvas object to use. + * + * By default, the first canvas element in the document will be used is none is specified. + * + * @memberof EngineConfig + * @default + * @type {?HTMLCanvasElement} + */ + canvas: null, + /** + * The name of the WASM file without the extension. (Set by Godot Editor export process). + * + * @memberof EngineConfig + * @default + * @type {string} + */ + executable: '', + /** + * An alternative name for the game pck to load. The executable name is used otherwise. + * + * @memberof EngineConfig + * @default + * @type {?string} + */ + mainPack: null, + /** + * Specify a language code to select the proper localization for the game. + * + * The browser locale will be used if none is specified. See complete list of + * :ref:`supported locales `. + * + * @memberof EngineConfig + * @type {?string} + * @default + */ + locale: null, + /** + * The canvas resize policy determines how the canvas should be resized by Godot. + * + * ``0`` means Godot won't do any resizing. This is useful if you want to control the canvas size from + * javascript code in your template. + * + * ``1`` means Godot will resize the canvas on start, and when changing window size via engine functions. + * + * ``2`` means Godot will adapt the canvas size to match the whole browser window. + * + * @memberof EngineConfig + * @type {number} + * @default + */ + canvasResizePolicy: 2, + /** + * The arguments to be passed as command line arguments on startup. + * + * See :ref:`command line tutorial `. + * + * **Note**: :js:meth:`startGame ` will always add the ``--main-pack`` argument. + * + * @memberof EngineConfig + * @type {Array} + * @default + */ + args: [], + /** + * When enabled, the game canvas will automatically grab the focus when the engine starts. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + focusCanvas: true, + /** + * When enabled, this will turn on experimental virtual keyboard support on mobile. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + experimentalVK: false, + /** + * The progressive web app service worker to install. + * @memberof EngineConfig + * @default + * @type {string} + */ + serviceWorker: '', + /** + * @ignore + * @type {Array.} + */ + persistentPaths: ['/userfs'], + /** + * @ignore + * @type {boolean} + */ + persistentDrops: false, + /** + * @ignore + * @type {Array.} + */ + gdnativeLibs: [], + /** + * @ignore + * @type {Array.} + */ + fileSizes: [], + /** + * A callback function for handling Godot's ``OS.execute`` calls. + * + * This is for example used in the Web Editor template to switch between project manager and editor, and for running the game. + * + * @callback EngineConfig.onExecute + * @param {string} path The path that Godot's wants executed. + * @param {Array.} args The arguments of the "command" to execute. + */ + /** + * @ignore + * @type {?function(string, Array.)} + */ + onExecute: null, + /** + * A callback function for being notified when the Godot instance quits. + * + * **Note**: This function will not be called if the engine crashes or become unresponsive. + * + * @callback EngineConfig.onExit + * @param {number} status_code The status code returned by Godot on exit. + */ + /** + * @ignore + * @type {?function(number)} + */ + onExit: null, + /** + * A callback function for displaying download progress. + * + * The function is called once per frame while downloading files, so the usage of ``requestAnimationFrame()`` + * is not necessary. + * + * If the callback function receives a total amount of bytes as 0, this means that it is impossible to calculate. + * Possible reasons include: + * + * - Files are delivered with server-side chunked compression + * - Files are delivered with server-side compression on Chromium + * - Not all file downloads have started yet (usually on servers without multi-threading) + * + * @callback EngineConfig.onProgress + * @param {number} current The current amount of downloaded bytes so far. + * @param {number} total The total amount of bytes to be downloaded. + */ + /** + * @ignore + * @type {?function(number, number)} + */ + onProgress: null, + /** + * A callback function for handling the standard output stream. This method should usually only be used in debug pages. + * + * By default, ``console.log()`` is used. + * + * @callback EngineConfig.onPrint + * @param {...*} [var_args] A variadic number of arguments to be printed. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrint: function () { + console.log.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + /** + * A callback function for handling the standard error stream. This method should usually only be used in debug pages. + * + * By default, ``console.error()`` is used. + * + * @callback EngineConfig.onPrintError + * @param {...*} [var_args] A variadic number of arguments to be printed as errors. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrintError: function (var_args) { + console.error.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + }; + + /** + * @ignore + * @struct + * @constructor + * @param {EngineConfig} opts + */ + function Config(opts) { + this.update(opts); + } + + Config.prototype = cfg; + + /** + * @ignore + * @param {EngineConfig} opts + */ + Config.prototype.update = function (opts) { + const config = opts || {}; + // NOTE: We must explicitly pass the default, accessing it via + // the key will fail due to closure compiler renames. + function parse(key, def) { + if (typeof (config[key]) === 'undefined') { + return def; + } + return config[key]; + } + // Module config + this.unloadAfterInit = parse('unloadAfterInit', this.unloadAfterInit); + this.onPrintError = parse('onPrintError', this.onPrintError); + this.onPrint = parse('onPrint', this.onPrint); + this.onProgress = parse('onProgress', this.onProgress); + + // Godot config + this.canvas = parse('canvas', this.canvas); + this.executable = parse('executable', this.executable); + this.mainPack = parse('mainPack', this.mainPack); + this.locale = parse('locale', this.locale); + this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy); + this.persistentPaths = parse('persistentPaths', this.persistentPaths); + this.persistentDrops = parse('persistentDrops', this.persistentDrops); + this.experimentalVK = parse('experimentalVK', this.experimentalVK); + this.focusCanvas = parse('focusCanvas', this.focusCanvas); + this.serviceWorker = parse('serviceWorker', this.serviceWorker); + this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs); + this.fileSizes = parse('fileSizes', this.fileSizes); + this.args = parse('args', this.args); + this.onExecute = parse('onExecute', this.onExecute); + this.onExit = parse('onExit', this.onExit); + }; + + /** + * @ignore + * @param {string} loadPath + * @param {Response} response + */ + Config.prototype.getModuleConfig = function (loadPath, response) { + let r = response; + return { + 'print': this.onPrint, + 'printErr': this.onPrintError, + 'thisProgram': this.executable, + 'noExitRuntime': true, + 'dynamicLibraries': [`${loadPath}.side.wasm`], + 'instantiateWasm': function (imports, onSuccess) { + function done(result) { + onSuccess(result['instance'], result['module']); + } + if (typeof (WebAssembly.instantiateStreaming) !== 'undefined') { + WebAssembly.instantiateStreaming(Promise.resolve(r), imports).then(done); + } else { + r.arrayBuffer().then(function (buffer) { + WebAssembly.instantiate(buffer, imports).then(done); + }); + } + r = null; + return {}; + }, + 'locateFile': function (path) { + if (path.endsWith('.worker.js')) { + return `${loadPath}.worker.js`; + } else if (path.endsWith('.audio.worklet.js')) { + return `${loadPath}.audio.worklet.js`; + } else if (path.endsWith('.js')) { + return `${loadPath}.js`; + } else if (path.endsWith('.side.wasm')) { + return `${loadPath}.side.wasm`; + } else if (path.endsWith('.wasm')) { + return `${loadPath}.wasm`; + } + return path; + }, + }; + }; + + /** + * @ignore + * @param {function()} cleanup + */ + Config.prototype.getGodotConfig = function (cleanup) { + // Try to find a canvas + if (!(this.canvas instanceof HTMLCanvasElement)) { + const nodes = document.getElementsByTagName('canvas'); + if (nodes.length && nodes[0] instanceof HTMLCanvasElement) { + this.canvas = nodes[0]; + } + if (!this.canvas) { + throw new Error('No canvas found in page'); + } + } + // Canvas can grab focus on click, or key events won't work. + if (this.canvas.tabIndex < 0) { + this.canvas.tabIndex = 0; + } + + // Browser locale, or custom one if defined. + let locale = this.locale; + if (!locale) { + locale = navigator.languages ? navigator.languages[0] : navigator.language; + locale = locale.split('.')[0]; + } + locale = locale.replace('-', '_'); + const onExit = this.onExit; + + // Godot configuration. + return { + 'canvas': this.canvas, + 'canvasResizePolicy': this.canvasResizePolicy, + 'locale': locale, + 'persistentDrops': this.persistentDrops, + 'virtualKeyboard': this.experimentalVK, + 'focusCanvas': this.focusCanvas, + 'onExecute': this.onExecute, + 'onExit': function (p_code) { + cleanup(); // We always need to call the cleanup callback to free memory. + if (typeof (onExit) === 'function') { + onExit(p_code); + } + }, + }; + }; + return new Config(initConfig); +}; + +/** + * Projects exported for the Web expose the :js:class:`Engine` class to the JavaScript environment, that allows + * fine control over the engine's start-up process. + * + * This API is built in an asynchronous manner and requires basic understanding + * of `Promises `__. + * + * @module Engine + * @header HTML5 shell class reference + */ +const Engine = (function () { + const preloader = new Preloader(); + + let loadPromise = null; + let loadPath = ''; + let initPromise = null; + + /** + * @classdesc The ``Engine`` class provides methods for loading and starting exported projects on the Web. For default export + * settings, this is already part of the exported HTML page. To understand practical use of the ``Engine`` class, + * see :ref:`Custom HTML page for Web export `. + * + * @description Create a new Engine instance with the given configuration. + * + * @global + * @constructor + * @param {EngineConfig} initConfig The initial config for this instance. + */ + function Engine(initConfig) { // eslint-disable-line no-shadow + this.config = new InternalConfig(initConfig); + this.rtenv = null; + } + + /** + * Load the engine from the specified base path. + * + * @param {string} basePath Base path of the engine to load. + * @param {number=} [size=0] The file size if known. + * @returns {Promise} A Promise that resolves once the engine is loaded. + * + * @function Engine.load + */ + Engine.load = function (basePath, size) { + if (loadPromise == null) { + loadPath = basePath; + loadPromise = preloader.loadPromise(`${loadPath}.wasm`, size, true); + requestAnimationFrame(preloader.animateProgress); + } + return loadPromise; + }; + + /** + * Unload the engine to free memory. + * + * This method will be called automatically depending on the configuration. See :js:attr:`unloadAfterInit`. + * + * @function Engine.unload + */ + Engine.unload = function () { + loadPromise = null; + }; + + /** + * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. + * + * @param {number=} [majorVersion=1] The major WebGL version to check for. + * @returns {boolean} If the given major version of WebGL is available. + * @function Engine.isWebGLAvailable + */ + Engine.isWebGLAvailable = function (majorVersion = 1) { + try { + return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); + } catch (e) { /* Not available */ } + return false; + }; + + /** + * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution. + * @ignore + * @constructor + */ + function SafeEngine(initConfig) { + const proto = /** @lends Engine.prototype */ { + /** + * Initialize the engine instance. Optionally, pass the base path to the engine to load it, + * if it hasn't been loaded yet. See :js:meth:`Engine.load`. + * + * @param {string=} basePath Base path of the engine to load. + * @return {Promise} A ``Promise`` that resolves once the engine is loaded and initialized. + */ + init: function (basePath) { + if (initPromise) { + return initPromise; + } + if (loadPromise == null) { + if (!basePath) { + initPromise = Promise.reject(new Error('A base path must be provided when calling `init` and the engine is not loaded.')); + return initPromise; + } + Engine.load(basePath, this.config.fileSizes[`${basePath}.wasm`]); + } + const me = this; + function doInit(promise) { + // Care! Promise chaining is bogus with old emscripten versions. + // This caused a regression with the Mono build (which uses an older emscripten version). + // Make sure to test that when refactoring. + return new Promise(function (resolve, reject) { + promise.then(function (response) { + const cloned = new Response(response.clone().body, { 'headers': [['content-type', 'application/wasm']] }); + Godot(me.config.getModuleConfig(loadPath, cloned)).then(function (module) { + const paths = me.config.persistentPaths; + module['initFS'](paths).then(function (err) { + me.rtenv = module; + if (me.config.unloadAfterInit) { + Engine.unload(); + } + resolve(); + }); + }); + }); + }); + } + preloader.setProgressFunc(this.config.onProgress); + initPromise = doInit(loadPromise); + return initPromise; + }, + + /** + * Load a file so it is available in the instance's file system once it runs. Must be called **before** starting the + * instance. + * + * If not provided, the ``path`` is derived from the URL of the loaded file. + * + * @param {string|ArrayBuffer} file The file to preload. + * + * If a ``string`` the file will be loaded from that path. + * + * If an ``ArrayBuffer`` or a view on one, the buffer will used as the content of the file. + * + * @param {string=} path Path by which the file will be accessible. Required, if ``file`` is not a string. + * + * @returns {Promise} A Promise that resolves once the file is loaded. + */ + preloadFile: function (file, path) { + return preloader.preload(file, path, this.config.fileSizes[file]); + }, + + /** + * Start the engine instance using the given override configuration (if any). + * :js:meth:`startGame ` can be used in typical cases instead. + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * The engine must be loaded beforehand. + * + * Fails if a canvas cannot be found on the page, or not specified in the configuration. + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the engine started. + */ + start: function (override) { + this.config.update(override); + const me = this; + return me.init().then(function () { + if (!me.rtenv) { + return Promise.reject(new Error('The engine must be initialized before it can be started')); + } + + let config = {}; + try { + config = me.config.getGodotConfig(function () { + me.rtenv = null; + }); + } catch (e) { + return Promise.reject(e); + } + // Godot configuration. + me.rtenv['initConfig'](config); + + // Preload GDNative libraries. + const libs = []; + me.config.gdnativeLibs.forEach(function (lib) { + libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true })); + }); + return Promise.all(libs).then(function () { + return new Promise(function (resolve, reject) { + preloader.preloadedFiles.forEach(function (file) { + me.rtenv['copyToFS'](file.path, file.buffer); + }); + preloader.preloadedFiles.length = 0; // Clear memory + me.rtenv['callMain'](me.config.args); + initPromise = null; + if (me.config.serviceWorker && 'serviceWorker' in navigator) { + navigator.serviceWorker.register(me.config.serviceWorker); + } + resolve(); + }); + }); + }); + }, + + /** + * Start the game instance using the given configuration override (if any). + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * + * This will load the engine if it is not loaded, and preload the main pck. + * + * This method expects the initial config (or the override) to have both the :js:attr:`executable` and :js:attr:`mainPack` + * properties set (normally done by the editor during export). + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the game started. + */ + startGame: function (override) { + this.config.update(override); + // Add main-pack argument. + const exe = this.config.executable; + const pack = this.config.mainPack || `${exe}.pck`; + this.config.args = ['--main-pack', pack].concat(this.config.args); + // Start and init with execName as loadPath if not inited. + const me = this; + return Promise.all([ + this.init(exe), + this.preloadFile(pack, pack), + ]).then(function () { + return me.start.apply(me); + }); + }, + + /** + * Create a file at the specified ``path`` with the passed as ``buffer`` in the instance's file system. + * + * @param {string} path The location where the file will be created. + * @param {ArrayBuffer} buffer The content of the file. + */ + copyToFS: function (path, buffer) { + if (this.rtenv == null) { + throw new Error('Engine must be inited before copying files'); + } + this.rtenv['copyToFS'](path, buffer); + }, + + /** + * Request that the current instance quit. + * + * This is akin the user pressing the close button in the window manager, and will + * have no effect if the engine has crashed, or is stuck in a loop. + * + */ + requestQuit: function () { + if (this.rtenv) { + this.rtenv['request_quit'](); + } + }, + }; + + Engine.prototype = proto; + // Closure compiler exported instance methods. + Engine.prototype['init'] = Engine.prototype.init; + Engine.prototype['preloadFile'] = Engine.prototype.preloadFile; + Engine.prototype['start'] = Engine.prototype.start; + Engine.prototype['startGame'] = Engine.prototype.startGame; + Engine.prototype['copyToFS'] = Engine.prototype.copyToFS; + Engine.prototype['requestQuit'] = Engine.prototype.requestQuit; + // Also expose static methods as instance methods + Engine.prototype['load'] = Engine.load; + Engine.prototype['unload'] = Engine.unload; + Engine.prototype['isWebGLAvailable'] = Engine.isWebGLAvailable; + return new Engine(initConfig); + } + + // Closure compiler exported static methods. + SafeEngine['load'] = Engine.load; + SafeEngine['unload'] = Engine.unload; + SafeEngine['isWebGLAvailable'] = Engine.isWebGLAvailable; + + return SafeEngine; +}()); +if (typeof window !== 'undefined') { + window['Engine'] = Engine; +} diff --git a/bins/1.0.0.0/html5/index.pck b/bins/1.0.0.0/html5/index.pck new file mode 100644 index 0000000..e211735 Binary files /dev/null and b/bins/1.0.0.0/html5/index.pck differ diff --git a/bins/1.0.0.0/html5/index.png b/bins/1.0.0.0/html5/index.png new file mode 100644 index 0000000..a7baea4 Binary files /dev/null and b/bins/1.0.0.0/html5/index.png differ diff --git a/bins/1.0.0.0/html5/index.wasm b/bins/1.0.0.0/html5/index.wasm new file mode 100644 index 0000000..5151d56 Binary files /dev/null and b/bins/1.0.0.0/html5/index.wasm differ diff --git a/bins/1.0.0.0/html5/thelostmemory_html5.zip b/bins/1.0.0.0/html5/thelostmemory_html5.zip new file mode 100644 index 0000000..c5b7e25 Binary files /dev/null and b/bins/1.0.0.0/html5/thelostmemory_html5.zip differ diff --git a/bins/1.0.0.0/win/thelostmemory.exe b/bins/1.0.0.0/win/thelostmemory.exe new file mode 100644 index 0000000..c84c83e Binary files /dev/null and b/bins/1.0.0.0/win/thelostmemory.exe differ diff --git a/bins/1.0.0.0/win/thelostmemory.pck b/bins/1.0.0.0/win/thelostmemory.pck new file mode 100644 index 0000000..77173fb Binary files /dev/null and b/bins/1.0.0.0/win/thelostmemory.pck differ diff --git a/bins/1.0.0.0/win/thelostmemory_win.zip b/bins/1.0.0.0/win/thelostmemory_win.zip new file mode 100644 index 0000000..822e285 Binary files /dev/null and b/bins/1.0.0.0/win/thelostmemory_win.zip differ diff --git a/bins/1.1.0.0/html5/index.apple-touch-icon.png b/bins/1.1.0.0/html5/index.apple-touch-icon.png new file mode 100644 index 0000000..7bf43af Binary files /dev/null and b/bins/1.1.0.0/html5/index.apple-touch-icon.png differ diff --git a/bins/1.1.0.0/html5/index.audio.worklet.js b/bins/1.1.0.0/html5/index.audio.worklet.js new file mode 100644 index 0000000..ea4d8cb --- /dev/null +++ b/bins/1.1.0.0/html5/index.audio.worklet.js @@ -0,0 +1,211 @@ +/*************************************************************************/ +/* audio.worklet.js */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +class RingBuffer { + constructor(p_buffer, p_state, p_threads) { + this.buffer = p_buffer; + this.avail = p_state; + this.threads = p_threads; + this.rpos = 0; + this.wpos = 0; + } + + data_left() { + return this.threads ? Atomics.load(this.avail, 0) : this.avail; + } + + space_left() { + return this.buffer.length - this.data_left(); + } + + read(output) { + const size = this.buffer.length; + let from = 0; + let to_write = output.length; + if (this.rpos + to_write > size) { + const high = size - this.rpos; + output.set(this.buffer.subarray(this.rpos, size)); + from = high; + to_write -= high; + this.rpos = 0; + } + if (to_write) { + output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from); + } + this.rpos += to_write; + if (this.threads) { + Atomics.add(this.avail, 0, -output.length); + Atomics.notify(this.avail, 0); + } else { + this.avail -= output.length; + } + } + + write(p_buffer) { + const to_write = p_buffer.length; + const mw = this.buffer.length - this.wpos; + if (mw >= to_write) { + this.buffer.set(p_buffer, this.wpos); + this.wpos += to_write; + if (mw === to_write) { + this.wpos = 0; + } + } else { + const high = p_buffer.subarray(0, mw); + const low = p_buffer.subarray(mw); + this.buffer.set(high, this.wpos); + this.buffer.set(low); + this.wpos = low.length; + } + if (this.threads) { + Atomics.add(this.avail, 0, to_write); + Atomics.notify(this.avail, 0); + } else { + this.avail += to_write; + } + } +} + +class GodotProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.threads = false; + this.running = true; + this.lock = null; + this.notifier = null; + this.output = null; + this.output_buffer = new Float32Array(); + this.input = null; + this.input_buffer = new Float32Array(); + this.port.onmessage = (event) => { + const cmd = event.data['cmd']; + const data = event.data['data']; + this.parse_message(cmd, data); + }; + } + + process_notify() { + if (this.notifier) { + Atomics.add(this.notifier, 0, 1); + Atomics.notify(this.notifier, 0); + } + } + + parse_message(p_cmd, p_data) { + if (p_cmd === 'start' && p_data) { + const state = p_data[0]; + let idx = 0; + this.threads = true; + this.lock = state.subarray(idx, ++idx); + this.notifier = state.subarray(idx, ++idx); + const avail_in = state.subarray(idx, ++idx); + const avail_out = state.subarray(idx, ++idx); + this.input = new RingBuffer(p_data[1], avail_in, true); + this.output = new RingBuffer(p_data[2], avail_out, true); + } else if (p_cmd === 'stop') { + this.running = false; + this.output = null; + this.input = null; + } else if (p_cmd === 'start_nothreads') { + this.output = new RingBuffer(p_data[0], p_data[0].length, false); + } else if (p_cmd === 'chunk') { + this.output.write(p_data); + } + } + + static array_has_data(arr) { + return arr.length && arr[0].length && arr[0][0].length; + } + + process(inputs, outputs, parameters) { + if (!this.running) { + return false; // Stop processing. + } + if (this.output === null) { + return true; // Not ready yet, keep processing. + } + const process_input = GodotProcessor.array_has_data(inputs); + if (process_input) { + const input = inputs[0]; + const chunk = input[0].length * input.length; + if (this.input_buffer.length !== chunk) { + this.input_buffer = new Float32Array(chunk); + } + if (!this.threads) { + GodotProcessor.write_input(this.input_buffer, input); + this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer }); + } else if (this.input.space_left() >= chunk) { + GodotProcessor.write_input(this.input_buffer, input); + this.input.write(this.input_buffer); + } else { + this.port.postMessage('Input buffer is full! Skipping input frame.'); + } + } + const process_output = GodotProcessor.array_has_data(outputs); + if (process_output) { + const output = outputs[0]; + const chunk = output[0].length * output.length; + if (this.output_buffer.length !== chunk) { + this.output_buffer = new Float32Array(chunk); + } + if (this.output.data_left() >= chunk) { + this.output.read(this.output_buffer); + GodotProcessor.write_output(output, this.output_buffer); + if (!this.threads) { + this.port.postMessage({ 'cmd': 'read', 'data': chunk }); + } + } else { + this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); + } + } + this.process_notify(); + return true; + } + + static write_output(dest, source) { + const channels = dest.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < dest[ch].length; sample++) { + dest[ch][sample] = source[sample * channels + ch]; + } + } + } + + static write_input(dest, source) { + const channels = source.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < source[ch].length; sample++) { + dest[sample * channels + ch] = source[ch][sample]; + } + } + } +} + +registerProcessor('godot-processor', GodotProcessor); diff --git a/bins/1.1.0.0/html5/index.html b/bins/1.1.0.0/html5/index.html new file mode 100644 index 0000000..4d71f5f --- /dev/null +++ b/bins/1.1.0.0/html5/index.html @@ -0,0 +1,248 @@ + + + + + + The Lost Memory + + + + + + + + HTML5 canvas appears to be unsupported in the current browser.
+ Please try updating or use a different browser. +
+
+ + + +
+ + + + + + diff --git a/bins/1.1.0.0/html5/index.icon.png b/bins/1.1.0.0/html5/index.icon.png new file mode 100644 index 0000000..8ac2686 Binary files /dev/null and b/bins/1.1.0.0/html5/index.icon.png differ diff --git a/bins/1.1.0.0/html5/index.js b/bins/1.1.0.0/html5/index.js new file mode 100644 index 0000000..1c18e52 --- /dev/null +++ b/bins/1.1.0.0/html5/index.js @@ -0,0 +1,796 @@ + +var Godot = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + + return ( +function(Godot) { + Godot = Godot || {}; + +var Module=typeof Godot!="undefined"?Godot:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});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,setWindowTitle;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(_scriptDir){scriptDirectory=_scriptDir}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)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.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"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var getTempRet0=()=>tempRet0;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||false;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)}}function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(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=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function 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}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||33554432;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}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();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);FS.quit();TTY.shutdown();IDBFS.quit();runtimeExited=true}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);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="godot.javascript.opt.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["dk"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["rk"];addOnInit(Module["asm"]["ek"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return Number(HEAPF64[ptr>>3]);default:abort("invalid type for getValue: "+type)}return null}function getWasmTableEntry(funcPtr){return wasmTable.get(funcPtr)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function ___call_sighandler(fp,sig){getWasmTableEntry(fp)(sig)}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,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else return function(){abort("randomDevice")}}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){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function zeroMemory(address,size){HEAPU8.fill(0,address,address+size)}function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(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:function(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:function(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:function(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:function(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:function(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:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(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:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(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:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(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{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function(mount){return MEMFS.mount.apply(null,arguments)},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(this.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>{return PATH.join2(root,p)}}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={"timestamp":stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(this.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={"timestamp":cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{"timestamp":stat.mtime,"mode":stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{"timestamp":stat.mtime,"mode":stat.mode,"contents":node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>{callback(null,event.target.result)};req.onerror=e=>{callback(this.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=e=>{done(this.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};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(FS.cwd(),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.normalizeArray(path.split("/").filter(p=>!!p),false);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},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},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:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);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;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,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 random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);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.getStream(fd);if(!stream)throw new FS.ErrnoError(8);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.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,"IDBFS":IDBFS}},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;_fflush(0);for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.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||[])}else{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},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(Browser.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)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(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]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}else{data=new Uint8Array(data)}}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___syscall_accept4(fd,addr,addrlen,flags){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___syscall_bind(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}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 instanceof FS.ErrnoError))throw e;return-e.errno}}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}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.get();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 instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getsockname(fd,addr,addrlen){try{err("__syscall_getsockname "+fd);var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getsockopt(fd,level,optname,optval,optlen){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.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:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~4352;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.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 instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_symlink(target,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __dlinit(main_dso_handle){}var dlopenMissingError="To use dlopen, you need enable dynamic linking, see https://github.com/emscripten-core/emscripten/wiki/Linking";function __dlopen_js(filename,flag){abort(dlopenMissingError)}function __dlsym_js(handle,symbol){abort(dlopenMissingError)}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function __gmtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function __localtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function _tzset_impl(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}function _abort(){abort("")}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){runtimeKeepalivePush();Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();function _emscripten_webgl_do_commit_frame(){if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(GL.currentContext.defaultFbo){GL.blitOffscreenFramebuffer(GL.currentContext);return 0}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0}function _emscripten_webgl_commit_frame(){return _emscripten_webgl_do_commit_frame()}function runtimeKeepalivePush(){runtimeKeepaliveCounter+=1}function _exit(status){exit(status)}function maybeExit(){if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}function callUserCallback(func,synchronous){if(runtimeExited||ABORT){return}if(synchronous){func();return}try{func();maybeExit()}catch(e){handleException(e)}}function runtimeKeepalivePop(){runtimeKeepaliveCounter-=1}function safeSetTimeout(func,timeout){runtimeKeepalivePush();return setTimeout(function(){runtimeKeepalivePop();callUserCallback(func)},timeout)}var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",function(){finish(audio)},false);audio.onerror=function audio_onerror(event){if(done)return;out("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},handledByPreloadPlugin:function(byteArray,fullname,finish,onerror){Browser.init();var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:typeof WebGL2RenderingContext!="undefined"?2:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func){return safeSetTimeout(func)},safeRequestAnimationFrame:function(func){runtimeKeepalivePush();return Browser.requestAnimationFrame(function(){runtimeKeepalivePop();callUserCallback(func)})},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(webGLContextAttributes.renderViaOffscreenBackBuffer)webGLContextAttributes["preserveDrawingBuffer"]=true;if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},enableOffscreenFramebufferAttributes:function(webGLContextAttributes){webGLContextAttributes.renderViaOffscreenBackBuffer=true;webGLContextAttributes.preserveDrawingBuffer=true},createOffscreenFramebuffer:function(context){var gl=context.GLctx;var fbo=gl.createFramebuffer();gl.bindFramebuffer(36160,fbo);context.defaultFbo=fbo;context.defaultFboForbidBlitFramebuffer=false;if(gl.getContextAttributes().antialias){context.defaultFboForbidBlitFramebuffer=true}else{var firefoxMatch=navigator.userAgent.toLowerCase().match(/firefox\/(\d\d)/);if(firefoxMatch!=null){var firefoxVersion=firefoxMatch[1];context.defaultFboForbidBlitFramebuffer=firefoxVersion<67}}context.defaultColorTarget=gl.createTexture();context.defaultDepthTarget=gl.createRenderbuffer();GL.resizeOffscreenFramebuffer(context);gl.bindTexture(3553,context.defaultColorTarget);gl.texParameteri(3553,10241,9728);gl.texParameteri(3553,10240,9728);gl.texParameteri(3553,10242,33071);gl.texParameteri(3553,10243,33071);gl.texImage2D(3553,0,6408,gl.canvas.width,gl.canvas.height,0,6408,5121,null);gl.framebufferTexture2D(36160,36064,3553,context.defaultColorTarget,0);gl.bindTexture(3553,null);var depthTarget=gl.createRenderbuffer();gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.canvas.width,gl.canvas.height);gl.framebufferRenderbuffer(36160,36096,36161,context.defaultDepthTarget);gl.bindRenderbuffer(36161,null);var vertices=[-1,-1,-1,1,1,-1,1,1];var vb=gl.createBuffer();gl.bindBuffer(34962,vb);gl.bufferData(34962,new Float32Array(vertices),35044);gl.bindBuffer(34962,null);context.blitVB=vb;var vsCode="attribute vec2 pos;"+"varying lowp vec2 tex;"+"void main() { tex = pos * 0.5 + vec2(0.5,0.5); gl_Position = vec4(pos, 0.0, 1.0); }";var vs=gl.createShader(35633);gl.shaderSource(vs,vsCode);gl.compileShader(vs);var fsCode="varying lowp vec2 tex;"+"uniform sampler2D sampler;"+"void main() { gl_FragColor = texture2D(sampler, tex); }";var fs=gl.createShader(35632);gl.shaderSource(fs,fsCode);gl.compileShader(fs);var blitProgram=gl.createProgram();gl.attachShader(blitProgram,vs);gl.attachShader(blitProgram,fs);gl.linkProgram(blitProgram);context.blitProgram=blitProgram;context.blitPosLoc=gl.getAttribLocation(blitProgram,"pos");gl.useProgram(blitProgram);gl.uniform1i(gl.getUniformLocation(blitProgram,"sampler"),0);gl.useProgram(null);context.defaultVao=undefined;if(gl.createVertexArray){context.defaultVao=gl.createVertexArray();gl.bindVertexArray(context.defaultVao);gl.enableVertexAttribArray(context.blitPosLoc);gl.bindVertexArray(null)}},resizeOffscreenFramebuffer:function(context){var gl=context.GLctx;if(context.defaultColorTarget){var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);gl.texImage2D(3553,0,6408,gl.drawingBufferWidth,gl.drawingBufferHeight,0,6408,5121,null);gl.bindTexture(3553,prevTextureBinding)}if(context.defaultDepthTarget){var prevRenderBufferBinding=gl.getParameter(36007);gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.drawingBufferWidth,gl.drawingBufferHeight);gl.bindRenderbuffer(36161,prevRenderBufferBinding)}},blitOffscreenFramebuffer:function(context){var gl=context.GLctx;var prevScissorTest=gl.getParameter(3089);if(prevScissorTest)gl.disable(3089);var prevFbo=gl.getParameter(36006);if(gl.blitFramebuffer&&!context.defaultFboForbidBlitFramebuffer){gl.bindFramebuffer(36008,context.defaultFbo);gl.bindFramebuffer(36009,null);gl.blitFramebuffer(0,0,gl.canvas.width,gl.canvas.height,0,0,gl.canvas.width,gl.canvas.height,16384,9728)}else{gl.bindFramebuffer(36160,null);var prevProgram=gl.getParameter(35725);gl.useProgram(context.blitProgram);var prevVB=gl.getParameter(34964);gl.bindBuffer(34962,context.blitVB);var prevActiveTexture=gl.getParameter(34016);gl.activeTexture(33984);var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);var prevBlend=gl.getParameter(3042);if(prevBlend)gl.disable(3042);var prevCullFace=gl.getParameter(2884);if(prevCullFace)gl.disable(2884);var prevDepthTest=gl.getParameter(2929);if(prevDepthTest)gl.disable(2929);var prevStencilTest=gl.getParameter(2960);if(prevStencilTest)gl.disable(2960);function draw(){gl.vertexAttribPointer(context.blitPosLoc,2,5126,false,0,0);gl.drawArrays(5,0,4)}if(context.defaultVao){var prevVAO=gl.getParameter(34229);gl.bindVertexArray(context.defaultVao);draw();gl.bindVertexArray(prevVAO)}else{var prevVertexAttribPointer={buffer:gl.getVertexAttrib(context.blitPosLoc,34975),size:gl.getVertexAttrib(context.blitPosLoc,34339),stride:gl.getVertexAttrib(context.blitPosLoc,34340),type:gl.getVertexAttrib(context.blitPosLoc,34341),normalized:gl.getVertexAttrib(context.blitPosLoc,34922),pointer:gl.getVertexAttribOffset(context.blitPosLoc,34373)};var maxVertexAttribs=gl.getParameter(34921);var prevVertexAttribEnables=[];for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _emscripten_glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])}function _emscripten_glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _emscripten_glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _emscripten_glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _emscripten_glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _emscripten_glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _emscripten_glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _emscripten_glBindTransformFeedback(target,id){GLctx["bindTransformFeedback"](target,GL.transformFeedbacks[id])}function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBindVertexArrayOES(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _emscripten_glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _emscripten_glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _emscripten_glClear(x0){GLctx["clear"](x0)}function _emscripten_glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _emscripten_glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _emscripten_glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,HEAP32,value>>2)}function _emscripten_glClearBufferuiv(buffer,drawbuffer,value){GLctx["clearBufferuiv"](buffer,drawbuffer,HEAPU32,value>>2)}function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _emscripten_glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}}function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _emscripten_glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage3D(x0,x1,x2,x3,x4,x5,x6,x7,x8){GLctx["copyTexSubImage3D"](x0,x1,x2,x3,x4,x5,x6,x7,x8)}function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _emscripten_glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteTransformFeedbacks(n,ids){for(var i=0;i>2];var transformFeedback=GL.transformFeedbacks[id];if(!transformFeedback)continue;GLctx["deleteTransformFeedback"](transformFeedback);transformFeedback.name=0;GL.transformFeedbacks[id]=null}}function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedARB(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedEXT(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedNV(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var tempFixedLengthArray=[];function _emscripten_glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawBuffersEXT(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawBuffersWEBGL(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedARB(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedEXT(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedNV(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawRangeElements(mode,start,end,count,type,indices){_glDrawElements(mode,count,type,indices)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glEndQuery(x0){GLctx["endQuery"](x0)}function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}function _emscripten_glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _emscripten_glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _emscripten_glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _emscripten_glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _emscripten_glGenTransformFeedbacks(n,ids){__glGenObject(n,ids,"createTransformFeedback",GL.transformFeedbacks)}function _emscripten_glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniformBlockName(program,uniformBlockIndex,bufSize,length,uniformBlockName){program=GL.programs[program];var result=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);if(!result)return;if(uniformBlockName&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(result,uniformBlockName,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}}function _emscripten_glGetActiveUniformBlockiv(program,uniformBlockIndex,pname,params){if(!params){GL.recordError(1281);return}program=GL.programs[program];if(pname==35393){var name=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);HEAP32[params>>2]=name.length+1;return}var result=GLctx["getActiveUniformBlockParameter"](program,uniformBlockIndex,pname);if(result===null)return;if(pname==35395){for(var i=0;i>2]=result[i]}}else{HEAP32[params>>2]=result}}function _emscripten_glGetActiveUniformsiv(program,uniformCount,uniformIndices,pname,params){if(!params){GL.recordError(1281);return}if(uniformCount>0&&uniformIndices==0){GL.recordError(1281);return}program=GL.programs[program];var ids=[];for(var i=0;i>2])}var result=GLctx["getActiveUniforms"](program,ids,pname);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _emscripten_glGetBufferParameteri64v(target,value,data){if(!data){GL.recordError(1281);return}writeI53ToI64(data,GLctx.getBufferParameter(target,value))}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _emscripten_glGetFragDataLocation(program,name){return GLctx["getFragDataLocation"](GL.programs[program],UTF8ToString(name))}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function emscriptenWebGLGetIndexed(target,index,data,type){if(!data){GL.recordError(1281);return}var result=GLctx["getIndexedParameter"](target,index);var ret;switch(typeof result){case"boolean":ret=result?1:0;break;case"number":ret=result;break;case"object":if(result===null){switch(target){case 35983:case 35368:ret=0;break;default:{GL.recordError(1280);return}}}else if(result instanceof WebGLBuffer){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}switch(type){case 1:writeI53ToI64(data,ret);break;case 0:HEAP32[data>>2]=ret;break;case 2:HEAPF32[data>>2]=ret;break;case 4:HEAP8[data>>0]=ret?1:0;break;default:throw"internal emscriptenWebGLGetIndexed() error, bad type: "+type}}function _emscripten_glGetInteger64i_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,1)}function _emscripten_glGetInteger64v(name_,p){emscriptenWebGLGet(name_,p,1)}function _emscripten_glGetIntegeri_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,0)}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _emscripten_glGetInternalformativ(target,internalformat,pname,bufSize,params){if(bufSize<0){GL.recordError(1281);return}if(!params){GL.recordError(1281);return}var ret=GLctx["getInternalformatParameter"](target,internalformat,pname);if(ret===null)return;for(var i=0;i>2]=ret[i]}}function _emscripten_glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryiv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getQuery"](target,pname)}function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _emscripten_glGetSamplerParameterfv(sampler,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetSamplerParameteriv(sampler,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _emscripten_glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _emscripten_glGetSynciv(sync,pname,bufSize,length,values){if(bufSize<0){GL.recordError(1281);return}if(!values){GL.recordError(1281);return}var ret=GLctx.getSyncParameter(GL.syncs[sync],pname);if(ret!==null){HEAP32[values>>2]=ret;if(length)HEAP32[length>>2]=1}}function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTransformFeedbackVarying(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx["getTransformFeedbackVarying"](program,index);if(!info)return;if(name&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _emscripten_glGetUniformIndices(program,uniformCount,uniformNames,uniformIndices){if(!uniformIndices){GL.recordError(1281);return}if(uniformCount>0&&(uniformNames==0||uniformIndices==0)){GL.recordError(1281);return}program=GL.programs[program];var names=[];for(var i=0;i>2]));var result=GLctx["getUniformIndices"](program,names);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function emscriptenWebGLGetUniform(program,location,params,type){if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}}function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function _emscripten_glGetUniformuiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}}function _emscripten_glGetVertexAttribIiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribIuiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}function _emscripten_glInvalidateFramebuffer(target,numAttachments,attachments){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateFramebuffer"](target,list)}function _emscripten_glInvalidateSubFramebuffer(target,numAttachments,attachments,x,y,width,height){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateSubFramebuffer"](target,list,x,y,width,height)}function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}function _emscripten_glIsQuery(id){var query=GL.queries[id];if(!query)return 0;return GLctx["isQuery"](query)}function _emscripten_glIsQueryEXT(id){var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}function _emscripten_glIsSampler(id){var sampler=GL.samplers[id];if(!sampler)return 0;return GLctx["isSampler"](sampler)}function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}function _emscripten_glIsSync(sync){return GLctx.isSync(GL.syncs[sync])}function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}function _emscripten_glIsTransformFeedback(id){return GLctx["isTransformFeedback"](GL.transformFeedbacks[id])}function _emscripten_glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}function _emscripten_glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _emscripten_glPauseTransformFeedback(){GLctx["pauseTransformFeedback"]()}function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _emscripten_glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _emscripten_glProgramParameteri(program,pname,value){GL.recordError(1280)}function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)}function _emscripten_glReadBuffer(x0){GLctx["readBuffer"](x0)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _emscripten_glReleaseShaderCompiler(){}function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _emscripten_glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _emscripten_glResumeTransformFeedback(){GLctx["resumeTransformFeedback"]()}function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}function _emscripten_glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameterfv(sampler,pname,params){var param=HEAPF32[params>>2];GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteriv(sampler,pname,params){var param=HEAP32[params>>2];GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _emscripten_glShaderBinary(){GL.recordError(1280)}function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _emscripten_glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _emscripten_glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _emscripten_glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}function _emscripten_glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _emscripten_glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _emscripten_glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _emscripten_glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}var miniTempWebGLFloatBuffers=[];function _emscripten_glUniform1fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}var __miniTempWebGLIntBuffers=[];function _emscripten_glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _emscripten_glUniform1uiv(location,count,value){count&&GLctx.uniform1uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count)}function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2ui(location,v0,v1){GLctx.uniform2ui(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2uiv(location,count,value){count&&GLctx.uniform2uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*2)}function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3);return}if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3ui(location,v0,v1,v2){GLctx.uniform3ui(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3uiv(location,count,value){count&&GLctx.uniform3uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*3)}function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4);return}if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4ui(location,v0,v1,v2,v3){GLctx.uniform4ui(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4uiv(location,count,value){count&&GLctx.uniform4uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*4)}function _emscripten_glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix2x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*6)}function _emscripten_glUniformMatrix2x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*8)}function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix3x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*6)}function _emscripten_glUniformMatrix3x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*12)}function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix4x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*8)}function _emscripten_glUniformMatrix4x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*12)}function _emscripten_glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _emscripten_glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorARB(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorEXT(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorNV(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribI4i(x0,x1,x2,x3,x4){GLctx["vertexAttribI4i"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4iv(index,v){GLctx.vertexAttribI4i(index,HEAP32[v>>2],HEAP32[v+4>>2],HEAP32[v+8>>2],HEAP32[v+12>>2])}function _emscripten_glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4uiv(index,v){GLctx.vertexAttribI4ui(index,HEAPU32[v>>2],HEAPU32[v+4>>2],HEAPU32[v+8>>2],HEAPU32[v+12>>2])}function _emscripten_glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _emscripten_glWaitSync(sync,flags,timeoutLo,timeoutHi){GLctx.waitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let 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=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl&&!contextAttributes.renderViaOffscreenBackBuffer){contextAttributes.renderViaOffscreenBackBuffer=true}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}function _emscripten_webgl_destroy_context(contextHandle){if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}function _emscripten_webgl_init_context_attributes(attributes){var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1}function _emscripten_webgl_make_context_current(contextHandle){var success=GL.makeContextCurrent(contextHandle);return success?0:-5}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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 instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);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.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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}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 instanceof FS.ErrnoError))throw e;return e.errno}}function _getTempRet0(){return getTempRet0()}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _glBlendEquation(x0){GLctx["blendEquation"](x0)}function _glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _glClear(x0){GLctx["clear"](x0)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx["clearDepth"](x0)}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _glFinish(){GLctx["finish"]()}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _glGetUniformLocation(program,name){name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]}GLctx["invalidateFramebuffer"](target,list)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _glProgramParameteri(program,pname,value){GL.recordError(1280)}function _glReadBuffer(x0){GLctx["readBuffer"](x0)}function _glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}function _glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}var GodotRuntime={get_func:function(ptr){return wasmTable.get(ptr)},error:function(){err.apply(null,Array.from(arguments))},print:function(){out.apply(null,Array.from(arguments))},malloc:function(p_size){return _malloc(p_size)},free:function(p_ptr){_free(p_ptr)},getHeapValue:function(p_ptr,p_type){return getValue(p_ptr,p_type)},setHeapValue:function(p_ptr,p_value,p_type){setValue(p_ptr,p_value,p_type)},heapSub:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.subarray(p_ptr/bytes,p_ptr/bytes+p_len)},heapSlice:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.slice(p_ptr/bytes,p_ptr/bytes+p_len)},heapCopy:function(p_dst,p_src,p_ptr){const bytes=p_src.BYTES_PER_ELEMENT;return p_dst.set(p_src,p_ptr/bytes)},parseString:function(p_ptr){return UTF8ToString(p_ptr)},parseStringArray:function(p_ptr,p_size){const strings=[];const ptrs=GodotRuntime.heapSub(HEAP32,p_ptr,p_size);ptrs.forEach(function(ptr){strings.push(GodotRuntime.parseString(ptr))});return strings},strlen:function(p_str){return lengthBytesUTF8(p_str)},allocString:function(p_str){const length=GodotRuntime.strlen(p_str)+1;const c_str=GodotRuntime.malloc(length);stringToUTF8(p_str,c_str,length);return c_str},allocStringArray:function(p_strings){const size=p_strings.length;const c_ptr=GodotRuntime.malloc(size*4);for(let i=0;i>2)+i]=GodotRuntime.allocString(p_strings[i])}return c_ptr},freeStringArray:function(p_ptr,p_len){for(let i=0;i>2)+i])}GodotRuntime.free(p_ptr)},stringToHeap:function(p_str,p_ptr,p_len){return stringToUTF8Array(p_str,HEAP8,p_ptr,p_len)}};var GodotConfig={canvas:null,locale:"en",canvas_resize_policy:2,virtual_keyboard:false,persistent_drops:false,on_execute:null,on_exit:null,init_config:function(p_opts){GodotConfig.canvas_resize_policy=p_opts["canvasResizePolicy"];GodotConfig.canvas=p_opts["canvas"];GodotConfig.locale=p_opts["locale"]||GodotConfig.locale;GodotConfig.virtual_keyboard=p_opts["virtualKeyboard"];GodotConfig.persistent_drops=!!p_opts["persistentDrops"];GodotConfig.on_execute=p_opts["onExecute"];GodotConfig.on_exit=p_opts["onExit"];if(p_opts["focusCanvas"]){GodotConfig.canvas.focus()}},locate_file:function(file){return Module["locateFile"](file)},clear:function(){GodotConfig.canvas=null;GodotConfig.locale="en";GodotConfig.canvas_resize_policy=2;GodotConfig.virtual_keyboard=false;GodotConfig.persistent_drops=false;GodotConfig.on_execute=null;GodotConfig.on_exit=null}};var ERRNO_CODES={};var GodotFS={_idbfs:false,_syncing:false,_mount_points:[],is_persistent:function(){return GodotFS._idbfs?1:0},init:function(persistentPaths){GodotFS._idbfs=false;if(!Array.isArray(persistentPaths)){return Promise.reject(new Error("Persistent paths must be an array"))}if(!persistentPaths.length){return Promise.resolve()}GodotFS._mount_points=persistentPaths.slice();function createRecursive(dir){try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}}GodotFS._mount_points.forEach(function(path){createRecursive(path);FS.mount(IDBFS,{},path)});return new Promise(function(resolve,reject){FS.syncfs(true,function(err){if(err){GodotFS._mount_points=[];GodotFS._idbfs=false;GodotRuntime.print(`IndexedDB not available: ${err.message}`)}else{GodotFS._idbfs=true}resolve(err)})})},deinit:function(){GodotFS._mount_points.forEach(function(path){try{FS.unmount(path)}catch(e){GodotRuntime.print("Already unmounted",e)}if(GodotFS._idbfs&&IDBFS.dbs[path]){IDBFS.dbs[path].close();delete IDBFS.dbs[path]}});GodotFS._mount_points=[];GodotFS._idbfs=false;GodotFS._syncing=false},sync:function(){if(GodotFS._syncing){GodotRuntime.error("Already syncing!");return Promise.resolve()}GodotFS._syncing=true;return new Promise(function(resolve,reject){FS.syncfs(false,function(error){if(error){GodotRuntime.error(`Failed to save IDB file system: ${error.message}`)}GodotFS._syncing=false;resolve(error)})})},copy_to_fs:function(path,buffer){const idx=path.lastIndexOf("/");let dir="/";if(idx>0){dir=path.slice(0,idx)}try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}FS.writeFile(path,new Uint8Array(buffer))}};var GodotOS={request_quit:function(){},_async_cbs:[],_fs_sync_promise:null,atexit:function(p_promise_cb){GodotOS._async_cbs.push(p_promise_cb)},cleanup:function(exit_code){const cb=GodotConfig.on_exit;GodotFS.deinit();GodotConfig.clear();if(cb){cb(exit_code)}},finish_async:function(callback){GodotOS._fs_sync_promise.then(function(err){const promises=[];GodotOS._async_cbs.forEach(function(cb){promises.push(new Promise(cb))});return Promise.all(promises)}).then(function(){return GodotFS.sync()}).then(function(err){setTimeout(function(){callback()},0)})}};var GodotAudio={ctx:null,input:null,driver:null,interval:0,init:function(mix_rate,latency,onstatechange,onlatencyupdate){const opts={};if(mix_rate){opts["sampleRate"]=mix_rate}const ctx=new(window.AudioContext||window.webkitAudioContext)(opts);GodotAudio.ctx=ctx;ctx.onstatechange=function(){let state=0;switch(ctx.state){case"suspended":state=0;break;case"running":state=1;break;case"closed":state=2;break}onstatechange(state)};ctx.onstatechange();GodotAudio.interval=setInterval(function(){let computed_latency=0;if(ctx.baseLatency){computed_latency+=GodotAudio.ctx.baseLatency}if(ctx.outputLatency){computed_latency+=GodotAudio.ctx.outputLatency}onlatencyupdate(computed_latency)},1e3);GodotOS.atexit(GodotAudio.close_async);return ctx.destination.channelCount},create_input:function(callback){if(GodotAudio.input){return 0}function gotMediaInput(stream){try{GodotAudio.input=GodotAudio.ctx.createMediaStreamSource(stream);callback(GodotAudio.input)}catch(e){GodotRuntime.error("Failed creaating input.",e)}}if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){navigator.mediaDevices.getUserMedia({"audio":true}).then(gotMediaInput,function(e){GodotRuntime.error("Error getting user media.",e)})}else{if(!navigator.getUserMedia){navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia}if(!navigator.getUserMedia){GodotRuntime.error("getUserMedia not available.");return 1}navigator.getUserMedia({"audio":true},gotMediaInput,function(e){GodotRuntime.print(e)})}return 0},close_async:function(resolve,reject){const ctx=GodotAudio.ctx;GodotAudio.ctx=null;if(!ctx){resolve();return}if(GodotAudio.interval){clearInterval(GodotAudio.interval);GodotAudio.interval=0}if(GodotAudio.input){GodotAudio.input.disconnect();GodotAudio.input=null}let closed=Promise.resolve();if(GodotAudio.driver){closed=GodotAudio.driver.close()}closed.then(function(){return ctx.close()}).then(function(){ctx.onstatechange=null;resolve()}).catch(function(e){ctx.onstatechange=null;GodotRuntime.error("Error closing AudioContext",e);resolve()})}};function _godot_audio_capture_start(){return GodotAudio.create_input(function(input){input.connect(GodotAudio.driver.get_node())})}function _godot_audio_capture_stop(){if(GodotAudio.input){const tracks=GodotAudio.input["mediaStream"]["getTracks"]();for(let i=0;i=size){const high=size-wpos;wbuf.set(buffer.subarray(wpos,size));pending_samples-=high;wpos=0}if(pending_samples>0){wbuf.set(buffer.subarray(wpos,wpos+pending_samples),tot_sent-pending_samples)}port.postMessage({"cmd":"chunk","data":wbuf.subarray(0,tot_sent)});wpos+=pending_samples;pending_samples=0}this.receive=function(recv_buf){const buffer=GodotRuntime.heapSub(HEAPF32,p_in_buf,p_in_size);const from=rpos;let to_write=recv_buf.length;let high=0;if(rpos+to_write>=p_in_size){high=p_in_size-rpos;buffer.set(recv_buf.subarray(0,high),rpos);to_write-=high;rpos=0}if(to_write){buffer.set(recv_buf.subarray(high,to_write),rpos)}in_callback(from,recv_buf.length);rpos+=to_write};this.consumed=function(size,port){pending_samples+=size;send(port)}}GodotAudioWorklet.ring_buffer=new RingBuffer;GodotAudioWorklet.promise.then(function(){const node=GodotAudioWorklet.worklet;const buffer=GodotRuntime.heapSlice(HEAPF32,p_out_buf,p_out_size);node.connect(GodotAudio.ctx.destination);node.port.postMessage({"cmd":"start_nothreads","data":[buffer,p_in_size]});node.port.onmessage=function(event){if(!GodotAudioWorklet.worklet){return}if(event.data["cmd"]==="read"){const read=event.data["data"];GodotAudioWorklet.ring_buffer.consumed(read,GodotAudioWorklet.worklet.port)}else if(event.data["cmd"]==="input"){const buf=event.data["data"];if(buf.length>p_in_size){GodotRuntime.error("Input chunk is too big");return}GodotAudioWorklet.ring_buffer.receive(buf)}else{GodotRuntime.error(event.data)}}})},get_node:function(){return GodotAudioWorklet.worklet},close:function(){return new Promise(function(resolve,reject){if(GodotAudioWorklet.promise===null){return}GodotAudioWorklet.promise.then(function(){GodotAudioWorklet.worklet.port.postMessage({"cmd":"stop","data":null});GodotAudioWorklet.worklet.disconnect();GodotAudioWorklet.worklet=null;GodotAudioWorklet.promise=null;resolve()}).catch(function(err){})})}};function _godot_audio_worklet_create(channels){try{GodotAudioWorklet.create(channels)}catch(e){GodotRuntime.error("Error starting AudioDriverWorklet",e);return 1}return 0}function _godot_audio_worklet_start_no_threads(p_out_buf,p_out_size,p_out_callback,p_in_buf,p_in_size,p_in_callback){const out_callback=GodotRuntime.get_func(p_out_callback);const in_callback=GodotRuntime.get_func(p_in_callback);GodotAudioWorklet.start_no_threads(p_out_buf,p_out_size,out_callback,p_in_buf,p_in_size,in_callback)}function _godot_js_config_canvas_id_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(`#${GodotConfig.canvas.id}`,p_ptr,p_ptr_max)}function _godot_js_config_locale_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(GodotConfig.locale,p_ptr,p_ptr_max)}var GodotDisplayCursor={shape:"auto",visible:true,cursors:{},set_style:function(style){GodotConfig.canvas.style.cursor=style},set_shape:function(shape){GodotDisplayCursor.shape=shape;let css=shape;if(shape in GodotDisplayCursor.cursors){const c=GodotDisplayCursor.cursors[shape];css=`url("${c.url}") ${c.x} ${c.y}, auto`}if(GodotDisplayCursor.visible){GodotDisplayCursor.set_style(css)}},clear:function(){GodotDisplayCursor.set_style("");GodotDisplayCursor.shape="auto";GodotDisplayCursor.visible=true;Object.keys(GodotDisplayCursor.cursors).forEach(function(key){URL.revokeObjectURL(GodotDisplayCursor.cursors[key]);delete GodotDisplayCursor.cursors[key]})},lockPointer:function(){const canvas=GodotConfig.canvas;if(canvas.requestPointerLock){canvas.requestPointerLock()}},releasePointer:function(){if(document.exitPointerLock){document.exitPointerLock()}},isPointerLocked:function(){return document.pointerLockElement===GodotConfig.canvas}};var GodotEventListeners={handlers:[],has:function(target,event,method,capture){return GodotEventListeners.handlers.findIndex(function(e){return e.target===target&&e.event===event&&e.method===method&&e.capture===capture})!==-1},add:function(target,event,method,capture){if(GodotEventListeners.has(target,event,method,capture)){return}function Handler(p_target,p_event,p_method,p_capture){this.target=p_target;this.event=p_event;this.method=p_method;this.capture=p_capture}GodotEventListeners.handlers.push(new Handler(target,event,method,capture));target.addEventListener(event,method,capture)},clear:function(){GodotEventListeners.handlers.forEach(function(h){h.target.removeEventListener(h.event,h.method,h.capture)});GodotEventListeners.handlers.length=0}};function _emscripten_webgl_do_get_current_context(){return GL.currentContext?GL.currentContext.handle:0}function _emscripten_webgl_get_current_context(){return _emscripten_webgl_do_get_current_context()}var GodotDisplayScreen={desired_size:[0,0],hidpi:true,getPixelRatio:function(){return GodotDisplayScreen.hidpi?window.devicePixelRatio||1:1},isFullscreen:function(){const elem=document.fullscreenElement||document.mozFullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(elem){return elem===GodotConfig.canvas}return document.fullscreen||document.mozFullScreen||document.webkitIsFullscreen},hasFullscreen:function(){return document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled},requestFullscreen:function(){if(!GodotDisplayScreen.hasFullscreen()){return 1}const canvas=GodotConfig.canvas;try{const promise=(canvas.requestFullscreen||canvas.msRequestFullscreen||canvas.mozRequestFullScreen||canvas.mozRequestFullscreen||canvas.webkitRequestFullscreen).call(canvas);if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},exitFullscreen:function(){if(!GodotDisplayScreen.isFullscreen()){return 0}try{const promise=document.exitFullscreen();if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},_updateGL:function(){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){GL.resizeOffscreenFramebuffer(gl)}},updateSize:function(){const isFullscreen=GodotDisplayScreen.isFullscreen();const wantsFullWindow=GodotConfig.canvas_resize_policy===2;const noResize=GodotConfig.canvas_resize_policy===0;const wwidth=GodotDisplayScreen.desired_size[0];const wheight=GodotDisplayScreen.desired_size[1];const canvas=GodotConfig.canvas;let width=wwidth;let height=wheight;if(noResize){if(canvas.width!==width||canvas.height!==height){GodotDisplayScreen.desired_size=[canvas.width,canvas.height];GodotDisplayScreen._updateGL();return 1}return 0}const scale=GodotDisplayScreen.getPixelRatio();if(isFullscreen||wantsFullWindow){width=window.innerWidth*scale;height=window.innerHeight*scale}const csw=`${width/scale}px`;const csh=`${height/scale}px`;if(canvas.style.width!==csw||canvas.style.height!==csh||canvas.width!==width||canvas.height!==height){canvas.width=width;canvas.height=height;canvas.style.width=csw;canvas.style.height=csh;GodotDisplayScreen._updateGL();return 1}return 0}};var GodotDisplayVK={textinput:null,textarea:null,available:function(){return GodotConfig.virtual_keyboard&&"ontouchstart"in window},init:function(input_cb){function create(what){const elem=document.createElement(what);elem.style.display="none";elem.style.position="absolute";elem.style.zIndex="-1";elem.style.background="transparent";elem.style.padding="0px";elem.style.margin="0px";elem.style.overflow="hidden";elem.style.width="0px";elem.style.height="0px";elem.style.border="0px";elem.style.outline="none";elem.readonly=true;elem.disabled=true;GodotEventListeners.add(elem,"input",function(evt){const c_str=GodotRuntime.allocString(elem.value);input_cb(c_str,elem.selectionEnd);GodotRuntime.free(c_str)},false);GodotEventListeners.add(elem,"blur",function(evt){elem.style.display="none";elem.readonly=true;elem.disabled=true},false);GodotConfig.canvas.insertAdjacentElement("beforebegin",elem);return elem}GodotDisplayVK.textinput=create("input");GodotDisplayVK.textarea=create("textarea");GodotDisplayVK.updateSize()},show:function(text,multiline,start,end){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}if(GodotDisplayVK.textinput.style.display!==""||GodotDisplayVK.textarea.style.display!==""){GodotDisplayVK.hide()}GodotDisplayVK.updateSize();const elem=multiline?GodotDisplayVK.textarea:GodotDisplayVK.textinput;elem.readonly=false;elem.disabled=false;elem.value=text;elem.style.display="block";elem.focus();elem.setSelectionRange(start,end)},hide:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}[GodotDisplayVK.textinput,GodotDisplayVK.textarea].forEach(function(elem){elem.blur();elem.style.display="none";elem.value=""})},updateSize:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}const rect=GodotConfig.canvas.getBoundingClientRect();function update(elem){elem.style.left=`${rect.left}px`;elem.style.top=`${rect.top}px`;elem.style.width=`${rect.width}px`;elem.style.height=`${rect.height}px`}update(GodotDisplayVK.textinput);update(GodotDisplayVK.textarea)},clear:function(){if(GodotDisplayVK.textinput){GodotDisplayVK.textinput.remove();GodotDisplayVK.textinput=null}if(GodotDisplayVK.textarea){GodotDisplayVK.textarea.remove();GodotDisplayVK.textarea=null}}};var GodotDisplay={window_icon:"",findDPI:function(){function testDPI(dpi){return window.matchMedia(`(max-resolution: ${dpi}dpi)`).matches}function bisect(low,high,func){const mid=parseInt((high-low)/2+low,10);if(high-low<=1){return func(high)?high:low}if(func(mid)){return bisect(low,mid,func)}return bisect(mid,high,func)}try{const dpi=bisect(0,800,testDPI);return dpi>=96?dpi:96}catch(e){return 96}}};function _godot_js_display_alert(p_text){window.alert(GodotRuntime.parseString(p_text))}function _godot_js_display_canvas_focus(){GodotConfig.canvas.focus()}function _godot_js_display_canvas_is_focused(){return document.activeElement===GodotConfig.canvas}function _godot_js_display_clipboard_get(callback){const func=GodotRuntime.get_func(callback);try{navigator.clipboard.readText().then(function(result){const ptr=GodotRuntime.allocString(result);func(ptr);GodotRuntime.free(ptr)}).catch(function(e){})}catch(e){}}function _godot_js_display_clipboard_set(p_text){const text=GodotRuntime.parseString(p_text);if(!navigator.clipboard||!navigator.clipboard.writeText){return 1}navigator.clipboard.writeText(text).catch(function(e){GodotRuntime.error("Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:",e)});return 0}function _godot_js_display_cursor_is_hidden(){return!GodotDisplayCursor.visible}function _godot_js_display_cursor_is_locked(){return GodotDisplayCursor.isPointerLocked()?1:0}function _godot_js_display_cursor_lock_set(p_lock){if(p_lock){GodotDisplayCursor.lockPointer()}else{GodotDisplayCursor.releasePointer()}}function _godot_js_display_cursor_set_custom_shape(p_shape,p_ptr,p_len,p_hotspot_x,p_hotspot_y){const shape=GodotRuntime.parseString(p_shape);const old_shape=GodotDisplayCursor.cursors[shape];if(p_len>0){const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});const url=URL.createObjectURL(png);GodotDisplayCursor.cursors[shape]={url:url,x:p_hotspot_x,y:p_hotspot_y}}else{delete GodotDisplayCursor.cursors[shape]}if(shape===GodotDisplayCursor.shape){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}if(old_shape){URL.revokeObjectURL(old_shape.url)}}function _godot_js_display_cursor_set_shape(p_string){GodotDisplayCursor.set_shape(GodotRuntime.parseString(p_string))}function _godot_js_display_cursor_set_visible(p_visible){const visible=p_visible!==0;if(visible===GodotDisplayCursor.visible){return}GodotDisplayCursor.visible=visible;if(visible){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}else{GodotDisplayCursor.set_style("none")}}function _godot_js_display_desired_size_set(width,height){GodotDisplayScreen.desired_size=[width,height];GodotDisplayScreen.updateSize()}function _godot_js_display_fullscreen_cb(callback){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);function change_cb(evt){if(evt.target===canvas){func(GodotDisplayScreen.isFullscreen())}}GodotEventListeners.add(document,"fullscreenchange",change_cb,false);GodotEventListeners.add(document,"mozfullscreenchange",change_cb,false);GodotEventListeners.add(document,"webkitfullscreenchange",change_cb,false)}function _godot_js_display_fullscreen_exit(){return GodotDisplayScreen.exitFullscreen()}function _godot_js_display_fullscreen_request(){return GodotDisplayScreen.requestFullscreen()}function _godot_js_display_glGetBufferSubData(target,offset,size,data){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){gl.GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}}function _godot_js_display_has_webgl(p_version){if(p_version!==1&&p_version!==2){return false}try{return!!document.createElement("canvas").getContext(p_version===2?"webgl2":"webgl")}catch(e){}return false}function _godot_js_display_is_swap_ok_cancel(){const win=["Windows","Win64","Win32","WinCE"];const plat=navigator.platform||"";if(win.indexOf(plat)!==-1){return 1}return 0}function _godot_js_display_notification_cb(callback,p_enter,p_exit,p_in,p_out){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);const notif=[p_enter,p_exit,p_in,p_out];["mouseover","mouseleave","focus","blur"].forEach(function(evt_name,idx){GodotEventListeners.add(canvas,evt_name,function(){func(notif[idx])},true)})}function _godot_js_display_pixel_ratio_get(){return GodotDisplayScreen.getPixelRatio()}function _godot_js_display_screen_dpi_get(){return GodotDisplay.findDPI()}function _godot_js_display_screen_size_get(width,height){const scale=GodotDisplayScreen.getPixelRatio();GodotRuntime.setHeapValue(width,window.screen.width*scale,"i32");GodotRuntime.setHeapValue(height,window.screen.height*scale,"i32")}function _godot_js_display_setup_canvas(p_width,p_height,p_fullscreen,p_hidpi){const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"contextmenu",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"webglcontextlost",function(ev){alert("WebGL context lost, please reload the page");ev.preventDefault()},false);GodotDisplayScreen.hidpi=!!p_hidpi;switch(GodotConfig.canvas_resize_policy){case 0:GodotDisplayScreen.desired_size=[canvas.width,canvas.height];break;case 1:GodotDisplayScreen.desired_size=[p_width,p_height];break;default:canvas.style.position="absolute";canvas.style.top=0;canvas.style.left=0;break}GodotDisplayScreen.updateSize();if(p_fullscreen){GodotDisplayScreen.requestFullscreen()}}function _godot_js_display_size_update(){const updated=GodotDisplayScreen.updateSize();if(updated){GodotDisplayVK.updateSize()}return updated}function _godot_js_display_touchscreen_is_available(){return"ontouchstart"in window}function _godot_js_display_vk_available(){return GodotDisplayVK.available()}function _godot_js_display_vk_cb(p_input_cb){const input_cb=GodotRuntime.get_func(p_input_cb);if(GodotDisplayVK.available()){GodotDisplayVK.init(input_cb)}}function _godot_js_display_vk_hide(){GodotDisplayVK.hide()}function _godot_js_display_vk_show(p_text,p_multiline,p_start,p_end){const text=GodotRuntime.parseString(p_text);const start=p_start>0?p_start:0;const end=p_end>0?p_end:start;GodotDisplayVK.show(text,p_multiline,start,end)}function _godot_js_display_window_blur_cb(callback){const func=GodotRuntime.get_func(callback);GodotEventListeners.add(window,"blur",function(){func()},false)}function _godot_js_display_window_icon_set(p_ptr,p_len){let link=document.getElementById("-gd-engine-icon");if(link===null){link=document.createElement("link");link.rel="icon";link.id="-gd-engine-icon";document.head.appendChild(link)}const old_icon=GodotDisplay.window_icon;const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});GodotDisplay.window_icon=URL.createObjectURL(png);link.href=GodotDisplay.window_icon;if(old_icon){URL.revokeObjectURL(old_icon)}}function _godot_js_display_window_size_get(p_width,p_height){GodotRuntime.setHeapValue(p_width,GodotConfig.canvas.width,"i32");GodotRuntime.setHeapValue(p_height,GodotConfig.canvas.height,"i32")}function _godot_js_display_window_title_set(p_data){document.title=GodotRuntime.parseString(p_data)}function _godot_js_eval(p_js,p_use_global_ctx,p_union_ptr,p_byte_arr,p_byte_arr_write,p_callback){const js_code=GodotRuntime.parseString(p_js);let eval_ret=null;try{if(p_use_global_ctx){const global_eval=eval;eval_ret=global_eval(js_code)}else{eval_ret=eval(js_code)}}catch(e){GodotRuntime.error(e)}switch(typeof eval_ret){case"boolean":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"i32");return 1;case"number":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"double");return 3;case"string":GodotRuntime.setHeapValue(p_union_ptr,GodotRuntime.allocString(eval_ret),"*");return 4;case"object":if(eval_ret===null){break}if(ArrayBuffer.isView(eval_ret)&&!(eval_ret instanceof Uint8Array)){eval_ret=new Uint8Array(eval_ret.buffer)}else if(eval_ret instanceof ArrayBuffer){eval_ret=new Uint8Array(eval_ret)}if(eval_ret instanceof Uint8Array){const func=GodotRuntime.get_func(p_callback);const bytes_ptr=func(p_byte_arr,p_byte_arr_write,eval_ret.length);HEAPU8.set(eval_ret,bytes_ptr);return 20}break}return 0}var IDHandler={_last_id:0,_references:{},get:function(p_id){return IDHandler._references[p_id]},add:function(p_data){const id=++IDHandler._last_id;IDHandler._references[id]=p_data;return id},remove:function(p_id){delete IDHandler._references[p_id]}};var GodotFetch={onread:function(id,result){const obj=IDHandler.get(id);if(!obj){return}if(result.value){obj.chunks.push(result.value)}obj.reading=false;obj.done=result.done},onresponse:function(id,response){const obj=IDHandler.get(id);if(!obj){return}let chunked=false;response.headers.forEach(function(value,header){const v=value.toLowerCase().trim();const h=header.toLowerCase().trim();if(h==="transfer-encoding"&&v==="chunked"){chunked=true}});obj.status=response.status;obj.response=response;obj.reader=response.body.getReader();obj.chunked=chunked},onerror:function(id,err){GodotRuntime.error(err);const obj=IDHandler.get(id);if(!obj){return}obj.error=err},create:function(method,url,headers,body){const obj={request:null,response:null,reader:null,error:null,done:false,reading:false,status:0,chunks:[],bodySize:-1};const id=IDHandler.add(obj);const init={method:method,headers:headers,body:body};obj.request=fetch(url,init);obj.request.then(GodotFetch.onresponse.bind(null,id)).catch(GodotFetch.onerror.bind(null,id));return id},free:function(id){const obj=IDHandler.get(id);if(!obj){return}IDHandler.remove(id);if(!obj.request){return}obj.request.then(function(response){response.abort()}).catch(function(e){})},read:function(id){const obj=IDHandler.get(id);if(!obj){return}if(obj.reader&&!obj.reading){if(obj.done){obj.reader=null;return}obj.reading=true;obj.reader.read().then(GodotFetch.onread.bind(null,id)).catch(GodotFetch.onerror.bind(null,id))}}};function _godot_js_fetch_body_length_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.bodySize}function _godot_js_fetch_create(p_method,p_url,p_headers,p_headers_size,p_body,p_body_size){const method=GodotRuntime.parseString(p_method);const url=GodotRuntime.parseString(p_url);const headers=GodotRuntime.parseStringArray(p_headers,p_headers_size);const body=p_body_size?GodotRuntime.heapSlice(HEAP8,p_body,p_body_size):null;return GodotFetch.create(method,url,headers.map(function(hv){const idx=hv.indexOf(":");if(idx<=0){return[]}return[hv.slice(0,idx).trim(),hv.slice(idx+1).trim()]}).filter(function(v){return v.length===2}),body)}function _godot_js_fetch_free(id){GodotFetch.free(id)}function _godot_js_fetch_http_status_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}return obj.status}function _godot_js_fetch_is_chunked(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.chunked?1:0}function _godot_js_fetch_read_chunk(p_id,p_buf,p_buf_size){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}let to_read=p_buf_size;const chunks=obj.chunks;while(to_read&&chunks.length){const chunk=obj.chunks[0];if(chunk.length>to_read){GodotRuntime.heapCopy(HEAP8,chunk.slice(0,to_read),p_buf);chunks[0]=chunk.slice(to_read);to_read=0}else{GodotRuntime.heapCopy(HEAP8,chunk,p_buf);to_read-=chunk.length;chunks.pop()}}if(!chunks.length){GodotFetch.read(p_id)}return p_buf_size-to_read}function _godot_js_fetch_read_headers(p_id,p_parse_cb,p_ref){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 1}const cb=GodotRuntime.get_func(p_parse_cb);const arr=[];obj.response.headers.forEach(function(v,h){arr.push(`${h}:${v}`)});const c_ptr=GodotRuntime.allocStringArray(arr);cb(arr.length,c_ptr,p_ref);GodotRuntime.freeStringArray(c_ptr,arr.length);return 0}function _godot_js_fetch_state_get(p_id){const obj=IDHandler.get(p_id);if(!obj){return-1}if(obj.error){return-1}if(!obj.response){return 0}if(obj.reader){return 1}if(obj.done){return 2}return-1}var GodotInputGamepads={samples:[],get_pads:function(){try{const pads=navigator.getGamepads();if(pads){return pads}return[]}catch(e){return[]}},get_samples:function(){return GodotInputGamepads.samples},get_sample:function(index){const samples=GodotInputGamepads.samples;return index=0){os="Android"}else if(ua.indexOf("Linux")>=0){os="Linux"}else if(ua.indexOf("iPhone")>=0){os="iOS"}else if(ua.indexOf("Macintosh")>=0){os="MacOSX"}else if(ua.indexOf("Windows")>=0){os="Windows"}const id=pad.id;const exp1=/vendor: ([0-9a-f]{4}) product: ([0-9a-f]{4})/i;const exp2=/^([0-9a-f]+)-([0-9a-f]+)-/i;let vendor="";let product="";if(exp1.test(id)){const match=exp1.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}else if(exp2.test(id)){const match=exp2.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}if(!vendor||!product){return`${os}Unknown`}return os+vendor+product}};var GodotInputDragDrop={promises:[],pending_files:[],add_entry:function(entry){if(entry.isDirectory){GodotInputDragDrop.add_dir(entry)}else if(entry.isFile){GodotInputDragDrop.add_file(entry)}else{GodotRuntime.error("Unrecognized entry...",entry)}},add_dir:function(entry){GodotInputDragDrop.promises.push(new Promise(function(resolve,reject){const reader=entry.createReader();reader.readEntries(function(entries){for(let i=0;i{const path=elem["path"];GodotFS.copy_to_fs(DROP+path,elem["data"]);let idx=path.indexOf("/");if(idx===-1){drops.push(DROP+path)}else{const sub=path.substr(0,idx);idx=sub.indexOf("/");if(idx<0&&drops.indexOf(DROP+sub)===-1){drops.push(DROP+sub)}}files.push(DROP+path)});GodotInputDragDrop.promises=[];GodotInputDragDrop.pending_files=[];callback(drops);if(GodotConfig.persistent_drops){GodotOS.atexit(function(resolve,reject){GodotInputDragDrop.remove_drop(files,DROP);resolve()})}else{GodotInputDragDrop.remove_drop(files,DROP)}})},remove_drop:function(files,drop_path){const dirs=[drop_path.substr(0,drop_path.length-1)];files.forEach(function(file){FS.unlink(file);let dir=file.replace(drop_path,"");let idx=dir.lastIndexOf("/");while(idx>0){dir=dir.substr(0,idx);if(dirs.indexOf(drop_path+dir)===-1){dirs.push(drop_path+dir)}idx=dir.lastIndexOf("/")}});dirs.sort(function(a,b){const al=(a.match(/\//g)||[]).length;const bl=(b.match(/\//g)||[]).length;if(al>bl){return-1}else if(al{if(GodotWebXR.session&&GodotWebXR.space){const onFrame=function(time,frame){GodotWebXR.frame=frame;GodotWebXR.pose=frame.getViewerPose(GodotWebXR.space);callback(time);GodotWebXR.frame=null;GodotWebXR.pose=null};GodotWebXR.session.requestAnimationFrame(onFrame)}else{GodotWebXR.orig_requestAnimationFrame(callback)}},monkeyPatchRequestAnimationFrame:enable=>{if(GodotWebXR.orig_requestAnimationFrame===null){GodotWebXR.orig_requestAnimationFrame=Browser.requestAnimationFrame}Browser.requestAnimationFrame=enable?GodotWebXR.requestAnimationFrame:GodotWebXR.orig_requestAnimationFrame},pauseResumeMainLoop:()=>{Browser.mainLoop.pause();window.setTimeout(function(){Browser.mainLoop.resume()},0)},shaderProgram:null,programInfo:null,buffer:null,vsSource:"\n\t\t\tconst vec2 scale = vec2(0.5, 0.5);\n\t\t\tattribute vec4 aVertexPosition;\n\n\t\t\tvarying highp vec2 vTextureCoord;\n\n\t\t\tvoid main () {\n\t\t\t\tgl_Position = aVertexPosition;\n\t\t\t\tvTextureCoord = aVertexPosition.xy * scale + scale;\n\t\t\t}\n\t\t",fsSource:"\n\t\t\tvarying highp vec2 vTextureCoord;\n\n\t\t\tuniform sampler2D uSampler;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D(uSampler, vTextureCoord);\n\t\t\t}\n\t\t",initShaderProgram:(gl,vsSource,fsSource)=>{const vertexShader=GodotWebXR.loadShader(gl,gl.VERTEX_SHADER,vsSource);const fragmentShader=GodotWebXR.loadShader(gl,gl.FRAGMENT_SHADER,fsSource);const shaderProgram=gl.createProgram();gl.attachShader(shaderProgram,vertexShader);gl.attachShader(shaderProgram,fragmentShader);gl.linkProgram(shaderProgram);if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)){GodotRuntime.error(`Unable to initialize the shader program: ${gl.getProgramInfoLog(shaderProgram)}`);return null}return shaderProgram},loadShader:(gl,type,source)=>{const shader=gl.createShader(type);gl.shaderSource(shader,source);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){GodotRuntime.error(`An error occurred compiling the shader: ${gl.getShaderInfoLog(shader)}`);gl.deleteShader(shader);return null}return shader},initBuffer:gl=>{const positionBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);const positions=[-1,-1,1,-1,-1,1,1,1];gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW);return positionBuffer},blitTexture:(gl,texture)=>{if(GodotWebXR.shaderProgram===null){GodotWebXR.shaderProgram=GodotWebXR.initShaderProgram(gl,GodotWebXR.vsSource,GodotWebXR.fsSource);GodotWebXR.programInfo={program:GodotWebXR.shaderProgram,attribLocations:{vertexPosition:gl.getAttribLocation(GodotWebXR.shaderProgram,"aVertexPosition")},uniformLocations:{uSampler:gl.getUniformLocation(GodotWebXR.shaderProgram,"uSampler")}};GodotWebXR.buffer=GodotWebXR.initBuffer(gl)}const orig_program=gl.getParameter(gl.CURRENT_PROGRAM);gl.useProgram(GodotWebXR.shaderProgram);gl.bindBuffer(gl.ARRAY_BUFFER,GodotWebXR.buffer);gl.vertexAttribPointer(GodotWebXR.programInfo.attribLocations.vertexPosition,2,gl.FLOAT,false,0,0);gl.enableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,texture);gl.uniform1i(GodotWebXR.programInfo.uniformLocations.uSampler,0);gl.drawArrays(gl.TRIANGLE_STRIP,0,4);gl.bindTexture(gl.TEXTURE_2D,null);gl.disableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition);gl.bindBuffer(gl.ARRAY_BUFFER,null);gl.useProgram(orig_program)},controllers:[],sampleControllers:()=>{if(!GodotWebXR.session){return}let other_index=2;const controllers=[];GodotWebXR.session.inputSources.forEach(input_source=>{if(input_source.targetRayMode==="tracked-pointer"){if(input_source.handedness==="right"){controllers[1]=input_source}else if(input_source.handedness==="left"||!controllers[0]){controllers[0]=input_source}}else{controllers[other_index++]=input_source}});GodotWebXR.controllers=controllers},getControllerId:input_source=>GodotWebXR.controllers.indexOf(input_source)};function _godot_webxr_commit_for_eye(p_eye,p_texture_id){if(!GodotWebXR.session||!GodotWebXR.pose){return}const view_index=p_eye===2?1:0;const glLayer=GodotWebXR.session.renderState.baseLayer;const view=GodotWebXR.pose.views[view_index];const viewport=glLayer.getViewport(view);const gl=GodotWebXR.gl;const orig_framebuffer=gl.getParameter(gl.FRAMEBUFFER_BINDING);const orig_viewport=gl.getParameter(gl.VIEWPORT);gl.bindFramebuffer(gl.FRAMEBUFFER,glLayer.framebuffer);gl.viewport(viewport.x,viewport.y,viewport.width,viewport.height);GodotWebXR.blitTexture(gl,GL.textures[p_texture_id]);gl.bindFramebuffer(gl.FRAMEBUFFER,orig_framebuffer);gl.viewport(orig_viewport[0],orig_viewport[1],orig_viewport[2],orig_viewport[3])}function _godot_webxr_get_bounds_geometry(){if(!GodotWebXR.space||!GodotWebXR.space.boundsGeometry){return 0}const point_count=GodotWebXR.space.boundsGeometry.length;if(point_count===0){return 0}const buf=GodotRuntime.malloc((point_count*3+1)*4);GodotRuntime.setHeapValue(buf,point_count,"i32");for(let i=0;i=GodotWebXR.controllers.length){return 0}const controller=GodotWebXR.controllers[p_controller];if(!controller){return 0}switch(controller.targetRayMode){case"gaze":return 1;case"tracked-pointer":return 2;case"screen":return 3;default:break}return 0}function _godot_webxr_get_controller_transform(p_controller){if(!GodotWebXR.session||!GodotWebXR.frame){return 0}const controller=GodotWebXR.controllers[p_controller];if(!controller){return 0}const frame=GodotWebXR.frame;const space=GodotWebXR.space;const pose=frame.getPose(controller.targetRaySpace,space);if(!pose){return 0}const matrix=pose.transform.matrix;const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_projection_for_eye(p_eye){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const view_index=p_eye===2?1:0;const matrix=GodotWebXR.pose.views[view_index].projectionMatrix;const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_render_targetsize(){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const glLayer=GodotWebXR.session.renderState.baseLayer;const view=GodotWebXR.pose.views[0];const viewport=glLayer.getViewport(view);const buf=GodotRuntime.malloc(2*4);GodotRuntime.setHeapValue(buf+0,viewport.width,"i32");GodotRuntime.setHeapValue(buf+4,viewport.height,"i32");return buf}function _godot_webxr_get_transform_for_eye(p_eye){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const views=GodotWebXR.pose.views;let matrix;if(p_eye===0){matrix=GodotWebXR.pose.transform.matrix}else{matrix=views[p_eye-1].transform.matrix}const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_view_count(){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}return GodotWebXR.pose.views.length}function _godot_webxr_get_visibility_state(){if(!GodotWebXR.session||!GodotWebXR.session.visibilityState){return 0}return GodotRuntime.allocString(GodotWebXR.session.visibilityState)}function _godot_webxr_initialize(p_session_mode,p_required_features,p_optional_features,p_requested_reference_spaces,p_on_session_started,p_on_session_ended,p_on_session_failed,p_on_controller_changed,p_on_input_event,p_on_simple_event){GodotWebXR.monkeyPatchRequestAnimationFrame(true);const session_mode=GodotRuntime.parseString(p_session_mode);const required_features=GodotRuntime.parseString(p_required_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const optional_features=GodotRuntime.parseString(p_optional_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const requested_reference_space_types=GodotRuntime.parseString(p_requested_reference_spaces).split(",").map(s=>s.trim());const onstarted=GodotRuntime.get_func(p_on_session_started);const onended=GodotRuntime.get_func(p_on_session_ended);const onfailed=GodotRuntime.get_func(p_on_session_failed);const oncontroller=GodotRuntime.get_func(p_on_controller_changed);const oninputevent=GodotRuntime.get_func(p_on_input_event);const onsimpleevent=GodotRuntime.get_func(p_on_simple_event);const session_init={};if(required_features.length>0){session_init["requiredFeatures"]=required_features}if(optional_features.length>0){session_init["optionalFeatures"]=optional_features}navigator.xr.requestSession(session_mode,session_init).then(function(session){GodotWebXR.session=session;session.addEventListener("end",function(evt){onended()});session.addEventListener("inputsourceschange",function(evt){let controller_changed=false;[evt.added,evt.removed].forEach(lst=>{lst.forEach(input_source=>{if(input_source.targetRayMode==="tracked-pointer"){controller_changed=true}})});if(controller_changed){oncontroller()}});["selectstart","selectend","select","squeezestart","squeezeend","squeeze"].forEach((input_event,index)=>{session.addEventListener(input_event,function(evt){GodotWebXR.sampleControllers();oninputevent(index,GodotWebXR.getControllerId(evt.inputSource))})});session.addEventListener("visibilitychange",function(evt){const c_str=GodotRuntime.allocString("visibility_state_changed");onsimpleevent(c_str);GodotRuntime.free(c_str)});const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle).GLctx;GodotWebXR.gl=gl;gl.makeXRCompatible().then(function(){session.updateRenderState({baseLayer:new XRWebGLLayer(session,gl)});function onReferenceSpaceSuccess(reference_space,reference_space_type){GodotWebXR.space=reference_space;reference_space.onreset=function(evt){const c_str=GodotRuntime.allocString("reference_space_reset");onsimpleevent(c_str);GodotRuntime.free(c_str)};GodotWebXR.pauseResumeMainLoop();window.setTimeout(function(){const c_str=GodotRuntime.allocString(reference_space_type);onstarted(c_str);GodotRuntime.free(c_str)},0)}function requestReferenceSpace(){const reference_space_type=requested_reference_space_types.shift();session.requestReferenceSpace(reference_space_type).then(refSpace=>{onReferenceSpaceSuccess(refSpace,reference_space_type)}).catch(()=>{if(requested_reference_space_types.length===0){const c_str=GodotRuntime.allocString("Unable to get any of the requested reference space types");onfailed(c_str);GodotRuntime.free(c_str)}else{requestReferenceSpace()}})}requestReferenceSpace()}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to make WebGL context compatible with WebXR: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to start session: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}function _godot_webxr_is_controller_connected(p_controller){if(!GodotWebXR.session||!GodotWebXR.frame){return false}return!!GodotWebXR.controllers[p_controller]}function _godot_webxr_is_session_supported(p_session_mode,p_callback){const session_mode=GodotRuntime.parseString(p_session_mode);const cb=GodotRuntime.get_func(p_callback);if(navigator.xr){navigator.xr.isSessionSupported(session_mode).then(function(supported){const c_str=GodotRuntime.allocString(session_mode);cb(c_str,supported?1:0);GodotRuntime.free(c_str)})}else{const c_str=GodotRuntime.allocString(session_mode);cb(c_str,0);GodotRuntime.free(c_str)}}function _godot_webxr_is_supported(){return!!navigator.xr}function _godot_webxr_sample_controller_data(){GodotWebXR.sampleControllers()}function _godot_webxr_uninitialize(){if(GodotWebXR.session){GodotWebXR.session.end().catch(e=>{})}GodotWebXR.session=null;GodotWebXR.space=null;GodotWebXR.frame=null;GodotWebXR.pose=null;GodotWebXR.monkeyPatchRequestAnimationFrame(false);GodotWebXR.pauseResumeMainLoop()}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}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.staticInit();Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}Module["request_quit"]=function(){GodotOS.request_quit()};Module["onExit"]=GodotOS.cleanup;GodotOS._fs_sync_promise=Promise.resolve();Module["initConfig"]=GodotConfig.init_config;Module["initFS"]=GodotFS.init;Module["copyToFS"]=GodotFS.copy_to_fs;ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};GodotOS.atexit(function(resolve,reject){GodotDisplayCursor.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotEventListeners.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotDisplayVK.clear();resolve()});GodotJSWrapper.proxies=new Map;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?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 asmLibraryArg={"Xc":___call_sighandler,"Rc":___syscall__newselect,"Mc":___syscall_accept4,"Lc":___syscall_bind,"rd":___syscall_chdir,"qd":___syscall_chmod,"Kc":___syscall_connect,"sd":___syscall_faccessat,"Fa":___syscall_fcntl64,"fd":___syscall_getcwd,"Wc":___syscall_getdents64,"Jc":___syscall_getsockname,"Ic":___syscall_getsockopt,"mb":___syscall_ioctl,"Hc":___syscall_listen,"ad":___syscall_lstat64,"_c":___syscall_mkdirat,"$c":___syscall_newfstatat,"nb":___syscall_openat,"Zc":___syscall_poll,"Vc":___syscall_readlinkat,"Gc":___syscall_recvfrom,"Sc":___syscall_renameat,"Tc":___syscall_rmdir,"Fc":___syscall_sendto,"jb":___syscall_socket,"bd":___syscall_stat64,"Qc":___syscall_statfs64,"Pc":___syscall_symlink,"Uc":___syscall_unlinkat,"nd":__dlinit,"pd":__dlopen_js,"od":__dlsym_js,"Va":__emscripten_date_now,"id":__emscripten_get_now_is_monotonic,"Ec":__emscripten_throw_longjmp,"jd":__gmtime_js,"kd":__localtime_js,"md":__tzset_js,"ja":_abort,"qb":_emscripten_cancel_main_loop,"Jh":_emscripten_force_exit,"Ua":_emscripten_get_now,"yi":_emscripten_glActiveTexture,"xi":_emscripten_glAttachShader,"mf":_emscripten_glBeginQuery,"Qi":_emscripten_glBeginQueryEXT,"Ue":_emscripten_glBeginTransformFeedback,"wi":_emscripten_glBindAttribLocation,"vi":_emscripten_glBindBuffer,"Qe":_emscripten_glBindBufferBase,"Re":_emscripten_glBindBufferRange,"ui":_emscripten_glBindFramebuffer,"ti":_emscripten_glBindRenderbuffer,"Td":_emscripten_glBindSampler,"si":_emscripten_glBindTexture,"Kd":_emscripten_glBindTransformFeedback,"Ze":_emscripten_glBindVertexArray,"Hi":_emscripten_glBindVertexArrayOES,"ri":_emscripten_glBlendColor,"qi":_emscripten_glBlendEquation,"pi":_emscripten_glBlendEquationSeparate,"ni":_emscripten_glBlendFunc,"mi":_emscripten_glBlendFuncSeparate,"af":_emscripten_glBlitFramebuffer,"li":_emscripten_glBufferData,"ki":_emscripten_glBufferSubData,"ji":_emscripten_glCheckFramebufferStatus,"ii":_emscripten_glClear,"re":_emscripten_glClearBufferfi,"se":_emscripten_glClearBufferfv,"ue":_emscripten_glClearBufferiv,"te":_emscripten_glClearBufferuiv,"hi":_emscripten_glClearColor,"gi":_emscripten_glClearDepthf,"fi":_emscripten_glClearStencil,"ce":_emscripten_glClientWaitSync,"ei":_emscripten_glColorMask,"bi":_emscripten_glCompileShader,"ai":_emscripten_glCompressedTexImage2D,"rf":_emscripten_glCompressedTexImage3D,"$h":_emscripten_glCompressedTexSubImage2D,"qf":_emscripten_glCompressedTexSubImage3D,"pe":_emscripten_glCopyBufferSubData,"_h":_emscripten_glCopyTexImage2D,"Zh":_emscripten_glCopyTexSubImage2D,"sf":_emscripten_glCopyTexSubImage3D,"Yh":_emscripten_glCreateProgram,"Xh":_emscripten_glCreateShader,"Wh":_emscripten_glCullFace,"Vh":_emscripten_glDeleteBuffers,"Uh":_emscripten_glDeleteFramebuffers,"Th":_emscripten_glDeleteProgram,"of":_emscripten_glDeleteQueries,"Si":_emscripten_glDeleteQueriesEXT,"Sh":_emscripten_glDeleteRenderbuffers,"Vd":_emscripten_glDeleteSamplers,"Rh":_emscripten_glDeleteShader,"de":_emscripten_glDeleteSync,"Qh":_emscripten_glDeleteTextures,"Jd":_emscripten_glDeleteTransformFeedbacks,"Ye":_emscripten_glDeleteVertexArrays,"Gi":_emscripten_glDeleteVertexArraysOES,"Ph":_emscripten_glDepthFunc,"Oh":_emscripten_glDepthMask,"Nh":_emscripten_glDepthRangef,"Mh":_emscripten_glDetachShader,"Lh":_emscripten_glDisable,"Kh":_emscripten_glDisableVertexAttribArray,"Ih":_emscripten_glDrawArrays,"he":_emscripten_glDrawArraysInstanced,"Ci":_emscripten_glDrawArraysInstancedANGLE,"Bf":_emscripten_glDrawArraysInstancedARB,"Cf":_emscripten_glDrawArraysInstancedEXT,"td":_emscripten_glDrawArraysInstancedNV,"hf":_emscripten_glDrawBuffers,"xf":_emscripten_glDrawBuffersEXT,"Di":_emscripten_glDrawBuffersWEBGL,"Hh":_emscripten_glDrawElements,"ge":_emscripten_glDrawElementsInstanced,"Bi":_emscripten_glDrawElementsInstancedANGLE,"yf":_emscripten_glDrawElementsInstancedARB,"zf":_emscripten_glDrawElementsInstancedEXT,"Af":_emscripten_glDrawElementsInstancedNV,"vf":_emscripten_glDrawRangeElements,"Gh":_emscripten_glEnable,"Fh":_emscripten_glEnableVertexAttribArray,"lf":_emscripten_glEndQuery,"Pi":_emscripten_glEndQueryEXT,"Se":_emscripten_glEndTransformFeedback,"fe":_emscripten_glFenceSync,"Eh":_emscripten_glFinish,"Dh":_emscripten_glFlush,"Ch":_emscripten_glFramebufferRenderbuffer,"Bh":_emscripten_glFramebufferTexture2D,"_e":_emscripten_glFramebufferTextureLayer,"Ah":_emscripten_glFrontFace,"zh":_emscripten_glGenBuffers,"xh":_emscripten_glGenFramebuffers,"pf":_emscripten_glGenQueries,"Ti":_emscripten_glGenQueriesEXT,"wh":_emscripten_glGenRenderbuffers,"Wd":_emscripten_glGenSamplers,"vh":_emscripten_glGenTextures,"Id":_emscripten_glGenTransformFeedbacks,"Xe":_emscripten_glGenVertexArrays,"Fi":_emscripten_glGenVertexArraysOES,"yh":_emscripten_glGenerateMipmap,"uh":_emscripten_glGetActiveAttrib,"th":_emscripten_glGetActiveUniform,"je":_emscripten_glGetActiveUniformBlockName,"ke":_emscripten_glGetActiveUniformBlockiv,"ne":_emscripten_glGetActiveUniformsiv,"sh":_emscripten_glGetAttachedShaders,"rh":_emscripten_glGetAttribLocation,"qh":_emscripten_glGetBooleanv,"Xd":_emscripten_glGetBufferParameteri64v,"ph":_emscripten_glGetBufferParameteriv,"nh":_emscripten_glGetError,"mh":_emscripten_glGetFloatv,"Ee":_emscripten_glGetFragDataLocation,"lh":_emscripten_glGetFramebufferAttachmentParameteriv,"Yd":_emscripten_glGetInteger64i_v,"_d":_emscripten_glGetInteger64v,"Ve":_emscripten_glGetIntegeri_v,"kh":_emscripten_glGetIntegerv,"wd":_emscripten_glGetInternalformativ,"Dd":_emscripten_glGetProgramBinary,"ih":_emscripten_glGetProgramInfoLog,"jh":_emscripten_glGetProgramiv,"Ji":_emscripten_glGetQueryObjecti64vEXT,"Mi":_emscripten_glGetQueryObjectivEXT,"Ii":_emscripten_glGetQueryObjectui64vEXT,"jf":_emscripten_glGetQueryObjectuiv,"Li":_emscripten_glGetQueryObjectuivEXT,"kf":_emscripten_glGetQueryiv,"Ni":_emscripten_glGetQueryivEXT,"hh":_emscripten_glGetRenderbufferParameteriv,"Md":_emscripten_glGetSamplerParameterfv,"Nd":_emscripten_glGetSamplerParameteriv,"fh":_emscripten_glGetShaderInfoLog,"eh":_emscripten_glGetShaderPrecisionFormat,"ch":_emscripten_glGetShaderSource,"gh":_emscripten_glGetShaderiv,"bh":_emscripten_glGetString,"qe":_emscripten_glGetStringi,"Zd":_emscripten_glGetSynciv,"ah":_emscripten_glGetTexParameterfv,"$g":_emscripten_glGetTexParameteriv,"Oe":_emscripten_glGetTransformFeedbackVarying,"le":_emscripten_glGetUniformBlockIndex,"oe":_emscripten_glGetUniformIndices,"Yg":_emscripten_glGetUniformLocation,"_g":_emscripten_glGetUniformfv,"Zg":_emscripten_glGetUniformiv,"Fe":_emscripten_glGetUniformuiv,"Me":_emscripten_glGetVertexAttribIiv,"Le":_emscripten_glGetVertexAttribIuiv,"Vg":_emscripten_glGetVertexAttribPointerv,"Xg":_emscripten_glGetVertexAttribfv,"Wg":_emscripten_glGetVertexAttribiv,"Tg":_emscripten_glHint,"Ad":_emscripten_glInvalidateFramebuffer,"zd":_emscripten_glInvalidateSubFramebuffer,"Sg":_emscripten_glIsBuffer,"Rg":_emscripten_glIsEnabled,"Qg":_emscripten_glIsFramebuffer,"Pg":_emscripten_glIsProgram,"nf":_emscripten_glIsQuery,"Ri":_emscripten_glIsQueryEXT,"Og":_emscripten_glIsRenderbuffer,"Ud":_emscripten_glIsSampler,"Ng":_emscripten_glIsShader,"ee":_emscripten_glIsSync,"Mg":_emscripten_glIsTexture,"Hd":_emscripten_glIsTransformFeedback,"We":_emscripten_glIsVertexArray,"Ei":_emscripten_glIsVertexArrayOES,"Lg":_emscripten_glLineWidth,"Kg":_emscripten_glLinkProgram,"Fd":_emscripten_glPauseTransformFeedback,"Ig":_emscripten_glPixelStorei,"Hg":_emscripten_glPolygonOffset,"Cd":_emscripten_glProgramBinary,"Bd":_emscripten_glProgramParameteri,"Oi":_emscripten_glQueryCounterEXT,"wf":_emscripten_glReadBuffer,"Gg":_emscripten_glReadPixels,"Fg":_emscripten_glReleaseShaderCompiler,"Eg":_emscripten_glRenderbufferStorage,"$e":_emscripten_glRenderbufferStorageMultisample,"Ed":_emscripten_glResumeTransformFeedback,"Dg":_emscripten_glSampleCoverage,"Pd":_emscripten_glSamplerParameterf,"Od":_emscripten_glSamplerParameterfv,"Sd":_emscripten_glSamplerParameteri,"Qd":_emscripten_glSamplerParameteriv,"Cg":_emscripten_glScissor,"Bg":_emscripten_glShaderBinary,"Ag":_emscripten_glShaderSource,"zg":_emscripten_glStencilFunc,"xg":_emscripten_glStencilFuncSeparate,"wg":_emscripten_glStencilMask,"vg":_emscripten_glStencilMaskSeparate,"ug":_emscripten_glStencilOp,"tg":_emscripten_glStencilOpSeparate,"sg":_emscripten_glTexImage2D,"uf":_emscripten_glTexImage3D,"rg":_emscripten_glTexParameterf,"qg":_emscripten_glTexParameterfv,"pg":_emscripten_glTexParameteri,"og":_emscripten_glTexParameteriv,"yd":_emscripten_glTexStorage2D,"xd":_emscripten_glTexStorage3D,"mg":_emscripten_glTexSubImage2D,"tf":_emscripten_glTexSubImage3D,"Pe":_emscripten_glTransformFeedbackVaryings,"lg":_emscripten_glUniform1f,"kg":_emscripten_glUniform1fv,"jg":_emscripten_glUniform1i,"ig":_emscripten_glUniform1iv,"De":_emscripten_glUniform1ui,"ze":_emscripten_glUniform1uiv,"hg":_emscripten_glUniform2f,"gg":_emscripten_glUniform2fv,"fg":_emscripten_glUniform2i,"eg":_emscripten_glUniform2iv,"Ce":_emscripten_glUniform2ui,"ye":_emscripten_glUniform2uiv,"dg":_emscripten_glUniform3f,"ag":_emscripten_glUniform3fv,"$f":_emscripten_glUniform3i,"_f":_emscripten_glUniform3iv,"Be":_emscripten_glUniform3ui,"we":_emscripten_glUniform3uiv,"Zf":_emscripten_glUniform4f,"Yf":_emscripten_glUniform4fv,"Xf":_emscripten_glUniform4i,"Wf":_emscripten_glUniform4iv,"Ae":_emscripten_glUniform4ui,"ve":_emscripten_glUniform4uiv,"ie":_emscripten_glUniformBlockBinding,"Vf":_emscripten_glUniformMatrix2fv,"gf":_emscripten_glUniformMatrix2x3fv,"ef":_emscripten_glUniformMatrix2x4fv,"Uf":_emscripten_glUniformMatrix3fv,"ff":_emscripten_glUniformMatrix3x2fv,"cf":_emscripten_glUniformMatrix3x4fv,"Tf":_emscripten_glUniformMatrix4fv,"df":_emscripten_glUniformMatrix4x2fv,"bf":_emscripten_glUniformMatrix4x3fv,"Rf":_emscripten_glUseProgram,"Qf":_emscripten_glValidateProgram,"Pf":_emscripten_glVertexAttrib1f,"Of":_emscripten_glVertexAttrib1fv,"Nf":_emscripten_glVertexAttrib2f,"Mf":_emscripten_glVertexAttrib2fv,"Lf":_emscripten_glVertexAttrib3f,"Kf":_emscripten_glVertexAttrib3fv,"Jf":_emscripten_glVertexAttrib4f,"If":_emscripten_glVertexAttrib4fv,"Ld":_emscripten_glVertexAttribDivisor,"Ai":_emscripten_glVertexAttribDivisorANGLE,"Df":_emscripten_glVertexAttribDivisorARB,"Ef":_emscripten_glVertexAttribDivisorEXT,"ud":_emscripten_glVertexAttribDivisorNV,"Ke":_emscripten_glVertexAttribI4i,"He":_emscripten_glVertexAttribI4iv,"Je":_emscripten_glVertexAttribI4ui,"Ge":_emscripten_glVertexAttribI4uiv,"Ne":_emscripten_glVertexAttribIPointer,"Gf":_emscripten_glVertexAttribPointer,"Ff":_emscripten_glViewport,"$d":_emscripten_glWaitSync,"hd":_emscripten_memcpy_big,"Ta":_emscripten_resize_heap,"pb":_emscripten_set_main_loop,"fb":_emscripten_webgl_commit_frame,"Cc":_emscripten_webgl_create_context,"bc":_emscripten_webgl_destroy_context,"Oc":_emscripten_webgl_init_context_attributes,"xc":_emscripten_webgl_make_context_current,"dd":_environ_get,"ed":_environ_sizes_get,"ua":_fd_close,"cd":_fd_fdstat_get,"lb":_fd_read,"Ac":_fd_seek,"kb":_fd_write,"k":_getTempRet0,"Sa":_getaddrinfo,"Pb":_getnameinfo,"c":_glActiveTexture,"Na":_glAttachShader,"bb":_glBeginTransformFeedback,"vb":_glBindAttribLocation,"b":_glBindBuffer,"P":_glBindBufferBase,"e":_glBindFramebuffer,"_":_glBindRenderbuffer,"a":_glBindTexture,"m":_glBindVertexArray,"D":_glBlendEquation,"X":_glBlendFunc,"w":_glBlendFuncSeparate,"ha":_glBlitFramebuffer,"q":_glBufferData,"K":_glBufferSubData,"M":_glCheckFramebufferStatus,"J":_glClear,"qa":_glClearBufferfv,"O":_glClearColor,"aa":_glClearDepthf,"N":_glColorMask,"ka":_glCompileShader,"Ab":_glCompressedTexImage2D,"gj":_glCompressedTexSubImage2D,"zb":_glCompressedTexSubImage3D,"ej":_glCopyBufferSubData,"_a":_glCopyTexSubImage2D,"$a":_glCreateProgram,"Da":_glCreateShader,"ra":_glCullFace,"L":_glDeleteBuffers,"F":_glDeleteFramebuffers,"Q":_glDeleteProgram,"U":_glDeleteRenderbuffers,"I":_glDeleteShader,"A":_glDeleteTextures,"ea":_glDeleteVertexArrays,"Y":_glDepthFunc,"H":_glDepthMask,"i":_glDisable,"p":_glDisableVertexAttribArray,"B":_glDrawArrays,"ya":_glDrawArraysInstanced,"Ja":_glDrawBuffers,"ba":_glDrawElements,"Ka":_glDrawElementsInstanced,"s":_glEnable,"j":_glEnableVertexAttribArray,"ab":_glEndTransformFeedback,"Db":_glFinish,"Z":_glFramebufferRenderbuffer,"x":_glFramebufferTexture2D,"fj":_glFramebufferTextureLayer,"Bb":_glFrontFace,"C":_glGenBuffers,"E":_glGenFramebuffers,"ga":_glGenRenderbuffers,"v":_glGenTextures,"W":_glGenVertexArrays,"R":_glGenerateMipmap,"Cb":_glGetError,"wb":_glGetFloatv,"$":_glGetIntegerv,"Zi":_glGetProgramBinary,"tb":_glGetProgramInfoLog,"Ea":_glGetProgramiv,"Oa":_glGetShaderInfoLog,"Vi":_glGetShaderSource,"da":_glGetShaderiv,"wa":_glGetString,"dj":_glGetStringi,"Xi":_glGetUniformBlockIndex,"va":_glGetUniformLocation,"lj":_glInvalidateFramebuffer,"ub":_glLinkProgram,"la":_glPixelStorei,"bj":_glProgramBinary,"_i":_glProgramParameteri,"ia":_glReadBuffer,"cb":_glReadPixels,"fa":_glRenderbufferStorage,"Ga":_glRenderbufferStorageMultisample,"T":_glScissor,"Pa":_glShaderSource,"r":_glTexImage2D,"Ia":_glTexImage3D,"g":_glTexParameterf,"d":_glTexParameteri,"ij":_glTexStorage2D,"Ha":_glTexSubImage2D,"Qa":_glTexSubImage3D,"$i":_glTransformFeedbackVaryings,"f":_glUniform1f,"u":_glUniform1i,"db":_glUniform1iv,"xb":_glUniform1ui,"Za":_glUniform2f,"n":_glUniform2fv,"Ca":_glUniform2i,"ma":_glUniform2iv,"Ya":_glUniform3f,"V":_glUniform3fv,"Ba":_glUniform3i,"xa":_glUniform4f,"y":_glUniform4fv,"Aa":_glUniform4i,"Wi":_glUniformBlockBinding,"sb":_glUniformMatrix2fv,"rb":_glUniformMatrix3fv,"o":_glUniformMatrix4fv,"pa":_glUseProgram,"z":_glVertexAttrib4f,"S":_glVertexAttrib4fv,"G":_glVertexAttribDivisor,"pj":_glVertexAttribI4ui,"La":_glVertexAttribIPointer,"h":_glVertexAttribPointer,"t":_glViewport,"di":_godot_audio_capture_start,"cg":_godot_audio_capture_stop,"be":_godot_audio_has_script_processor,"dc":_godot_audio_has_worklet,"bk":_godot_audio_init,"ck":_godot_audio_is_available,"kj":_godot_audio_resume,"yc":_godot_audio_script_create,"nc":_godot_audio_script_start,"Ub":_godot_audio_worklet_create,"ak":_godot_audio_worklet_start_no_threads,"Sb":_godot_js_config_canvas_id_get,"dh":_godot_js_config_locale_get,"_b":_godot_js_display_alert,"me":_godot_js_display_canvas_focus,"xe":_godot_js_display_canvas_is_focused,"ld":_godot_js_display_clipboard_get,"vd":_godot_js_display_clipboard_set,"Te":_godot_js_display_cursor_is_hidden,"Ie":_godot_js_display_cursor_is_locked,"Wa":_godot_js_display_cursor_lock_set,"ob":_godot_js_display_cursor_set_custom_shape,"Hf":_godot_js_display_cursor_set_shape,"Xa":_godot_js_display_cursor_set_visible,"yg":_godot_js_display_desired_size_set,"oc":_godot_js_display_fullscreen_cb,"Sf":_godot_js_display_fullscreen_exit,"bg":_godot_js_display_fullscreen_request,"Rj":_godot_js_display_glGetBufferSubData,"ib":_godot_js_display_has_webgl,"Yc":_godot_js_display_is_swap_ok_cancel,"lc":_godot_js_display_notification_cb,"cc":_godot_js_display_pixel_ratio_get,"ec":_godot_js_display_screen_dpi_get,"Jg":_godot_js_display_screen_size_get,"gd":_godot_js_display_setup_canvas,"Ug":_godot_js_display_size_update,"ae":_godot_js_display_touchscreen_is_available,"jc":_godot_js_display_vk_available,"kc":_godot_js_display_vk_cb,"hc":_godot_js_display_vk_hide,"ic":_godot_js_display_vk_show,"mc":_godot_js_display_window_blur_cb,"Yb":_godot_js_display_window_icon_set,"ng":_godot_js_display_window_size_get,"Zb":_godot_js_display_window_title_set,"zi":_godot_js_eval,"qj":_godot_js_fetch_body_length_get,"Aj":_godot_js_fetch_create,"Jb":_godot_js_fetch_free,"nj":_godot_js_fetch_http_status_get,"rj":_godot_js_fetch_is_chunked,"oj":_godot_js_fetch_read_chunk,"mj":_godot_js_fetch_read_headers,"eb":_godot_js_fetch_state_get,"pc":_godot_js_input_drop_files_cb,"rc":_godot_js_input_gamepad_cb,"fc":_godot_js_input_gamepad_sample,"Rd":_godot_js_input_gamepad_sample_count,"Gd":_godot_js_input_gamepad_sample_get,"sc":_godot_js_input_key_cb,"wc":_godot_js_input_mouse_button_cb,"vc":_godot_js_input_mouse_move_cb,"uc":_godot_js_input_mouse_wheel_cb,"qc":_godot_js_input_paste_cb,"tc":_godot_js_input_touch_cb,"Wb":_godot_js_input_vibrate_handheld,"oi":_godot_js_os_download_buffer,"ac":_godot_js_os_execute,"oh":_godot_js_os_finish_async,"Rb":_godot_js_os_fs_is_persistent,"gc":_godot_js_os_fs_sync,"$b":_godot_js_os_hw_concurrency_get,"Tb":_godot_js_os_request_quit_cb,"Xb":_godot_js_os_shell_open,"Qb":_godot_js_pwa_cb,"Vb":_godot_js_pwa_update,"Ob":_godot_js_rtc_datachannel_close,"Vj":_godot_js_rtc_datachannel_connect,"Sj":_godot_js_rtc_datachannel_destroy,"Wj":_godot_js_rtc_datachannel_get_buffered_amount,"_j":_godot_js_rtc_datachannel_id_get,"Xj":_godot_js_rtc_datachannel_is_negotiated,"$j":_godot_js_rtc_datachannel_is_ordered,"Uj":_godot_js_rtc_datachannel_label_get,"Zj":_godot_js_rtc_datachannel_max_packet_lifetime_get,"Yj":_godot_js_rtc_datachannel_max_retransmits_get,"Tj":_godot_js_rtc_datachannel_protocol_get,"Nb":_godot_js_rtc_datachannel_ready_state_get,"Mb":_godot_js_rtc_datachannel_send,"Qj":_godot_js_rtc_pc_close,"Lj":_godot_js_rtc_pc_create,"Kj":_godot_js_rtc_pc_datachannel_create,"Lb":_godot_js_rtc_pc_destroy,"Mj":_godot_js_rtc_pc_ice_candidate_add,"Oj":_godot_js_rtc_pc_local_description_set,"Pj":_godot_js_rtc_pc_offer_create,"Nj":_godot_js_rtc_pc_remote_description_set,"Kb":_godot_js_websocket_buffered_amount,"Ij":_godot_js_websocket_close,"Hj":_godot_js_websocket_create,"Ib":_godot_js_websocket_destroy,"Jj":_godot_js_websocket_send,"Yi":_godot_js_wrapper_create_cb,"Ki":_godot_js_wrapper_create_object,"Ui":_godot_js_wrapper_interface_get,"aj":_godot_js_wrapper_object_call,"hj":_godot_js_wrapper_object_get,"yb":_godot_js_wrapper_object_getvar,"jj":_godot_js_wrapper_object_set,"cj":_godot_js_wrapper_object_setvar,"ci":_godot_js_wrapper_object_unref,"vj":_godot_webxr_commit_for_eye,"Ej":_godot_webxr_get_bounds_geometry,"Fb":_godot_webxr_get_controller_axes,"sj":_godot_webxr_get_controller_buttons,"uj":_godot_webxr_get_controller_count,"Ra":_godot_webxr_get_controller_target_ray_mode,"tj":_godot_webxr_get_controller_transform,"wj":_godot_webxr_get_projection_for_eye,"yj":_godot_webxr_get_render_targetsize,"xj":_godot_webxr_get_transform_for_eye,"Dj":_godot_webxr_get_view_count,"Fj":_godot_webxr_get_visibility_state,"Bj":_godot_webxr_initialize,"Gb":_godot_webxr_is_controller_connected,"Gj":_godot_webxr_is_session_supported,"Cj":_godot_webxr_is_supported,"Hb":_godot_webxr_sample_controller_data,"zj":_godot_webxr_uninitialize,"za":invoke_ii,"na":invoke_iii,"gb":invoke_iiii,"hb":invoke_iiiii,"Dc":invoke_iiiiii,"Bc":invoke_iiiiiii,"zc":invoke_iij,"ca":invoke_vi,"oa":invoke_vii,"ta":invoke_viii,"sa":invoke_viiii,"Ma":invoke_viiiiiii,"l":_setTempRet0,"Eb":_strftime,"Nc":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["ek"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["fk"]).apply(null,arguments)};var __Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=function(){return(__Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=Module["asm"]["gk"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["hk"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["ik"]).apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return(_htonl=Module["_htonl"]=Module["asm"]["jk"]).apply(null,arguments)};var _htons=Module["_htons"]=function(){return(_htons=Module["_htons"]=Module["asm"]["kk"]).apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return(_ntohs=Module["_ntohs"]=Module["asm"]["lk"]).apply(null,arguments)};var _fflush=Module["_fflush"]=function(){return(_fflush=Module["_fflush"]=Module["asm"]["mk"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["nk"]).apply(null,arguments)};var __emwebxr_on_input_event=Module["__emwebxr_on_input_event"]=function(){return(__emwebxr_on_input_event=Module["__emwebxr_on_input_event"]=Module["asm"]["ok"]).apply(null,arguments)};var __emwebxr_on_simple_event=Module["__emwebxr_on_simple_event"]=function(){return(__emwebxr_on_simple_event=Module["__emwebxr_on_simple_event"]=Module["asm"]["pk"]).apply(null,arguments)};var ___funcs_on_exit=Module["___funcs_on_exit"]=function(){return(___funcs_on_exit=Module["___funcs_on_exit"]=Module["asm"]["qk"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["sk"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["tk"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["uk"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["vk"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["wk"]).apply(null,arguments)};function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iij(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iij(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["cwrap"]=cwrap;Module["callMain"]=callMain;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach(arg=>{HEAP32[argv_ptr++]=allocateUTF8OnStack(arg)});HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exit(ret,true);return ret}catch(e){return handleException(e)}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!keepRuntimeAlive()){exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=false;if(Module["noInitialRun"])shouldRunNow=false;run(); + + + return Godot.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Godot; +else if (typeof define === 'function' && define['amd']) + define([], function() { return Godot; }); +else if (typeof exports === 'object') + exports["Godot"] = Godot; + +const Preloader = /** @constructor */ function () { // eslint-disable-line no-unused-vars + function getTrackedResponse(response, load_status) { + function onloadprogress(reader, controller) { + return reader.read().then(function (result) { + if (load_status.done) { + return Promise.resolve(); + } + if (result.value) { + controller.enqueue(result.value); + load_status.loaded += result.value.length; + } + if (!result.done) { + return onloadprogress(reader, controller); + } + load_status.done = true; + return Promise.resolve(); + }); + } + const reader = response.body.getReader(); + return new Response(new ReadableStream({ + start: function (controller) { + onloadprogress(reader, controller).then(function () { + controller.close(); + }); + }, + }), { headers: response.headers }); + } + + function loadFetch(file, tracker, fileSize, raw) { + tracker[file] = { + total: fileSize || 0, + loaded: 0, + done: false, + }; + return fetch(file).then(function (response) { + if (!response.ok) { + return Promise.reject(new Error(`Failed loading file '${file}'`)); + } + const tr = getTrackedResponse(response, tracker[file]); + if (raw) { + return Promise.resolve(tr); + } + return tr.arrayBuffer(); + }); + } + + function retry(func, attempts = 1) { + function onerror(err) { + if (attempts <= 1) { + return Promise.reject(err); + } + return new Promise(function (resolve, reject) { + setTimeout(function () { + retry(func, attempts - 1).then(resolve).catch(reject); + }, 1000); + }); + } + return func().catch(onerror); + } + + const DOWNLOAD_ATTEMPTS_MAX = 4; + const loadingFiles = {}; + const lastProgress = { loaded: 0, total: 0 }; + let progressFunc = null; + + const animateProgress = function () { + let loaded = 0; + let total = 0; + let totalIsValid = true; + let progressIsFinal = true; + + Object.keys(loadingFiles).forEach(function (file) { + const stat = loadingFiles[file]; + if (!stat.done) { + progressIsFinal = false; + } + if (!totalIsValid || stat.total === 0) { + totalIsValid = false; + total = 0; + } else { + total += stat.total; + } + loaded += stat.loaded; + }); + if (loaded !== lastProgress.loaded || total !== lastProgress.total) { + lastProgress.loaded = loaded; + lastProgress.total = total; + if (typeof progressFunc === 'function') { + progressFunc(loaded, total); + } + } + if (!progressIsFinal) { + requestAnimationFrame(animateProgress); + } + }; + + this.animateProgress = animateProgress; + + this.setProgressFunc = function (callback) { + progressFunc = callback; + }; + + this.loadPromise = function (file, fileSize, raw = false) { + return retry(loadFetch.bind(null, file, loadingFiles, fileSize, raw), DOWNLOAD_ATTEMPTS_MAX); + }; + + this.preloadedFiles = []; + this.preload = function (pathOrBuffer, destPath, fileSize) { + let buffer = null; + if (typeof pathOrBuffer === 'string') { + const me = this; + return this.loadPromise(pathOrBuffer, fileSize).then(function (buf) { + me.preloadedFiles.push({ + path: destPath || pathOrBuffer, + buffer: buf, + }); + return Promise.resolve(); + }); + } else if (pathOrBuffer instanceof ArrayBuffer) { + buffer = new Uint8Array(pathOrBuffer); + } else if (ArrayBuffer.isView(pathOrBuffer)) { + buffer = new Uint8Array(pathOrBuffer.buffer); + } + if (buffer) { + this.preloadedFiles.push({ + path: destPath, + buffer: pathOrBuffer, + }); + return Promise.resolve(); + } + return Promise.reject(new Error('Invalid object for preloading')); + }; +}; + +/** + * An object used to configure the Engine instance based on godot export options, and to override those in custom HTML + * templates if needed. + * + * @header Engine configuration + * @summary The Engine configuration object. This is just a typedef, create it like a regular object, e.g.: + * + * ``const MyConfig = { executable: 'godot', unloadAfterInit: false }`` + * + * @typedef {Object} EngineConfig + */ +const EngineConfig = {}; // eslint-disable-line no-unused-vars + +/** + * @struct + * @constructor + * @ignore + */ +const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-vars + const cfg = /** @lends {InternalConfig.prototype} */ { + /** + * Whether the unload the engine automatically after the instance is initialized. + * + * @memberof EngineConfig + * @default + * @type {boolean} + */ + unloadAfterInit: true, + /** + * The HTML DOM Canvas object to use. + * + * By default, the first canvas element in the document will be used is none is specified. + * + * @memberof EngineConfig + * @default + * @type {?HTMLCanvasElement} + */ + canvas: null, + /** + * The name of the WASM file without the extension. (Set by Godot Editor export process). + * + * @memberof EngineConfig + * @default + * @type {string} + */ + executable: '', + /** + * An alternative name for the game pck to load. The executable name is used otherwise. + * + * @memberof EngineConfig + * @default + * @type {?string} + */ + mainPack: null, + /** + * Specify a language code to select the proper localization for the game. + * + * The browser locale will be used if none is specified. See complete list of + * :ref:`supported locales `. + * + * @memberof EngineConfig + * @type {?string} + * @default + */ + locale: null, + /** + * The canvas resize policy determines how the canvas should be resized by Godot. + * + * ``0`` means Godot won't do any resizing. This is useful if you want to control the canvas size from + * javascript code in your template. + * + * ``1`` means Godot will resize the canvas on start, and when changing window size via engine functions. + * + * ``2`` means Godot will adapt the canvas size to match the whole browser window. + * + * @memberof EngineConfig + * @type {number} + * @default + */ + canvasResizePolicy: 2, + /** + * The arguments to be passed as command line arguments on startup. + * + * See :ref:`command line tutorial `. + * + * **Note**: :js:meth:`startGame ` will always add the ``--main-pack`` argument. + * + * @memberof EngineConfig + * @type {Array} + * @default + */ + args: [], + /** + * When enabled, the game canvas will automatically grab the focus when the engine starts. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + focusCanvas: true, + /** + * When enabled, this will turn on experimental virtual keyboard support on mobile. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + experimentalVK: false, + /** + * The progressive web app service worker to install. + * @memberof EngineConfig + * @default + * @type {string} + */ + serviceWorker: '', + /** + * @ignore + * @type {Array.} + */ + persistentPaths: ['/userfs'], + /** + * @ignore + * @type {boolean} + */ + persistentDrops: false, + /** + * @ignore + * @type {Array.} + */ + gdnativeLibs: [], + /** + * @ignore + * @type {Array.} + */ + fileSizes: [], + /** + * A callback function for handling Godot's ``OS.execute`` calls. + * + * This is for example used in the Web Editor template to switch between project manager and editor, and for running the game. + * + * @callback EngineConfig.onExecute + * @param {string} path The path that Godot's wants executed. + * @param {Array.} args The arguments of the "command" to execute. + */ + /** + * @ignore + * @type {?function(string, Array.)} + */ + onExecute: null, + /** + * A callback function for being notified when the Godot instance quits. + * + * **Note**: This function will not be called if the engine crashes or become unresponsive. + * + * @callback EngineConfig.onExit + * @param {number} status_code The status code returned by Godot on exit. + */ + /** + * @ignore + * @type {?function(number)} + */ + onExit: null, + /** + * A callback function for displaying download progress. + * + * The function is called once per frame while downloading files, so the usage of ``requestAnimationFrame()`` + * is not necessary. + * + * If the callback function receives a total amount of bytes as 0, this means that it is impossible to calculate. + * Possible reasons include: + * + * - Files are delivered with server-side chunked compression + * - Files are delivered with server-side compression on Chromium + * - Not all file downloads have started yet (usually on servers without multi-threading) + * + * @callback EngineConfig.onProgress + * @param {number} current The current amount of downloaded bytes so far. + * @param {number} total The total amount of bytes to be downloaded. + */ + /** + * @ignore + * @type {?function(number, number)} + */ + onProgress: null, + /** + * A callback function for handling the standard output stream. This method should usually only be used in debug pages. + * + * By default, ``console.log()`` is used. + * + * @callback EngineConfig.onPrint + * @param {...*} [var_args] A variadic number of arguments to be printed. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrint: function () { + console.log.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + /** + * A callback function for handling the standard error stream. This method should usually only be used in debug pages. + * + * By default, ``console.error()`` is used. + * + * @callback EngineConfig.onPrintError + * @param {...*} [var_args] A variadic number of arguments to be printed as errors. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrintError: function (var_args) { + console.error.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + }; + + /** + * @ignore + * @struct + * @constructor + * @param {EngineConfig} opts + */ + function Config(opts) { + this.update(opts); + } + + Config.prototype = cfg; + + /** + * @ignore + * @param {EngineConfig} opts + */ + Config.prototype.update = function (opts) { + const config = opts || {}; + // NOTE: We must explicitly pass the default, accessing it via + // the key will fail due to closure compiler renames. + function parse(key, def) { + if (typeof (config[key]) === 'undefined') { + return def; + } + return config[key]; + } + // Module config + this.unloadAfterInit = parse('unloadAfterInit', this.unloadAfterInit); + this.onPrintError = parse('onPrintError', this.onPrintError); + this.onPrint = parse('onPrint', this.onPrint); + this.onProgress = parse('onProgress', this.onProgress); + + // Godot config + this.canvas = parse('canvas', this.canvas); + this.executable = parse('executable', this.executable); + this.mainPack = parse('mainPack', this.mainPack); + this.locale = parse('locale', this.locale); + this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy); + this.persistentPaths = parse('persistentPaths', this.persistentPaths); + this.persistentDrops = parse('persistentDrops', this.persistentDrops); + this.experimentalVK = parse('experimentalVK', this.experimentalVK); + this.focusCanvas = parse('focusCanvas', this.focusCanvas); + this.serviceWorker = parse('serviceWorker', this.serviceWorker); + this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs); + this.fileSizes = parse('fileSizes', this.fileSizes); + this.args = parse('args', this.args); + this.onExecute = parse('onExecute', this.onExecute); + this.onExit = parse('onExit', this.onExit); + }; + + /** + * @ignore + * @param {string} loadPath + * @param {Response} response + */ + Config.prototype.getModuleConfig = function (loadPath, response) { + let r = response; + return { + 'print': this.onPrint, + 'printErr': this.onPrintError, + 'thisProgram': this.executable, + 'noExitRuntime': true, + 'dynamicLibraries': [`${loadPath}.side.wasm`], + 'instantiateWasm': function (imports, onSuccess) { + function done(result) { + onSuccess(result['instance'], result['module']); + } + if (typeof (WebAssembly.instantiateStreaming) !== 'undefined') { + WebAssembly.instantiateStreaming(Promise.resolve(r), imports).then(done); + } else { + r.arrayBuffer().then(function (buffer) { + WebAssembly.instantiate(buffer, imports).then(done); + }); + } + r = null; + return {}; + }, + 'locateFile': function (path) { + if (path.endsWith('.worker.js')) { + return `${loadPath}.worker.js`; + } else if (path.endsWith('.audio.worklet.js')) { + return `${loadPath}.audio.worklet.js`; + } else if (path.endsWith('.js')) { + return `${loadPath}.js`; + } else if (path.endsWith('.side.wasm')) { + return `${loadPath}.side.wasm`; + } else if (path.endsWith('.wasm')) { + return `${loadPath}.wasm`; + } + return path; + }, + }; + }; + + /** + * @ignore + * @param {function()} cleanup + */ + Config.prototype.getGodotConfig = function (cleanup) { + // Try to find a canvas + if (!(this.canvas instanceof HTMLCanvasElement)) { + const nodes = document.getElementsByTagName('canvas'); + if (nodes.length && nodes[0] instanceof HTMLCanvasElement) { + this.canvas = nodes[0]; + } + if (!this.canvas) { + throw new Error('No canvas found in page'); + } + } + // Canvas can grab focus on click, or key events won't work. + if (this.canvas.tabIndex < 0) { + this.canvas.tabIndex = 0; + } + + // Browser locale, or custom one if defined. + let locale = this.locale; + if (!locale) { + locale = navigator.languages ? navigator.languages[0] : navigator.language; + locale = locale.split('.')[0]; + } + locale = locale.replace('-', '_'); + const onExit = this.onExit; + + // Godot configuration. + return { + 'canvas': this.canvas, + 'canvasResizePolicy': this.canvasResizePolicy, + 'locale': locale, + 'persistentDrops': this.persistentDrops, + 'virtualKeyboard': this.experimentalVK, + 'focusCanvas': this.focusCanvas, + 'onExecute': this.onExecute, + 'onExit': function (p_code) { + cleanup(); // We always need to call the cleanup callback to free memory. + if (typeof (onExit) === 'function') { + onExit(p_code); + } + }, + }; + }; + return new Config(initConfig); +}; + +/** + * Projects exported for the Web expose the :js:class:`Engine` class to the JavaScript environment, that allows + * fine control over the engine's start-up process. + * + * This API is built in an asynchronous manner and requires basic understanding + * of `Promises `__. + * + * @module Engine + * @header HTML5 shell class reference + */ +const Engine = (function () { + const preloader = new Preloader(); + + let loadPromise = null; + let loadPath = ''; + let initPromise = null; + + /** + * @classdesc The ``Engine`` class provides methods for loading and starting exported projects on the Web. For default export + * settings, this is already part of the exported HTML page. To understand practical use of the ``Engine`` class, + * see :ref:`Custom HTML page for Web export `. + * + * @description Create a new Engine instance with the given configuration. + * + * @global + * @constructor + * @param {EngineConfig} initConfig The initial config for this instance. + */ + function Engine(initConfig) { // eslint-disable-line no-shadow + this.config = new InternalConfig(initConfig); + this.rtenv = null; + } + + /** + * Load the engine from the specified base path. + * + * @param {string} basePath Base path of the engine to load. + * @param {number=} [size=0] The file size if known. + * @returns {Promise} A Promise that resolves once the engine is loaded. + * + * @function Engine.load + */ + Engine.load = function (basePath, size) { + if (loadPromise == null) { + loadPath = basePath; + loadPromise = preloader.loadPromise(`${loadPath}.wasm`, size, true); + requestAnimationFrame(preloader.animateProgress); + } + return loadPromise; + }; + + /** + * Unload the engine to free memory. + * + * This method will be called automatically depending on the configuration. See :js:attr:`unloadAfterInit`. + * + * @function Engine.unload + */ + Engine.unload = function () { + loadPromise = null; + }; + + /** + * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. + * + * @param {number=} [majorVersion=1] The major WebGL version to check for. + * @returns {boolean} If the given major version of WebGL is available. + * @function Engine.isWebGLAvailable + */ + Engine.isWebGLAvailable = function (majorVersion = 1) { + try { + return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); + } catch (e) { /* Not available */ } + return false; + }; + + /** + * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution. + * @ignore + * @constructor + */ + function SafeEngine(initConfig) { + const proto = /** @lends Engine.prototype */ { + /** + * Initialize the engine instance. Optionally, pass the base path to the engine to load it, + * if it hasn't been loaded yet. See :js:meth:`Engine.load`. + * + * @param {string=} basePath Base path of the engine to load. + * @return {Promise} A ``Promise`` that resolves once the engine is loaded and initialized. + */ + init: function (basePath) { + if (initPromise) { + return initPromise; + } + if (loadPromise == null) { + if (!basePath) { + initPromise = Promise.reject(new Error('A base path must be provided when calling `init` and the engine is not loaded.')); + return initPromise; + } + Engine.load(basePath, this.config.fileSizes[`${basePath}.wasm`]); + } + const me = this; + function doInit(promise) { + // Care! Promise chaining is bogus with old emscripten versions. + // This caused a regression with the Mono build (which uses an older emscripten version). + // Make sure to test that when refactoring. + return new Promise(function (resolve, reject) { + promise.then(function (response) { + const cloned = new Response(response.clone().body, { 'headers': [['content-type', 'application/wasm']] }); + Godot(me.config.getModuleConfig(loadPath, cloned)).then(function (module) { + const paths = me.config.persistentPaths; + module['initFS'](paths).then(function (err) { + me.rtenv = module; + if (me.config.unloadAfterInit) { + Engine.unload(); + } + resolve(); + }); + }); + }); + }); + } + preloader.setProgressFunc(this.config.onProgress); + initPromise = doInit(loadPromise); + return initPromise; + }, + + /** + * Load a file so it is available in the instance's file system once it runs. Must be called **before** starting the + * instance. + * + * If not provided, the ``path`` is derived from the URL of the loaded file. + * + * @param {string|ArrayBuffer} file The file to preload. + * + * If a ``string`` the file will be loaded from that path. + * + * If an ``ArrayBuffer`` or a view on one, the buffer will used as the content of the file. + * + * @param {string=} path Path by which the file will be accessible. Required, if ``file`` is not a string. + * + * @returns {Promise} A Promise that resolves once the file is loaded. + */ + preloadFile: function (file, path) { + return preloader.preload(file, path, this.config.fileSizes[file]); + }, + + /** + * Start the engine instance using the given override configuration (if any). + * :js:meth:`startGame ` can be used in typical cases instead. + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * The engine must be loaded beforehand. + * + * Fails if a canvas cannot be found on the page, or not specified in the configuration. + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the engine started. + */ + start: function (override) { + this.config.update(override); + const me = this; + return me.init().then(function () { + if (!me.rtenv) { + return Promise.reject(new Error('The engine must be initialized before it can be started')); + } + + let config = {}; + try { + config = me.config.getGodotConfig(function () { + me.rtenv = null; + }); + } catch (e) { + return Promise.reject(e); + } + // Godot configuration. + me.rtenv['initConfig'](config); + + // Preload GDNative libraries. + const libs = []; + me.config.gdnativeLibs.forEach(function (lib) { + libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true })); + }); + return Promise.all(libs).then(function () { + return new Promise(function (resolve, reject) { + preloader.preloadedFiles.forEach(function (file) { + me.rtenv['copyToFS'](file.path, file.buffer); + }); + preloader.preloadedFiles.length = 0; // Clear memory + me.rtenv['callMain'](me.config.args); + initPromise = null; + if (me.config.serviceWorker && 'serviceWorker' in navigator) { + navigator.serviceWorker.register(me.config.serviceWorker); + } + resolve(); + }); + }); + }); + }, + + /** + * Start the game instance using the given configuration override (if any). + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * + * This will load the engine if it is not loaded, and preload the main pck. + * + * This method expects the initial config (or the override) to have both the :js:attr:`executable` and :js:attr:`mainPack` + * properties set (normally done by the editor during export). + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the game started. + */ + startGame: function (override) { + this.config.update(override); + // Add main-pack argument. + const exe = this.config.executable; + const pack = this.config.mainPack || `${exe}.pck`; + this.config.args = ['--main-pack', pack].concat(this.config.args); + // Start and init with execName as loadPath if not inited. + const me = this; + return Promise.all([ + this.init(exe), + this.preloadFile(pack, pack), + ]).then(function () { + return me.start.apply(me); + }); + }, + + /** + * Create a file at the specified ``path`` with the passed as ``buffer`` in the instance's file system. + * + * @param {string} path The location where the file will be created. + * @param {ArrayBuffer} buffer The content of the file. + */ + copyToFS: function (path, buffer) { + if (this.rtenv == null) { + throw new Error('Engine must be inited before copying files'); + } + this.rtenv['copyToFS'](path, buffer); + }, + + /** + * Request that the current instance quit. + * + * This is akin the user pressing the close button in the window manager, and will + * have no effect if the engine has crashed, or is stuck in a loop. + * + */ + requestQuit: function () { + if (this.rtenv) { + this.rtenv['request_quit'](); + } + }, + }; + + Engine.prototype = proto; + // Closure compiler exported instance methods. + Engine.prototype['init'] = Engine.prototype.init; + Engine.prototype['preloadFile'] = Engine.prototype.preloadFile; + Engine.prototype['start'] = Engine.prototype.start; + Engine.prototype['startGame'] = Engine.prototype.startGame; + Engine.prototype['copyToFS'] = Engine.prototype.copyToFS; + Engine.prototype['requestQuit'] = Engine.prototype.requestQuit; + // Also expose static methods as instance methods + Engine.prototype['load'] = Engine.load; + Engine.prototype['unload'] = Engine.unload; + Engine.prototype['isWebGLAvailable'] = Engine.isWebGLAvailable; + return new Engine(initConfig); + } + + // Closure compiler exported static methods. + SafeEngine['load'] = Engine.load; + SafeEngine['unload'] = Engine.unload; + SafeEngine['isWebGLAvailable'] = Engine.isWebGLAvailable; + + return SafeEngine; +}()); +if (typeof window !== 'undefined') { + window['Engine'] = Engine; +} diff --git a/bins/1.1.0.0/html5/index.pck b/bins/1.1.0.0/html5/index.pck new file mode 100644 index 0000000..88238e0 Binary files /dev/null and b/bins/1.1.0.0/html5/index.pck differ diff --git a/bins/1.1.0.0/html5/index.png b/bins/1.1.0.0/html5/index.png new file mode 100644 index 0000000..a7baea4 Binary files /dev/null and b/bins/1.1.0.0/html5/index.png differ diff --git a/bins/1.1.0.0/html5/index.wasm b/bins/1.1.0.0/html5/index.wasm new file mode 100644 index 0000000..5151d56 Binary files /dev/null and b/bins/1.1.0.0/html5/index.wasm differ diff --git a/bins/1.1.0.0/html5/thelostmemory_v1.1.0.0_html5.zip b/bins/1.1.0.0/html5/thelostmemory_v1.1.0.0_html5.zip new file mode 100644 index 0000000..a5799a9 Binary files /dev/null and b/bins/1.1.0.0/html5/thelostmemory_v1.1.0.0_html5.zip differ diff --git a/bins/1.1.0.0/html5/thelostmemory_v1.1.0.0_html5_zi.zip b/bins/1.1.0.0/html5/thelostmemory_v1.1.0.0_html5_zi.zip new file mode 100644 index 0000000..0b39198 Binary files /dev/null and b/bins/1.1.0.0/html5/thelostmemory_v1.1.0.0_html5_zi.zip differ diff --git a/bins/1.1.0.0/html5_pck/thelostmemory1.1.pck b/bins/1.1.0.0/html5_pck/thelostmemory1.1.pck new file mode 100644 index 0000000..dc1df59 Binary files /dev/null and b/bins/1.1.0.0/html5_pck/thelostmemory1.1.pck differ diff --git a/bins/1.1.0.0/win/thelostmemory.exe b/bins/1.1.0.0/win/thelostmemory.exe new file mode 100644 index 0000000..5e8fc12 Binary files /dev/null and b/bins/1.1.0.0/win/thelostmemory.exe differ diff --git a/bins/1.1.0.0/win/thelostmemory.pck b/bins/1.1.0.0/win/thelostmemory.pck new file mode 100644 index 0000000..88238e0 Binary files /dev/null and b/bins/1.1.0.0/win/thelostmemory.pck differ diff --git a/bins/1.1.0.0/win/thelostmemory_v1.1.0.0_win.zip b/bins/1.1.0.0/win/thelostmemory_v1.1.0.0_win.zip new file mode 100644 index 0000000..82de5ba Binary files /dev/null and b/bins/1.1.0.0/win/thelostmemory_v1.1.0.0_win.zip differ diff --git a/bins/1.1.1.0/html5/index.apple-touch-icon.png b/bins/1.1.1.0/html5/index.apple-touch-icon.png new file mode 100644 index 0000000..7bf43af Binary files /dev/null and b/bins/1.1.1.0/html5/index.apple-touch-icon.png differ diff --git a/bins/1.1.1.0/html5/index.audio.worklet.js b/bins/1.1.1.0/html5/index.audio.worklet.js new file mode 100644 index 0000000..ea4d8cb --- /dev/null +++ b/bins/1.1.1.0/html5/index.audio.worklet.js @@ -0,0 +1,211 @@ +/*************************************************************************/ +/* audio.worklet.js */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +class RingBuffer { + constructor(p_buffer, p_state, p_threads) { + this.buffer = p_buffer; + this.avail = p_state; + this.threads = p_threads; + this.rpos = 0; + this.wpos = 0; + } + + data_left() { + return this.threads ? Atomics.load(this.avail, 0) : this.avail; + } + + space_left() { + return this.buffer.length - this.data_left(); + } + + read(output) { + const size = this.buffer.length; + let from = 0; + let to_write = output.length; + if (this.rpos + to_write > size) { + const high = size - this.rpos; + output.set(this.buffer.subarray(this.rpos, size)); + from = high; + to_write -= high; + this.rpos = 0; + } + if (to_write) { + output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from); + } + this.rpos += to_write; + if (this.threads) { + Atomics.add(this.avail, 0, -output.length); + Atomics.notify(this.avail, 0); + } else { + this.avail -= output.length; + } + } + + write(p_buffer) { + const to_write = p_buffer.length; + const mw = this.buffer.length - this.wpos; + if (mw >= to_write) { + this.buffer.set(p_buffer, this.wpos); + this.wpos += to_write; + if (mw === to_write) { + this.wpos = 0; + } + } else { + const high = p_buffer.subarray(0, mw); + const low = p_buffer.subarray(mw); + this.buffer.set(high, this.wpos); + this.buffer.set(low); + this.wpos = low.length; + } + if (this.threads) { + Atomics.add(this.avail, 0, to_write); + Atomics.notify(this.avail, 0); + } else { + this.avail += to_write; + } + } +} + +class GodotProcessor extends AudioWorkletProcessor { + constructor() { + super(); + this.threads = false; + this.running = true; + this.lock = null; + this.notifier = null; + this.output = null; + this.output_buffer = new Float32Array(); + this.input = null; + this.input_buffer = new Float32Array(); + this.port.onmessage = (event) => { + const cmd = event.data['cmd']; + const data = event.data['data']; + this.parse_message(cmd, data); + }; + } + + process_notify() { + if (this.notifier) { + Atomics.add(this.notifier, 0, 1); + Atomics.notify(this.notifier, 0); + } + } + + parse_message(p_cmd, p_data) { + if (p_cmd === 'start' && p_data) { + const state = p_data[0]; + let idx = 0; + this.threads = true; + this.lock = state.subarray(idx, ++idx); + this.notifier = state.subarray(idx, ++idx); + const avail_in = state.subarray(idx, ++idx); + const avail_out = state.subarray(idx, ++idx); + this.input = new RingBuffer(p_data[1], avail_in, true); + this.output = new RingBuffer(p_data[2], avail_out, true); + } else if (p_cmd === 'stop') { + this.running = false; + this.output = null; + this.input = null; + } else if (p_cmd === 'start_nothreads') { + this.output = new RingBuffer(p_data[0], p_data[0].length, false); + } else if (p_cmd === 'chunk') { + this.output.write(p_data); + } + } + + static array_has_data(arr) { + return arr.length && arr[0].length && arr[0][0].length; + } + + process(inputs, outputs, parameters) { + if (!this.running) { + return false; // Stop processing. + } + if (this.output === null) { + return true; // Not ready yet, keep processing. + } + const process_input = GodotProcessor.array_has_data(inputs); + if (process_input) { + const input = inputs[0]; + const chunk = input[0].length * input.length; + if (this.input_buffer.length !== chunk) { + this.input_buffer = new Float32Array(chunk); + } + if (!this.threads) { + GodotProcessor.write_input(this.input_buffer, input); + this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer }); + } else if (this.input.space_left() >= chunk) { + GodotProcessor.write_input(this.input_buffer, input); + this.input.write(this.input_buffer); + } else { + this.port.postMessage('Input buffer is full! Skipping input frame.'); + } + } + const process_output = GodotProcessor.array_has_data(outputs); + if (process_output) { + const output = outputs[0]; + const chunk = output[0].length * output.length; + if (this.output_buffer.length !== chunk) { + this.output_buffer = new Float32Array(chunk); + } + if (this.output.data_left() >= chunk) { + this.output.read(this.output_buffer); + GodotProcessor.write_output(output, this.output_buffer); + if (!this.threads) { + this.port.postMessage({ 'cmd': 'read', 'data': chunk }); + } + } else { + this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); + } + } + this.process_notify(); + return true; + } + + static write_output(dest, source) { + const channels = dest.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < dest[ch].length; sample++) { + dest[ch][sample] = source[sample * channels + ch]; + } + } + } + + static write_input(dest, source) { + const channels = source.length; + for (let ch = 0; ch < channels; ch++) { + for (let sample = 0; sample < source[ch].length; sample++) { + dest[sample * channels + ch] = source[ch][sample]; + } + } + } +} + +registerProcessor('godot-processor', GodotProcessor); diff --git a/bins/1.1.1.0/html5/index.html b/bins/1.1.1.0/html5/index.html new file mode 100644 index 0000000..217c560 --- /dev/null +++ b/bins/1.1.1.0/html5/index.html @@ -0,0 +1,248 @@ + + + + + + The Lost Memory + + + + + + + + HTML5 canvas appears to be unsupported in the current browser.
+ Please try updating or use a different browser. +
+
+ + + +
+ + + + + + diff --git a/bins/1.1.1.0/html5/index.icon.png b/bins/1.1.1.0/html5/index.icon.png new file mode 100644 index 0000000..8ac2686 Binary files /dev/null and b/bins/1.1.1.0/html5/index.icon.png differ diff --git a/bins/1.1.1.0/html5/index.js b/bins/1.1.1.0/html5/index.js new file mode 100644 index 0000000..1c18e52 --- /dev/null +++ b/bins/1.1.1.0/html5/index.js @@ -0,0 +1,796 @@ + +var Godot = (() => { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + + return ( +function(Godot) { + Godot = Godot || {}; + +var Module=typeof Godot!="undefined"?Godot:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});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,setWindowTitle;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(_scriptDir){scriptDirectory=_scriptDir}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)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.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"];function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var getTempRet0=()=>tempRet0;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||false;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)}}function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(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=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function 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}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||33554432;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}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();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);FS.quit();TTY.shutdown();IDBFS.quit();runtimeExited=true}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);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="godot.javascript.opt.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["dk"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["rk"];addOnInit(Module["asm"]["ek"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return Number(HEAPF64[ptr>>3]);default:abort("invalid type for getValue: "+type)}return null}function getWasmTableEntry(funcPtr){return wasmTable.get(funcPtr)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function ___call_sighandler(fp,sig){getWasmTableEntry(fp)(sig)}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,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else return function(){abort("randomDevice")}}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){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function zeroMemory(address,size){HEAPU8.fill(0,address,address+size)}function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(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:function(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:function(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:function(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:function(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:function(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:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(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:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(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:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(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{if(typeof indexedDB!="undefined")return indexedDB;var ret=null;if(typeof window=="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function(mount){return MEMFS.mount.apply(null,arguments)},syncfs:(mount,populate,callback)=>{IDBFS.getLocalSet(mount,(err,local)=>{if(err)return callback(err);IDBFS.getRemoteSet(mount,(err,remote)=>{if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},quit:()=>{Object.values(IDBFS.dbs).forEach(value=>value.close());IDBFS.dbs={}},getDB:(name,callback)=>{var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=e=>{var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=()=>{db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=e=>{callback(this.error);e.preventDefault()}},getLocalSet:(mount,callback)=>{var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return p=>{return PATH.join2(root,p)}}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={"timestamp":stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:(mount,callback)=>{var entries={};IDBFS.getDB(mount.mountpoint,(err,db)=>{if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=e=>{callback(this.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=event=>{var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={"timestamp":cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:(path,callback)=>{var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{"timestamp":stat.mtime,"mode":stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{"timestamp":stat.mtime,"mode":stat.mode,"contents":node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:(path,entry,callback)=>{try{if(FS.isDir(entry["mode"])){FS.mkdirTree(path,entry["mode"])}else if(FS.isFile(entry["mode"])){FS.writeFile(path,entry["contents"],{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry["mode"]);FS.utime(path,entry["timestamp"],entry["timestamp"])}catch(e){return callback(e)}callback(null)},removeLocalEntry:(path,callback)=>{try{var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:(store,path,callback)=>{var req=store.get(path);req.onsuccess=event=>{callback(null,event.target.result)};req.onerror=e=>{callback(this.error);e.preventDefault()}},storeRemoteEntry:(store,path,entry,callback)=>{try{var req=store.put(entry,path)}catch(e){callback(e);return}req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},removeRemoteEntry:(store,path,callback)=>{var req=store.delete(path);req.onsuccess=()=>{callback(null)};req.onerror=e=>{callback(this.error);e.preventDefault()}},reconcile:(src,dst,callback)=>{var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e["timestamp"].getTime()!=e2["timestamp"].getTime()){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){if(!src.entries[key]){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err&&!errored){errored=true;return callback(err)}}transaction.onerror=e=>{done(this.error);e.preventDefault()};transaction.oncomplete=e=>{if(!errored){callback(null)}};create.sort().forEach(path=>{if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(err,entry)=>{if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,(err,entry)=>{if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(path=>{if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};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(FS.cwd(),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.normalizeArray(path.split("/").filter(p=>!!p),false);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},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},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:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);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;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,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 random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);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.getStream(fd);if(!stream)throw new FS.ErrnoError(8);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.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,"IDBFS":IDBFS}},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;_fflush(0);for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.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||[])}else{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},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(Browser.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)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(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]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}else{data=new Uint8Array(data)}}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___syscall_accept4(fd,addr,addrlen,flags){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___syscall_bind(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chdir(path){try{path=SYSCALLS.getStr(path);FS.chdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}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 instanceof FS.ErrnoError))throw e;return-e.errno}}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}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.get();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 instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getsockname(fd,addr,addrlen){try{err("__syscall_getsockname "+fd);var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getsockopt(fd,level,optname,optval,optlen){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.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:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~4352;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.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 instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_symlink(target,linkpath){try{target=SYSCALLS.getStr(target);linkpath=SYSCALLS.getStr(linkpath);FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __dlinit(main_dso_handle){}var dlopenMissingError="To use dlopen, you need enable dynamic linking, see https://github.com/emscripten-core/emscripten/wiki/Linking";function __dlopen_js(filename,flag){abort(dlopenMissingError)}function __dlsym_js(handle,symbol){abort(dlopenMissingError)}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function __gmtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function __localtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function _tzset_impl(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}function _abort(){abort("")}function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){runtimeKeepalivePush();Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=function(event){if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();function _emscripten_webgl_do_commit_frame(){if(!GL.currentContext||!GL.currentContext.GLctx){return-3}if(GL.currentContext.defaultFbo){GL.blitOffscreenFramebuffer(GL.currentContext);return 0}if(!GL.currentContext.attributes.explicitSwapControl){return-3}return 0}function _emscripten_webgl_commit_frame(){return _emscripten_webgl_do_commit_frame()}function runtimeKeepalivePush(){runtimeKeepaliveCounter+=1}function _exit(status){exit(status)}function maybeExit(){if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}}function setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming){assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}out('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object"&&SDL.audio&&SDL.audio.queueNewAudioData)SDL.audio.queueNewAudioData();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}}function callUserCallback(func,synchronous){if(runtimeExited||ABORT){return}if(synchronous){func();return}try{func();maybeExit()}catch(e){handleException(e)}}function runtimeKeepalivePop(){runtimeKeepaliveCounter-=1}function safeSetTimeout(func,timeout){runtimeKeepalivePush();return setTimeout(function(){runtimeKeepalivePop();callUserCallback(func)},timeout)}var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus:function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining{assert(img.complete,"Image "+name+" could not be decoded");var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;Browser.URLObject.revokeObjectURL(url);if(onload)onload(byteArray)};img.onerror=event=>{out("Image "+url+" could not be decoded");if(onerror)onerror()};img.src=url};Module["preloadPlugins"].push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;if(onload)onload(byteArray)}function fail(){if(done)return;done=true;preloadedAudios[name]=new Audio;if(onerror)onerror()}if(Browser.hasBlobConstructor){try{var b=new Blob([byteArray],{type:Browser.getMimetype(name)})}catch(e){return fail()}var url=Browser.URLObject.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",function(){finish(audio)},false);audio.onerror=function audio_onerror(event){if(done)return;out("warning: browser could not fully decode audio "+name+", trying slower base64 approach");function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(function(){finish(audio)},1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||function(){};canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||function(){};canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",function(ev){if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},handledByPreloadPlugin:function(byteArray,fullname,finish,onerror){Browser.init();var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled},createContext:function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:typeof WebGL2RenderingContext!="undefined"?2:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(function(callback){callback()});Browser.init()}return ctx},destroyContext:function(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullscreen);if(Module["onFullscreen"])Module["onFullscreen"](Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?function(){canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null)||(canvasContainer["webkitRequestFullScreen"]?function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}:null);canvasContainer.requestFullscreen()},exitFullscreen:function(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||function(){};CFS.apply(document,[]);return true},nextRAF:0,fakeRequestAnimationFrame:function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame:function(func){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(func);return}var RAF=Browser.fakeRequestAnimationFrame;RAF(func)},safeSetTimeout:function(func){return safeSetTimeout(func)},safeRequestAnimationFrame:function(func){runtimeKeepalivePush();return Browser.requestAnimationFrame(function(){runtimeKeepalivePop();callUserCallback(func)})},getMimetype:function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]},getUserMedia:function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)},getMovementX:function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY:function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta:function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:throw"unrecognized mouse wheel delta mode: "+event.deltaMode}break;default:throw"unrecognized mouse wheel event: "+event.type}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}},resizeListeners:[],updateResizeListeners:function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach(function(listener){listener(canvas.width,canvas.height)})},setCanvasSize:function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Module["canvas"]);Browser.updateResizeListeners()},updateCanvasDimensions:function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){if(webGLContextAttributes.renderViaOffscreenBackBuffer)webGLContextAttributes["preserveDrawingBuffer"]=true;if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},enableOffscreenFramebufferAttributes:function(webGLContextAttributes){webGLContextAttributes.renderViaOffscreenBackBuffer=true;webGLContextAttributes.preserveDrawingBuffer=true},createOffscreenFramebuffer:function(context){var gl=context.GLctx;var fbo=gl.createFramebuffer();gl.bindFramebuffer(36160,fbo);context.defaultFbo=fbo;context.defaultFboForbidBlitFramebuffer=false;if(gl.getContextAttributes().antialias){context.defaultFboForbidBlitFramebuffer=true}else{var firefoxMatch=navigator.userAgent.toLowerCase().match(/firefox\/(\d\d)/);if(firefoxMatch!=null){var firefoxVersion=firefoxMatch[1];context.defaultFboForbidBlitFramebuffer=firefoxVersion<67}}context.defaultColorTarget=gl.createTexture();context.defaultDepthTarget=gl.createRenderbuffer();GL.resizeOffscreenFramebuffer(context);gl.bindTexture(3553,context.defaultColorTarget);gl.texParameteri(3553,10241,9728);gl.texParameteri(3553,10240,9728);gl.texParameteri(3553,10242,33071);gl.texParameteri(3553,10243,33071);gl.texImage2D(3553,0,6408,gl.canvas.width,gl.canvas.height,0,6408,5121,null);gl.framebufferTexture2D(36160,36064,3553,context.defaultColorTarget,0);gl.bindTexture(3553,null);var depthTarget=gl.createRenderbuffer();gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.canvas.width,gl.canvas.height);gl.framebufferRenderbuffer(36160,36096,36161,context.defaultDepthTarget);gl.bindRenderbuffer(36161,null);var vertices=[-1,-1,-1,1,1,-1,1,1];var vb=gl.createBuffer();gl.bindBuffer(34962,vb);gl.bufferData(34962,new Float32Array(vertices),35044);gl.bindBuffer(34962,null);context.blitVB=vb;var vsCode="attribute vec2 pos;"+"varying lowp vec2 tex;"+"void main() { tex = pos * 0.5 + vec2(0.5,0.5); gl_Position = vec4(pos, 0.0, 1.0); }";var vs=gl.createShader(35633);gl.shaderSource(vs,vsCode);gl.compileShader(vs);var fsCode="varying lowp vec2 tex;"+"uniform sampler2D sampler;"+"void main() { gl_FragColor = texture2D(sampler, tex); }";var fs=gl.createShader(35632);gl.shaderSource(fs,fsCode);gl.compileShader(fs);var blitProgram=gl.createProgram();gl.attachShader(blitProgram,vs);gl.attachShader(blitProgram,fs);gl.linkProgram(blitProgram);context.blitProgram=blitProgram;context.blitPosLoc=gl.getAttribLocation(blitProgram,"pos");gl.useProgram(blitProgram);gl.uniform1i(gl.getUniformLocation(blitProgram,"sampler"),0);gl.useProgram(null);context.defaultVao=undefined;if(gl.createVertexArray){context.defaultVao=gl.createVertexArray();gl.bindVertexArray(context.defaultVao);gl.enableVertexAttribArray(context.blitPosLoc);gl.bindVertexArray(null)}},resizeOffscreenFramebuffer:function(context){var gl=context.GLctx;if(context.defaultColorTarget){var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);gl.texImage2D(3553,0,6408,gl.drawingBufferWidth,gl.drawingBufferHeight,0,6408,5121,null);gl.bindTexture(3553,prevTextureBinding)}if(context.defaultDepthTarget){var prevRenderBufferBinding=gl.getParameter(36007);gl.bindRenderbuffer(36161,context.defaultDepthTarget);gl.renderbufferStorage(36161,33189,gl.drawingBufferWidth,gl.drawingBufferHeight);gl.bindRenderbuffer(36161,prevRenderBufferBinding)}},blitOffscreenFramebuffer:function(context){var gl=context.GLctx;var prevScissorTest=gl.getParameter(3089);if(prevScissorTest)gl.disable(3089);var prevFbo=gl.getParameter(36006);if(gl.blitFramebuffer&&!context.defaultFboForbidBlitFramebuffer){gl.bindFramebuffer(36008,context.defaultFbo);gl.bindFramebuffer(36009,null);gl.blitFramebuffer(0,0,gl.canvas.width,gl.canvas.height,0,0,gl.canvas.width,gl.canvas.height,16384,9728)}else{gl.bindFramebuffer(36160,null);var prevProgram=gl.getParameter(35725);gl.useProgram(context.blitProgram);var prevVB=gl.getParameter(34964);gl.bindBuffer(34962,context.blitVB);var prevActiveTexture=gl.getParameter(34016);gl.activeTexture(33984);var prevTextureBinding=gl.getParameter(32873);gl.bindTexture(3553,context.defaultColorTarget);var prevBlend=gl.getParameter(3042);if(prevBlend)gl.disable(3042);var prevCullFace=gl.getParameter(2884);if(prevCullFace)gl.disable(2884);var prevDepthTest=gl.getParameter(2929);if(prevDepthTest)gl.disable(2929);var prevStencilTest=gl.getParameter(2960);if(prevStencilTest)gl.disable(2960);function draw(){gl.vertexAttribPointer(context.blitPosLoc,2,5126,false,0,0);gl.drawArrays(5,0,4)}if(context.defaultVao){var prevVAO=gl.getParameter(34229);gl.bindVertexArray(context.defaultVao);draw();gl.bindVertexArray(prevVAO)}else{var prevVertexAttribPointer={buffer:gl.getVertexAttrib(context.blitPosLoc,34975),size:gl.getVertexAttrib(context.blitPosLoc,34339),stride:gl.getVertexAttrib(context.blitPosLoc,34340),type:gl.getVertexAttrib(context.blitPosLoc,34341),normalized:gl.getVertexAttrib(context.blitPosLoc,34922),pointer:gl.getVertexAttribOffset(context.blitPosLoc,34373)};var maxVertexAttribs=gl.getParameter(34921);var prevVertexAttribEnables=[];for(var i=0;i=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};function _emscripten_glActiveTexture(x0){GLctx["activeTexture"](x0)}function _emscripten_glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glBeginQuery(target,id){GLctx["beginQuery"](target,GL.queries[id])}function _emscripten_glBeginQueryEXT(target,id){GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])}function _emscripten_glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _emscripten_glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _emscripten_glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _emscripten_glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _emscripten_glBindBufferRange(target,index,buffer,offset,ptrsize){GLctx["bindBufferRange"](target,index,GL.buffers[buffer],offset,ptrsize)}function _emscripten_glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _emscripten_glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _emscripten_glBindSampler(unit,sampler){GLctx["bindSampler"](unit,GL.samplers[sampler])}function _emscripten_glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _emscripten_glBindTransformFeedback(target,id){GLctx["bindTransformFeedback"](target,GL.transformFeedbacks[id])}function _emscripten_glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBindVertexArrayOES(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _emscripten_glBlendColor(x0,x1,x2,x3){GLctx["blendColor"](x0,x1,x2,x3)}function _emscripten_glBlendEquation(x0){GLctx["blendEquation"](x0)}function _emscripten_glBlendEquationSeparate(x0,x1){GLctx["blendEquationSeparate"](x0,x1)}function _emscripten_glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _emscripten_glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _emscripten_glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _emscripten_glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _emscripten_glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _emscripten_glClear(x0){GLctx["clear"](x0)}function _emscripten_glClearBufferfi(x0,x1,x2,x3){GLctx["clearBufferfi"](x0,x1,x2,x3)}function _emscripten_glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _emscripten_glClearBufferiv(buffer,drawbuffer,value){GLctx["clearBufferiv"](buffer,drawbuffer,HEAP32,value>>2)}function _emscripten_glClearBufferuiv(buffer,drawbuffer,value){GLctx["clearBufferuiv"](buffer,drawbuffer,HEAPU32,value>>2)}function _emscripten_glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _emscripten_glClearDepthf(x0){GLctx["clearDepth"](x0)}function _emscripten_glClearStencil(x0){GLctx["clearStencil"](x0)}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function _emscripten_glClientWaitSync(sync,flags,timeoutLo,timeoutHi){return GLctx.clientWaitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _emscripten_glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _emscripten_glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx["compressedTexImage3D"](target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}}function _emscripten_glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _emscripten_glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _emscripten_glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _emscripten_glCopyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _emscripten_glCopyTexSubImage3D(x0,x1,x2,x3,x4,x5,x6,x7,x8){GLctx["copyTexSubImage3D"](x0,x1,x2,x3,x4,x5,x6,x7,x8)}function _emscripten_glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _emscripten_glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _emscripten_glCullFace(x0){GLctx["cullFace"](x0)}function _emscripten_glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _emscripten_glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _emscripten_glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _emscripten_glDeleteQueries(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx["deleteQuery"](query);GL.queries[id]=null}}function _emscripten_glDeleteQueriesEXT(n,ids){for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}}function _emscripten_glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _emscripten_glDeleteSamplers(n,samplers){for(var i=0;i>2];var sampler=GL.samplers[id];if(!sampler)continue;GLctx["deleteSampler"](sampler);sampler.name=0;GL.samplers[id]=null}}function _emscripten_glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _emscripten_glDeleteSync(id){if(!id)return;var sync=GL.syncs[id];if(!sync){GL.recordError(1281);return}GLctx.deleteSync(sync);sync.name=0;GL.syncs[id]=null}function _emscripten_glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _emscripten_glDeleteTransformFeedbacks(n,ids){for(var i=0;i>2];var transformFeedback=GL.transformFeedbacks[id];if(!transformFeedback)continue;GLctx["deleteTransformFeedback"](transformFeedback);transformFeedback.name=0;GL.transformFeedbacks[id]=null}}function _emscripten_glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDeleteVertexArraysOES(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _emscripten_glDepthFunc(x0){GLctx["depthFunc"](x0)}function _emscripten_glDepthMask(flag){GLctx.depthMask(!!flag)}function _emscripten_glDepthRangef(x0,x1){GLctx["depthRange"](x0,x1)}function _emscripten_glDetachShader(program,shader){GLctx.detachShader(GL.programs[program],GL.shaders[shader])}function _emscripten_glDisable(x0){GLctx["disable"](x0)}function _emscripten_glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _emscripten_glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _emscripten_glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedANGLE(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedARB(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedEXT(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _emscripten_glDrawArraysInstancedNV(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}var tempFixedLengthArray=[];function _emscripten_glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawBuffersEXT(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawBuffersWEBGL(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _emscripten_glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedANGLE(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedARB(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedEXT(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _emscripten_glDrawElementsInstancedNV(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glDrawElements(mode,count,type,indices){GLctx.drawElements(mode,count,type,indices)}function _emscripten_glDrawRangeElements(mode,start,end,count,type,indices){_glDrawElements(mode,count,type,indices)}function _emscripten_glEnable(x0){GLctx["enable"](x0)}function _emscripten_glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _emscripten_glEndQuery(x0){GLctx["endQuery"](x0)}function _emscripten_glEndQueryEXT(target){GLctx.disjointTimerQueryExt["endQueryEXT"](target)}function _emscripten_glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _emscripten_glFenceSync(condition,flags){var sync=GLctx.fenceSync(condition,flags);if(sync){var id=GL.getNewId(GL.syncs);sync.name=id;GL.syncs[id]=sync;return id}else{return 0}}function _emscripten_glFinish(){GLctx["finish"]()}function _emscripten_glFlush(){GLctx["flush"]()}function _emscripten_glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _emscripten_glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _emscripten_glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _emscripten_glFrontFace(x0){GLctx["frontFace"](x0)}function __glGenObject(n,buffers,createFunction,objectTable){for(var i=0;i>2]=id}}function _emscripten_glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _emscripten_glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _emscripten_glGenQueries(n,ids){__glGenObject(n,ids,"createQuery",GL.queries)}function _emscripten_glGenQueriesEXT(n,ids){for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}}function _emscripten_glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _emscripten_glGenSamplers(n,samplers){__glGenObject(n,samplers,"createSampler",GL.samplers)}function _emscripten_glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _emscripten_glGenTransformFeedbacks(n,ids){__glGenObject(n,ids,"createTransformFeedback",GL.transformFeedbacks)}function _emscripten_glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenVertexArraysOES(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _emscripten_glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function __glGetActiveAttribOrUniform(funcName,program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}}function _emscripten_glGetActiveAttrib(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniform(program,index,bufSize,length,size,type,name){__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)}function _emscripten_glGetActiveUniformBlockName(program,uniformBlockIndex,bufSize,length,uniformBlockName){program=GL.programs[program];var result=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);if(!result)return;if(uniformBlockName&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(result,uniformBlockName,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}}function _emscripten_glGetActiveUniformBlockiv(program,uniformBlockIndex,pname,params){if(!params){GL.recordError(1281);return}program=GL.programs[program];if(pname==35393){var name=GLctx["getActiveUniformBlockName"](program,uniformBlockIndex);HEAP32[params>>2]=name.length+1;return}var result=GLctx["getActiveUniformBlockParameter"](program,uniformBlockIndex,pname);if(result===null)return;if(pname==35395){for(var i=0;i>2]=result[i]}}else{HEAP32[params>>2]=result}}function _emscripten_glGetActiveUniformsiv(program,uniformCount,uniformIndices,pname,params){if(!params){GL.recordError(1281);return}if(uniformCount>0&&uniformIndices==0){GL.recordError(1281);return}program=GL.programs[program];var ids=[];for(var i=0;i>2])}var result=GLctx["getActiveUniforms"](program,ids,pname);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function _emscripten_glGetAttachedShaders(program,maxCount,count,shaders){var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}}function _emscripten_glGetAttribLocation(program,name){return GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name))}function writeI53ToI64(ptr,num){HEAPU32[ptr>>2]=num;HEAPU32[ptr+4>>2]=(num-HEAPU32[ptr>>2])/4294967296}function emscriptenWebGLGet(name_,p,type){if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}}function _emscripten_glGetBooleanv(name_,p){emscriptenWebGLGet(name_,p,4)}function _emscripten_glGetBufferParameteri64v(target,value,data){if(!data){GL.recordError(1281);return}writeI53ToI64(data,GLctx.getBufferParameter(target,value))}function _emscripten_glGetBufferParameteriv(target,value,data){if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)}function _emscripten_glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _emscripten_glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _emscripten_glGetFragDataLocation(program,name){return GLctx["getFragDataLocation"](GL.programs[program],UTF8ToString(name))}function _emscripten_glGetFramebufferAttachmentParameteriv(target,attachment,pname,params){var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result}function emscriptenWebGLGetIndexed(target,index,data,type){if(!data){GL.recordError(1281);return}var result=GLctx["getIndexedParameter"](target,index);var ret;switch(typeof result){case"boolean":ret=result?1:0;break;case"number":ret=result;break;case"object":if(result===null){switch(target){case 35983:case 35368:ret=0;break;default:{GL.recordError(1280);return}}}else if(result instanceof WebGLBuffer){ret=result.name|0}else{GL.recordError(1280);return}break;default:GL.recordError(1280);return}switch(type){case 1:writeI53ToI64(data,ret);break;case 0:HEAP32[data>>2]=ret;break;case 2:HEAPF32[data>>2]=ret;break;case 4:HEAP8[data>>0]=ret?1:0;break;default:throw"internal emscriptenWebGLGetIndexed() error, bad type: "+type}}function _emscripten_glGetInteger64i_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,1)}function _emscripten_glGetInteger64v(name_,p){emscriptenWebGLGet(name_,p,1)}function _emscripten_glGetIntegeri_v(target,index,data){emscriptenWebGLGetIndexed(target,index,data,0)}function _emscripten_glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _emscripten_glGetInternalformativ(target,internalformat,pname,bufSize,params){if(bufSize<0){GL.recordError(1281);return}if(!params){GL.recordError(1281);return}var ret=GLctx["getInternalformatParameter"](target,internalformat,pname);if(ret===null)return;for(var i=0;i>2]=ret[i]}}function _emscripten_glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _emscripten_glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _emscripten_glGetQueryObjecti64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectui64vEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;if(GL.currentContext.version<2){param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}else{param=GLctx["getQueryParameter"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)}function _emscripten_glGetQueryObjectuiv(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx["getQueryParameter"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryObjectuivEXT(id,pname,params){if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret}function _emscripten_glGetQueryiv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getQuery"](target,pname)}function _emscripten_glGetQueryivEXT(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)}function _emscripten_glGetRenderbufferParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)}function _emscripten_glGetSamplerParameterfv(sampler,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetSamplerParameteriv(sampler,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx["getSamplerParameter"](GL.samplers[sampler],pname)}function _emscripten_glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderPrecisionFormat(shaderType,precisionType,range,precision){var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision}function _emscripten_glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _emscripten_glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _emscripten_glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _emscripten_glGetSynciv(sync,pname,bufSize,length,values){if(bufSize<0){GL.recordError(1281);return}if(!values){GL.recordError(1281);return}var ret=GLctx.getSyncParameter(GL.syncs[sync],pname);if(ret!==null){HEAP32[values>>2]=ret;if(length)HEAP32[length>>2]=1}}function _emscripten_glGetTexParameterfv(target,pname,params){if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTexParameteriv(target,pname,params){if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)}function _emscripten_glGetTransformFeedbackVarying(program,index,bufSize,length,size,type,name){program=GL.programs[program];var info=GLctx["getTransformFeedbackVarying"](program,index);if(!info)return;if(name&&bufSize>0){var numBytesWrittenExclNull=stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull}else{if(length)HEAP32[length>>2]=0}if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}function _emscripten_glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _emscripten_glGetUniformIndices(program,uniformCount,uniformNames,uniformIndices){if(!uniformIndices){GL.recordError(1281);return}if(uniformCount>0&&(uniformNames==0||uniformIndices==0)){GL.recordError(1281);return}program=GL.programs[program];var names=[];for(var i=0;i>2]));var result=GLctx["getUniformIndices"](program,names);if(!result)return;var len=result.length;for(var i=0;i>2]=result[i]}}function webglGetLeftBracePos(name){return name.slice(-1)=="]"&&name.lastIndexOf("[")}function webglPrepareUniformLocationsBeforeFirstUse(program){var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}}function emscriptenWebGLGetUniform(program,location,params,type){if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}}function _emscripten_glGetUniformfv(program,location,params){emscriptenWebGLGetUniform(program,location,params,2)}function _emscripten_glGetUniformiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function _emscripten_glGetUniformuiv(program,location,params){emscriptenWebGLGetUniform(program,location,params,0)}function emscriptenWebGLGetVertexAttrib(index,pname,params,type){if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}}function _emscripten_glGetVertexAttribIiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribIuiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,0)}function _emscripten_glGetVertexAttribPointerv(index,pname,pointer){if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)}function _emscripten_glGetVertexAttribfv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,2)}function _emscripten_glGetVertexAttribiv(index,pname,params){emscriptenWebGLGetVertexAttrib(index,pname,params,5)}function _emscripten_glHint(x0,x1){GLctx["hint"](x0,x1)}function _emscripten_glInvalidateFramebuffer(target,numAttachments,attachments){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateFramebuffer"](target,list)}function _emscripten_glInvalidateSubFramebuffer(target,numAttachments,attachments,x,y,width,height){var list=tempFixedLengthArray[numAttachments];for(var i=0;i>2]}GLctx["invalidateSubFramebuffer"](target,list,x,y,width,height)}function _emscripten_glIsBuffer(buffer){var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)}function _emscripten_glIsEnabled(x0){return GLctx["isEnabled"](x0)}function _emscripten_glIsFramebuffer(framebuffer){var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)}function _emscripten_glIsProgram(program){program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)}function _emscripten_glIsQuery(id){var query=GL.queries[id];if(!query)return 0;return GLctx["isQuery"](query)}function _emscripten_glIsQueryEXT(id){var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)}function _emscripten_glIsRenderbuffer(renderbuffer){var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)}function _emscripten_glIsSampler(id){var sampler=GL.samplers[id];if(!sampler)return 0;return GLctx["isSampler"](sampler)}function _emscripten_glIsShader(shader){var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)}function _emscripten_glIsSync(sync){return GLctx.isSync(GL.syncs[sync])}function _emscripten_glIsTexture(id){var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)}function _emscripten_glIsTransformFeedback(id){return GLctx["isTransformFeedback"](GL.transformFeedbacks[id])}function _emscripten_glIsVertexArray(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glIsVertexArrayOES(array){var vao=GL.vaos[array];if(!vao)return 0;return GLctx["isVertexArray"](vao)}function _emscripten_glLineWidth(x0){GLctx["lineWidth"](x0)}function _emscripten_glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _emscripten_glPauseTransformFeedback(){GLctx["pauseTransformFeedback"]()}function _emscripten_glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _emscripten_glPolygonOffset(x0,x1){GLctx["polygonOffset"](x0,x1)}function _emscripten_glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _emscripten_glProgramParameteri(program,pname,value){GL.recordError(1280)}function _emscripten_glQueryCounterEXT(id,target){GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)}function _emscripten_glReadBuffer(x0){GLctx["readBuffer"](x0)}function computeUnpackAlignedImageSize(width,height,sizePerPixel,alignment){function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize}function __colorChannelsInGlTextureFormat(format){var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1}function heapObjectForWebGLType(type){type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16}function heapAccessShiftForWebGLHeap(heap){return 31-Math.clz32(heap.BYTES_PER_ELEMENT)}function emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat){var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)}function _emscripten_glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _emscripten_glReleaseShaderCompiler(){}function _emscripten_glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _emscripten_glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _emscripten_glResumeTransformFeedback(){GLctx["resumeTransformFeedback"]()}function _emscripten_glSampleCoverage(value,invert){GLctx.sampleCoverage(value,!!invert)}function _emscripten_glSamplerParameterf(sampler,pname,param){GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameterfv(sampler,pname,params){var param=HEAPF32[params>>2];GLctx["samplerParameterf"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteri(sampler,pname,param){GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glSamplerParameteriv(sampler,pname,params){var param=HEAP32[params>>2];GLctx["samplerParameteri"](GL.samplers[sampler],pname,param)}function _emscripten_glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _emscripten_glShaderBinary(){GL.recordError(1280)}function _emscripten_glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _emscripten_glStencilFunc(x0,x1,x2){GLctx["stencilFunc"](x0,x1,x2)}function _emscripten_glStencilFuncSeparate(x0,x1,x2,x3){GLctx["stencilFuncSeparate"](x0,x1,x2,x3)}function _emscripten_glStencilMask(x0){GLctx["stencilMask"](x0)}function _emscripten_glStencilMaskSeparate(x0,x1){GLctx["stencilMaskSeparate"](x0,x1)}function _emscripten_glStencilOp(x0,x1,x2){GLctx["stencilOp"](x0,x1,x2)}function _emscripten_glStencilOpSeparate(x0,x1,x2,x3){GLctx["stencilOpSeparate"](x0,x1,x2,x3)}function _emscripten_glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _emscripten_glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _emscripten_glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _emscripten_glTexParameterfv(target,pname,params){var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)}function _emscripten_glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _emscripten_glTexParameteriv(target,pname,params){var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)}function _emscripten_glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _emscripten_glTexStorage3D(x0,x1,x2,x3,x4,x5){GLctx["texStorage3D"](x0,x1,x2,x3,x4,x5)}function _emscripten_glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _emscripten_glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _emscripten_glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _emscripten_glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}var miniTempWebGLFloatBuffers=[];function _emscripten_glUniform1fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}var __miniTempWebGLIntBuffers=[];function _emscripten_glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _emscripten_glUniform1uiv(location,count,value){count&&GLctx.uniform1uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count)}function _emscripten_glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform2ui(location,v0,v1){GLctx.uniform2ui(webglGetUniformLocation(location),v0,v1)}function _emscripten_glUniform2uiv(location,count,value){count&&GLctx.uniform2uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*2)}function _emscripten_glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3);return}if(count<=96){var view=__miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform3ui(location,v0,v1,v2){GLctx.uniform3ui(webglGetUniformLocation(location),v0,v1,v2)}function _emscripten_glUniform3uiv(location,count,value){count&&GLctx.uniform3uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*3)}function _emscripten_glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4);return}if(count<=72){var view=__miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)}function _emscripten_glUniform4ui(location,v0,v1,v2,v3){GLctx.uniform4ui(webglGetUniformLocation(location),v0,v1,v2,v3)}function _emscripten_glUniform4uiv(location,count,value){count&&GLctx.uniform4uiv(webglGetUniformLocation(location),HEAPU32,value>>2,count*4)}function _emscripten_glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _emscripten_glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix2x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*6)}function _emscripten_glUniformMatrix2x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix2x4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*8)}function _emscripten_glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix3x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*6)}function _emscripten_glUniformMatrix3x4fv(location,count,transpose,value){count&&GLctx.uniformMatrix3x4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*12)}function _emscripten_glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _emscripten_glUniformMatrix4x2fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*8)}function _emscripten_glUniformMatrix4x3fv(location,count,transpose,value){count&&GLctx.uniformMatrix4x3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*12)}function _emscripten_glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _emscripten_glValidateProgram(program){GLctx.validateProgram(GL.programs[program])}function _emscripten_glVertexAttrib1f(x0,x1){GLctx["vertexAttrib1f"](x0,x1)}function _emscripten_glVertexAttrib1fv(index,v){GLctx.vertexAttrib1f(index,HEAPF32[v>>2])}function _emscripten_glVertexAttrib2f(x0,x1,x2){GLctx["vertexAttrib2f"](x0,x1,x2)}function _emscripten_glVertexAttrib2fv(index,v){GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])}function _emscripten_glVertexAttrib3f(x0,x1,x2,x3){GLctx["vertexAttrib3f"](x0,x1,x2,x3)}function _emscripten_glVertexAttrib3fv(index,v){GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])}function _emscripten_glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _emscripten_glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorANGLE(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorARB(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorEXT(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribDivisorNV(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _emscripten_glVertexAttribI4i(x0,x1,x2,x3,x4){GLctx["vertexAttribI4i"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4iv(index,v){GLctx.vertexAttribI4i(index,HEAP32[v>>2],HEAP32[v+4>>2],HEAP32[v+8>>2],HEAP32[v+12>>2])}function _emscripten_glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _emscripten_glVertexAttribI4uiv(index,v){GLctx.vertexAttribI4ui(index,HEAPU32[v>>2],HEAPU32[v+4>>2],HEAPU32[v+8>>2],HEAPU32[v+12>>2])}function _emscripten_glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _emscripten_glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _emscripten_glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}function _emscripten_glWaitSync(sync,flags,timeoutLo,timeoutHi){GLctx.waitSync(GL.syncs[sync],flags,convertI32PairToI53(timeoutLo,timeoutHi))}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let 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=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop){var browserIterationFunc=getWasmTableEntry(func);setMainLoop(browserIterationFunc,fps,simulateInfiniteLoop)}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl&&!contextAttributes.renderViaOffscreenBackBuffer){contextAttributes.renderViaOffscreenBackBuffer=true}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}function _emscripten_webgl_destroy_context(contextHandle){if(GL.currentContext==contextHandle)GL.currentContext=0;GL.deleteContext(contextHandle)}function _emscripten_webgl_init_context_attributes(attributes){var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1}function _emscripten_webgl_make_context_current(contextHandle){var success=GL.makeContextCurrent(contextHandle);return success?0:-5}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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 instanceof FS.ErrnoError))throw e;return e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);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.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function 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}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 instanceof FS.ErrnoError))throw e;return e.errno}}function _getTempRet0(){return getTempRet0()}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}function _glActiveTexture(x0){GLctx["activeTexture"](x0)}function _glAttachShader(program,shader){GLctx.attachShader(GL.programs[program],GL.shaders[shader])}function _glBeginTransformFeedback(x0){GLctx["beginTransformFeedback"](x0)}function _glBindAttribLocation(program,index,name){GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))}function _glBindBuffer(target,buffer){if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])}function _glBindBufferBase(target,index,buffer){GLctx["bindBufferBase"](target,index,GL.buffers[buffer])}function _glBindFramebuffer(target,framebuffer){GLctx.bindFramebuffer(target,framebuffer?GL.framebuffers[framebuffer]:GL.currentContext.defaultFbo)}function _glBindRenderbuffer(target,renderbuffer){GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])}function _glBindTexture(target,texture){GLctx.bindTexture(target,GL.textures[texture])}function _glBindVertexArray(vao){GLctx["bindVertexArray"](GL.vaos[vao])}function _glBlendEquation(x0){GLctx["blendEquation"](x0)}function _glBlendFunc(x0,x1){GLctx["blendFunc"](x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx["blendFuncSeparate"](x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx["blitFramebuffer"](x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}function _glBufferData(target,size,data,usage){if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}}function _glBufferSubData(target,offset,size,data){if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))}function _glCheckFramebufferStatus(x0){return GLctx["checkFramebufferStatus"](x0)}function _glClear(x0){GLctx["clear"](x0)}function _glClearBufferfv(buffer,drawbuffer,value){GLctx["clearBufferfv"](buffer,drawbuffer,HEAPF32,value>>2)}function _glClearColor(x0,x1,x2,x3){GLctx["clearColor"](x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx["clearDepth"](x0)}function _glColorMask(red,green,blue,alpha){GLctx.colorMask(!!red,!!green,!!blue,!!alpha)}function _glCompileShader(shader){GLctx.compileShader(GL.shaders[shader])}function _glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx["compressedTexImage2D"](target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,imageSize,data)}else{GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,HEAPU8,data,imageSize)}return}GLctx["compressedTexSubImage2D"](target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)}function _glCompressedTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data){if(GLctx.currentPixelUnpackBufferBinding){GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,imageSize,data)}else{GLctx["compressedTexSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,HEAPU8,data,imageSize)}}function _glCopyBufferSubData(x0,x1,x2,x3,x4){GLctx["copyBufferSubData"](x0,x1,x2,x3,x4)}function _glCopyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7){GLctx["copyTexSubImage2D"](x0,x1,x2,x3,x4,x5,x6,x7)}function _glCreateProgram(){var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id}function _glCreateShader(shaderType){var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id}function _glCullFace(x0){GLctx["cullFace"](x0)}function _glDeleteBuffers(n,buffers){for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}}function _glDeleteFramebuffers(n,framebuffers){for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}}function _glDeleteProgram(id){if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null}function _glDeleteRenderbuffers(n,renderbuffers){for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}}function _glDeleteShader(id){if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null}function _glDeleteTextures(n,textures){for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}}function _glDeleteVertexArrays(n,vaos){for(var i=0;i>2];GLctx["deleteVertexArray"](GL.vaos[id]);GL.vaos[id]=null}}function _glDepthFunc(x0){GLctx["depthFunc"](x0)}function _glDepthMask(flag){GLctx.depthMask(!!flag)}function _glDisable(x0){GLctx["disable"](x0)}function _glDisableVertexAttribArray(index){GLctx.disableVertexAttribArray(index)}function _glDrawArrays(mode,first,count){GLctx.drawArrays(mode,first,count)}function _glDrawArraysInstanced(mode,first,count,primcount){GLctx["drawArraysInstanced"](mode,first,count,primcount)}function _glDrawBuffers(n,bufs){var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx["drawBuffers"](bufArray)}function _glDrawElementsInstanced(mode,count,type,indices,primcount){GLctx["drawElementsInstanced"](mode,count,type,indices,primcount)}function _glEnable(x0){GLctx["enable"](x0)}function _glEnableVertexAttribArray(index){GLctx.enableVertexAttribArray(index)}function _glEndTransformFeedback(){GLctx["endTransformFeedback"]()}function _glFinish(){GLctx["finish"]()}function _glFramebufferRenderbuffer(target,attachment,renderbuffertarget,renderbuffer){GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])}function _glFramebufferTexture2D(target,attachment,textarget,texture,level){GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)}function _glFramebufferTextureLayer(target,attachment,texture,level,layer){GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)}function _glFrontFace(x0){GLctx["frontFace"](x0)}function _glGenBuffers(n,buffers){__glGenObject(n,buffers,"createBuffer",GL.buffers)}function _glGenFramebuffers(n,ids){__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)}function _glGenRenderbuffers(n,renderbuffers){__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)}function _glGenTextures(n,textures){__glGenObject(n,textures,"createTexture",GL.textures)}function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx["generateMipmap"](x0)}function _glGetError(){var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error}function _glGetFloatv(name_,p){emscriptenWebGLGet(name_,p,2)}function _glGetIntegerv(name_,p){emscriptenWebGLGet(name_,p,0)}function _glGetProgramBinary(program,bufSize,length,binaryFormat,binary){GL.recordError(1282)}function _glGetProgramInfoLog(program,maxLength,length,infoLog){var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetProgramiv(program,pname,p){if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}}function _glGetShaderInfoLog(shader,maxLength,length,infoLog){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderSource(shader,bufSize,length,source){var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull}function _glGetShaderiv(shader,pname,p){if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}}function _glGetString(name_){var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret}function _glGetStringi(name,index){if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}}function _glGetUniformBlockIndex(program,uniformBlockName){return GLctx["getUniformBlockIndex"](GL.programs[program],UTF8ToString(uniformBlockName))}function _glGetUniformLocation(program,name){name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex>2]}GLctx["invalidateFramebuffer"](target,list)}function _glLinkProgram(program){program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}}function _glPixelStorei(pname,param){if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)}function _glProgramBinary(program,binaryFormat,binary,length){GL.recordError(1280)}function _glProgramParameteri(program,pname,value){GL.recordError(1280)}function _glReadBuffer(x0){GLctx["readBuffer"](x0)}function _glReadPixels(x,y,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelPackBufferBinding){GLctx.readPixels(x,y,width,height,format,type,pixels)}else{var heap=heapObjectForWebGLType(type);GLctx.readPixels(x,y,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}return}var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx["renderbufferStorage"](x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx["renderbufferStorageMultisample"](x0,x1,x2,x3,x4)}function _glScissor(x0,x1,x2,x3){GLctx["scissor"](x0,x1,x2,x3)}function _glShaderSource(shader,count,string,length){var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)}function _glTexImage2D(target,level,internalFormat,width,height,border,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)}function _glTexImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texImage3D"](target,level,internalFormat,width,height,depth,border,format,type,null)}}function _glTexParameterf(x0,x1,x2){GLctx["texParameterf"](x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx["texParameteri"](x0,x1,x2)}function _glTexStorage2D(x0,x1,x2,x3,x4){GLctx["texStorage2D"](x0,x1,x2,x3,x4)}function _glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels){if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,null)}return}var pixelData=null;if(pixels)pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0);GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)}function _glTexSubImage3D(target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels){if(GLctx.currentPixelUnpackBufferBinding){GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx["texSubImage3D"](target,level,xoffset,yoffset,zoffset,width,height,depth,format,type,null)}}function _glTransformFeedbackVaryings(program,count,varyings,bufferMode){program=GL.programs[program];var vars=[];for(var i=0;i>2]));GLctx["transformFeedbackVaryings"](program,vars,bufferMode)}function _glUniform1f(location,v0){GLctx.uniform1f(webglGetUniformLocation(location),v0)}function _glUniform1i(location,v0){GLctx.uniform1i(webglGetUniformLocation(location),v0)}function _glUniform1iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=__miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)}function _glUniform1ui(location,v0){GLctx.uniform1ui(webglGetUniformLocation(location),v0)}function _glUniform2f(location,v0,v1){GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)}function _glUniform2fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)}function _glUniform2i(location,v0,v1){GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)}function _glUniform2iv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=__miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)}function _glUniform3f(location,v0,v1,v2){GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)}function _glUniform3fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)}function _glUniform3i(location,v0,v1,v2){GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)}function _glUniform4f(location,v0,v1,v2,v3){GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)}function _glUniform4fv(location,count,value){if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)}function _glUniform4i(location,v0,v1,v2,v3){GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)}function _glUniformBlockBinding(program,uniformBlockIndex,uniformBlockBinding){program=GL.programs[program];GLctx["uniformBlockBinding"](program,uniformBlockIndex,uniformBlockBinding)}function _glUniformMatrix2fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix3fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*9);return}if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)}function _glUniformMatrix4fv(location,count,transpose,value){if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)}function _glUseProgram(program){program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program}function _glVertexAttrib4f(x0,x1,x2,x3,x4){GLctx["vertexAttrib4f"](x0,x1,x2,x3,x4)}function _glVertexAttrib4fv(index,v){GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])}function _glVertexAttribDivisor(index,divisor){GLctx["vertexAttribDivisor"](index,divisor)}function _glVertexAttribI4ui(x0,x1,x2,x3,x4){GLctx["vertexAttribI4ui"](x0,x1,x2,x3,x4)}function _glVertexAttribIPointer(index,size,type,stride,ptr){GLctx["vertexAttribIPointer"](index,size,type,stride,ptr)}function _glVertexAttribPointer(index,size,type,normalized,stride,ptr){GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)}function _glViewport(x0,x1,x2,x3){GLctx["viewport"](x0,x1,x2,x3)}var GodotRuntime={get_func:function(ptr){return wasmTable.get(ptr)},error:function(){err.apply(null,Array.from(arguments))},print:function(){out.apply(null,Array.from(arguments))},malloc:function(p_size){return _malloc(p_size)},free:function(p_ptr){_free(p_ptr)},getHeapValue:function(p_ptr,p_type){return getValue(p_ptr,p_type)},setHeapValue:function(p_ptr,p_value,p_type){setValue(p_ptr,p_value,p_type)},heapSub:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.subarray(p_ptr/bytes,p_ptr/bytes+p_len)},heapSlice:function(p_heap,p_ptr,p_len){const bytes=p_heap.BYTES_PER_ELEMENT;return p_heap.slice(p_ptr/bytes,p_ptr/bytes+p_len)},heapCopy:function(p_dst,p_src,p_ptr){const bytes=p_src.BYTES_PER_ELEMENT;return p_dst.set(p_src,p_ptr/bytes)},parseString:function(p_ptr){return UTF8ToString(p_ptr)},parseStringArray:function(p_ptr,p_size){const strings=[];const ptrs=GodotRuntime.heapSub(HEAP32,p_ptr,p_size);ptrs.forEach(function(ptr){strings.push(GodotRuntime.parseString(ptr))});return strings},strlen:function(p_str){return lengthBytesUTF8(p_str)},allocString:function(p_str){const length=GodotRuntime.strlen(p_str)+1;const c_str=GodotRuntime.malloc(length);stringToUTF8(p_str,c_str,length);return c_str},allocStringArray:function(p_strings){const size=p_strings.length;const c_ptr=GodotRuntime.malloc(size*4);for(let i=0;i>2)+i]=GodotRuntime.allocString(p_strings[i])}return c_ptr},freeStringArray:function(p_ptr,p_len){for(let i=0;i>2)+i])}GodotRuntime.free(p_ptr)},stringToHeap:function(p_str,p_ptr,p_len){return stringToUTF8Array(p_str,HEAP8,p_ptr,p_len)}};var GodotConfig={canvas:null,locale:"en",canvas_resize_policy:2,virtual_keyboard:false,persistent_drops:false,on_execute:null,on_exit:null,init_config:function(p_opts){GodotConfig.canvas_resize_policy=p_opts["canvasResizePolicy"];GodotConfig.canvas=p_opts["canvas"];GodotConfig.locale=p_opts["locale"]||GodotConfig.locale;GodotConfig.virtual_keyboard=p_opts["virtualKeyboard"];GodotConfig.persistent_drops=!!p_opts["persistentDrops"];GodotConfig.on_execute=p_opts["onExecute"];GodotConfig.on_exit=p_opts["onExit"];if(p_opts["focusCanvas"]){GodotConfig.canvas.focus()}},locate_file:function(file){return Module["locateFile"](file)},clear:function(){GodotConfig.canvas=null;GodotConfig.locale="en";GodotConfig.canvas_resize_policy=2;GodotConfig.virtual_keyboard=false;GodotConfig.persistent_drops=false;GodotConfig.on_execute=null;GodotConfig.on_exit=null}};var ERRNO_CODES={};var GodotFS={_idbfs:false,_syncing:false,_mount_points:[],is_persistent:function(){return GodotFS._idbfs?1:0},init:function(persistentPaths){GodotFS._idbfs=false;if(!Array.isArray(persistentPaths)){return Promise.reject(new Error("Persistent paths must be an array"))}if(!persistentPaths.length){return Promise.resolve()}GodotFS._mount_points=persistentPaths.slice();function createRecursive(dir){try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}}GodotFS._mount_points.forEach(function(path){createRecursive(path);FS.mount(IDBFS,{},path)});return new Promise(function(resolve,reject){FS.syncfs(true,function(err){if(err){GodotFS._mount_points=[];GodotFS._idbfs=false;GodotRuntime.print(`IndexedDB not available: ${err.message}`)}else{GodotFS._idbfs=true}resolve(err)})})},deinit:function(){GodotFS._mount_points.forEach(function(path){try{FS.unmount(path)}catch(e){GodotRuntime.print("Already unmounted",e)}if(GodotFS._idbfs&&IDBFS.dbs[path]){IDBFS.dbs[path].close();delete IDBFS.dbs[path]}});GodotFS._mount_points=[];GodotFS._idbfs=false;GodotFS._syncing=false},sync:function(){if(GodotFS._syncing){GodotRuntime.error("Already syncing!");return Promise.resolve()}GodotFS._syncing=true;return new Promise(function(resolve,reject){FS.syncfs(false,function(error){if(error){GodotRuntime.error(`Failed to save IDB file system: ${error.message}`)}GodotFS._syncing=false;resolve(error)})})},copy_to_fs:function(path,buffer){const idx=path.lastIndexOf("/");let dir="/";if(idx>0){dir=path.slice(0,idx)}try{FS.stat(dir)}catch(e){if(e.errno!==ERRNO_CODES.ENOENT){throw e}FS.mkdirTree(dir)}FS.writeFile(path,new Uint8Array(buffer))}};var GodotOS={request_quit:function(){},_async_cbs:[],_fs_sync_promise:null,atexit:function(p_promise_cb){GodotOS._async_cbs.push(p_promise_cb)},cleanup:function(exit_code){const cb=GodotConfig.on_exit;GodotFS.deinit();GodotConfig.clear();if(cb){cb(exit_code)}},finish_async:function(callback){GodotOS._fs_sync_promise.then(function(err){const promises=[];GodotOS._async_cbs.forEach(function(cb){promises.push(new Promise(cb))});return Promise.all(promises)}).then(function(){return GodotFS.sync()}).then(function(err){setTimeout(function(){callback()},0)})}};var GodotAudio={ctx:null,input:null,driver:null,interval:0,init:function(mix_rate,latency,onstatechange,onlatencyupdate){const opts={};if(mix_rate){opts["sampleRate"]=mix_rate}const ctx=new(window.AudioContext||window.webkitAudioContext)(opts);GodotAudio.ctx=ctx;ctx.onstatechange=function(){let state=0;switch(ctx.state){case"suspended":state=0;break;case"running":state=1;break;case"closed":state=2;break}onstatechange(state)};ctx.onstatechange();GodotAudio.interval=setInterval(function(){let computed_latency=0;if(ctx.baseLatency){computed_latency+=GodotAudio.ctx.baseLatency}if(ctx.outputLatency){computed_latency+=GodotAudio.ctx.outputLatency}onlatencyupdate(computed_latency)},1e3);GodotOS.atexit(GodotAudio.close_async);return ctx.destination.channelCount},create_input:function(callback){if(GodotAudio.input){return 0}function gotMediaInput(stream){try{GodotAudio.input=GodotAudio.ctx.createMediaStreamSource(stream);callback(GodotAudio.input)}catch(e){GodotRuntime.error("Failed creaating input.",e)}}if(navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){navigator.mediaDevices.getUserMedia({"audio":true}).then(gotMediaInput,function(e){GodotRuntime.error("Error getting user media.",e)})}else{if(!navigator.getUserMedia){navigator.getUserMedia=navigator.webkitGetUserMedia||navigator.mozGetUserMedia}if(!navigator.getUserMedia){GodotRuntime.error("getUserMedia not available.");return 1}navigator.getUserMedia({"audio":true},gotMediaInput,function(e){GodotRuntime.print(e)})}return 0},close_async:function(resolve,reject){const ctx=GodotAudio.ctx;GodotAudio.ctx=null;if(!ctx){resolve();return}if(GodotAudio.interval){clearInterval(GodotAudio.interval);GodotAudio.interval=0}if(GodotAudio.input){GodotAudio.input.disconnect();GodotAudio.input=null}let closed=Promise.resolve();if(GodotAudio.driver){closed=GodotAudio.driver.close()}closed.then(function(){return ctx.close()}).then(function(){ctx.onstatechange=null;resolve()}).catch(function(e){ctx.onstatechange=null;GodotRuntime.error("Error closing AudioContext",e);resolve()})}};function _godot_audio_capture_start(){return GodotAudio.create_input(function(input){input.connect(GodotAudio.driver.get_node())})}function _godot_audio_capture_stop(){if(GodotAudio.input){const tracks=GodotAudio.input["mediaStream"]["getTracks"]();for(let i=0;i=size){const high=size-wpos;wbuf.set(buffer.subarray(wpos,size));pending_samples-=high;wpos=0}if(pending_samples>0){wbuf.set(buffer.subarray(wpos,wpos+pending_samples),tot_sent-pending_samples)}port.postMessage({"cmd":"chunk","data":wbuf.subarray(0,tot_sent)});wpos+=pending_samples;pending_samples=0}this.receive=function(recv_buf){const buffer=GodotRuntime.heapSub(HEAPF32,p_in_buf,p_in_size);const from=rpos;let to_write=recv_buf.length;let high=0;if(rpos+to_write>=p_in_size){high=p_in_size-rpos;buffer.set(recv_buf.subarray(0,high),rpos);to_write-=high;rpos=0}if(to_write){buffer.set(recv_buf.subarray(high,to_write),rpos)}in_callback(from,recv_buf.length);rpos+=to_write};this.consumed=function(size,port){pending_samples+=size;send(port)}}GodotAudioWorklet.ring_buffer=new RingBuffer;GodotAudioWorklet.promise.then(function(){const node=GodotAudioWorklet.worklet;const buffer=GodotRuntime.heapSlice(HEAPF32,p_out_buf,p_out_size);node.connect(GodotAudio.ctx.destination);node.port.postMessage({"cmd":"start_nothreads","data":[buffer,p_in_size]});node.port.onmessage=function(event){if(!GodotAudioWorklet.worklet){return}if(event.data["cmd"]==="read"){const read=event.data["data"];GodotAudioWorklet.ring_buffer.consumed(read,GodotAudioWorklet.worklet.port)}else if(event.data["cmd"]==="input"){const buf=event.data["data"];if(buf.length>p_in_size){GodotRuntime.error("Input chunk is too big");return}GodotAudioWorklet.ring_buffer.receive(buf)}else{GodotRuntime.error(event.data)}}})},get_node:function(){return GodotAudioWorklet.worklet},close:function(){return new Promise(function(resolve,reject){if(GodotAudioWorklet.promise===null){return}GodotAudioWorklet.promise.then(function(){GodotAudioWorklet.worklet.port.postMessage({"cmd":"stop","data":null});GodotAudioWorklet.worklet.disconnect();GodotAudioWorklet.worklet=null;GodotAudioWorklet.promise=null;resolve()}).catch(function(err){})})}};function _godot_audio_worklet_create(channels){try{GodotAudioWorklet.create(channels)}catch(e){GodotRuntime.error("Error starting AudioDriverWorklet",e);return 1}return 0}function _godot_audio_worklet_start_no_threads(p_out_buf,p_out_size,p_out_callback,p_in_buf,p_in_size,p_in_callback){const out_callback=GodotRuntime.get_func(p_out_callback);const in_callback=GodotRuntime.get_func(p_in_callback);GodotAudioWorklet.start_no_threads(p_out_buf,p_out_size,out_callback,p_in_buf,p_in_size,in_callback)}function _godot_js_config_canvas_id_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(`#${GodotConfig.canvas.id}`,p_ptr,p_ptr_max)}function _godot_js_config_locale_get(p_ptr,p_ptr_max){GodotRuntime.stringToHeap(GodotConfig.locale,p_ptr,p_ptr_max)}var GodotDisplayCursor={shape:"auto",visible:true,cursors:{},set_style:function(style){GodotConfig.canvas.style.cursor=style},set_shape:function(shape){GodotDisplayCursor.shape=shape;let css=shape;if(shape in GodotDisplayCursor.cursors){const c=GodotDisplayCursor.cursors[shape];css=`url("${c.url}") ${c.x} ${c.y}, auto`}if(GodotDisplayCursor.visible){GodotDisplayCursor.set_style(css)}},clear:function(){GodotDisplayCursor.set_style("");GodotDisplayCursor.shape="auto";GodotDisplayCursor.visible=true;Object.keys(GodotDisplayCursor.cursors).forEach(function(key){URL.revokeObjectURL(GodotDisplayCursor.cursors[key]);delete GodotDisplayCursor.cursors[key]})},lockPointer:function(){const canvas=GodotConfig.canvas;if(canvas.requestPointerLock){canvas.requestPointerLock()}},releasePointer:function(){if(document.exitPointerLock){document.exitPointerLock()}},isPointerLocked:function(){return document.pointerLockElement===GodotConfig.canvas}};var GodotEventListeners={handlers:[],has:function(target,event,method,capture){return GodotEventListeners.handlers.findIndex(function(e){return e.target===target&&e.event===event&&e.method===method&&e.capture===capture})!==-1},add:function(target,event,method,capture){if(GodotEventListeners.has(target,event,method,capture)){return}function Handler(p_target,p_event,p_method,p_capture){this.target=p_target;this.event=p_event;this.method=p_method;this.capture=p_capture}GodotEventListeners.handlers.push(new Handler(target,event,method,capture));target.addEventListener(event,method,capture)},clear:function(){GodotEventListeners.handlers.forEach(function(h){h.target.removeEventListener(h.event,h.method,h.capture)});GodotEventListeners.handlers.length=0}};function _emscripten_webgl_do_get_current_context(){return GL.currentContext?GL.currentContext.handle:0}function _emscripten_webgl_get_current_context(){return _emscripten_webgl_do_get_current_context()}var GodotDisplayScreen={desired_size:[0,0],hidpi:true,getPixelRatio:function(){return GodotDisplayScreen.hidpi?window.devicePixelRatio||1:1},isFullscreen:function(){const elem=document.fullscreenElement||document.mozFullscreenElement||document.webkitFullscreenElement||document.msFullscreenElement;if(elem){return elem===GodotConfig.canvas}return document.fullscreen||document.mozFullScreen||document.webkitIsFullscreen},hasFullscreen:function(){return document.fullscreenEnabled||document.mozFullScreenEnabled||document.webkitFullscreenEnabled},requestFullscreen:function(){if(!GodotDisplayScreen.hasFullscreen()){return 1}const canvas=GodotConfig.canvas;try{const promise=(canvas.requestFullscreen||canvas.msRequestFullscreen||canvas.mozRequestFullScreen||canvas.mozRequestFullscreen||canvas.webkitRequestFullscreen).call(canvas);if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},exitFullscreen:function(){if(!GodotDisplayScreen.isFullscreen()){return 0}try{const promise=document.exitFullscreen();if(promise){promise.catch(function(){})}}catch(e){return 1}return 0},_updateGL:function(){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){GL.resizeOffscreenFramebuffer(gl)}},updateSize:function(){const isFullscreen=GodotDisplayScreen.isFullscreen();const wantsFullWindow=GodotConfig.canvas_resize_policy===2;const noResize=GodotConfig.canvas_resize_policy===0;const wwidth=GodotDisplayScreen.desired_size[0];const wheight=GodotDisplayScreen.desired_size[1];const canvas=GodotConfig.canvas;let width=wwidth;let height=wheight;if(noResize){if(canvas.width!==width||canvas.height!==height){GodotDisplayScreen.desired_size=[canvas.width,canvas.height];GodotDisplayScreen._updateGL();return 1}return 0}const scale=GodotDisplayScreen.getPixelRatio();if(isFullscreen||wantsFullWindow){width=window.innerWidth*scale;height=window.innerHeight*scale}const csw=`${width/scale}px`;const csh=`${height/scale}px`;if(canvas.style.width!==csw||canvas.style.height!==csh||canvas.width!==width||canvas.height!==height){canvas.width=width;canvas.height=height;canvas.style.width=csw;canvas.style.height=csh;GodotDisplayScreen._updateGL();return 1}return 0}};var GodotDisplayVK={textinput:null,textarea:null,available:function(){return GodotConfig.virtual_keyboard&&"ontouchstart"in window},init:function(input_cb){function create(what){const elem=document.createElement(what);elem.style.display="none";elem.style.position="absolute";elem.style.zIndex="-1";elem.style.background="transparent";elem.style.padding="0px";elem.style.margin="0px";elem.style.overflow="hidden";elem.style.width="0px";elem.style.height="0px";elem.style.border="0px";elem.style.outline="none";elem.readonly=true;elem.disabled=true;GodotEventListeners.add(elem,"input",function(evt){const c_str=GodotRuntime.allocString(elem.value);input_cb(c_str,elem.selectionEnd);GodotRuntime.free(c_str)},false);GodotEventListeners.add(elem,"blur",function(evt){elem.style.display="none";elem.readonly=true;elem.disabled=true},false);GodotConfig.canvas.insertAdjacentElement("beforebegin",elem);return elem}GodotDisplayVK.textinput=create("input");GodotDisplayVK.textarea=create("textarea");GodotDisplayVK.updateSize()},show:function(text,multiline,start,end){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}if(GodotDisplayVK.textinput.style.display!==""||GodotDisplayVK.textarea.style.display!==""){GodotDisplayVK.hide()}GodotDisplayVK.updateSize();const elem=multiline?GodotDisplayVK.textarea:GodotDisplayVK.textinput;elem.readonly=false;elem.disabled=false;elem.value=text;elem.style.display="block";elem.focus();elem.setSelectionRange(start,end)},hide:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}[GodotDisplayVK.textinput,GodotDisplayVK.textarea].forEach(function(elem){elem.blur();elem.style.display="none";elem.value=""})},updateSize:function(){if(!GodotDisplayVK.textinput||!GodotDisplayVK.textarea){return}const rect=GodotConfig.canvas.getBoundingClientRect();function update(elem){elem.style.left=`${rect.left}px`;elem.style.top=`${rect.top}px`;elem.style.width=`${rect.width}px`;elem.style.height=`${rect.height}px`}update(GodotDisplayVK.textinput);update(GodotDisplayVK.textarea)},clear:function(){if(GodotDisplayVK.textinput){GodotDisplayVK.textinput.remove();GodotDisplayVK.textinput=null}if(GodotDisplayVK.textarea){GodotDisplayVK.textarea.remove();GodotDisplayVK.textarea=null}}};var GodotDisplay={window_icon:"",findDPI:function(){function testDPI(dpi){return window.matchMedia(`(max-resolution: ${dpi}dpi)`).matches}function bisect(low,high,func){const mid=parseInt((high-low)/2+low,10);if(high-low<=1){return func(high)?high:low}if(func(mid)){return bisect(low,mid,func)}return bisect(mid,high,func)}try{const dpi=bisect(0,800,testDPI);return dpi>=96?dpi:96}catch(e){return 96}}};function _godot_js_display_alert(p_text){window.alert(GodotRuntime.parseString(p_text))}function _godot_js_display_canvas_focus(){GodotConfig.canvas.focus()}function _godot_js_display_canvas_is_focused(){return document.activeElement===GodotConfig.canvas}function _godot_js_display_clipboard_get(callback){const func=GodotRuntime.get_func(callback);try{navigator.clipboard.readText().then(function(result){const ptr=GodotRuntime.allocString(result);func(ptr);GodotRuntime.free(ptr)}).catch(function(e){})}catch(e){}}function _godot_js_display_clipboard_set(p_text){const text=GodotRuntime.parseString(p_text);if(!navigator.clipboard||!navigator.clipboard.writeText){return 1}navigator.clipboard.writeText(text).catch(function(e){GodotRuntime.error("Setting OS clipboard is only possible from an input callback for the HTML5 plafrom. Exception:",e)});return 0}function _godot_js_display_cursor_is_hidden(){return!GodotDisplayCursor.visible}function _godot_js_display_cursor_is_locked(){return GodotDisplayCursor.isPointerLocked()?1:0}function _godot_js_display_cursor_lock_set(p_lock){if(p_lock){GodotDisplayCursor.lockPointer()}else{GodotDisplayCursor.releasePointer()}}function _godot_js_display_cursor_set_custom_shape(p_shape,p_ptr,p_len,p_hotspot_x,p_hotspot_y){const shape=GodotRuntime.parseString(p_shape);const old_shape=GodotDisplayCursor.cursors[shape];if(p_len>0){const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});const url=URL.createObjectURL(png);GodotDisplayCursor.cursors[shape]={url:url,x:p_hotspot_x,y:p_hotspot_y}}else{delete GodotDisplayCursor.cursors[shape]}if(shape===GodotDisplayCursor.shape){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}if(old_shape){URL.revokeObjectURL(old_shape.url)}}function _godot_js_display_cursor_set_shape(p_string){GodotDisplayCursor.set_shape(GodotRuntime.parseString(p_string))}function _godot_js_display_cursor_set_visible(p_visible){const visible=p_visible!==0;if(visible===GodotDisplayCursor.visible){return}GodotDisplayCursor.visible=visible;if(visible){GodotDisplayCursor.set_shape(GodotDisplayCursor.shape)}else{GodotDisplayCursor.set_style("none")}}function _godot_js_display_desired_size_set(width,height){GodotDisplayScreen.desired_size=[width,height];GodotDisplayScreen.updateSize()}function _godot_js_display_fullscreen_cb(callback){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);function change_cb(evt){if(evt.target===canvas){func(GodotDisplayScreen.isFullscreen())}}GodotEventListeners.add(document,"fullscreenchange",change_cb,false);GodotEventListeners.add(document,"mozfullscreenchange",change_cb,false);GodotEventListeners.add(document,"webkitfullscreenchange",change_cb,false)}function _godot_js_display_fullscreen_exit(){return GodotDisplayScreen.exitFullscreen()}function _godot_js_display_fullscreen_request(){return GodotDisplayScreen.requestFullscreen()}function _godot_js_display_glGetBufferSubData(target,offset,size,data){const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle);if(gl){gl.GLctx["getBufferSubData"](target,offset,HEAPU8,data,size)}}function _godot_js_display_has_webgl(p_version){if(p_version!==1&&p_version!==2){return false}try{return!!document.createElement("canvas").getContext(p_version===2?"webgl2":"webgl")}catch(e){}return false}function _godot_js_display_is_swap_ok_cancel(){const win=["Windows","Win64","Win32","WinCE"];const plat=navigator.platform||"";if(win.indexOf(plat)!==-1){return 1}return 0}function _godot_js_display_notification_cb(callback,p_enter,p_exit,p_in,p_out){const canvas=GodotConfig.canvas;const func=GodotRuntime.get_func(callback);const notif=[p_enter,p_exit,p_in,p_out];["mouseover","mouseleave","focus","blur"].forEach(function(evt_name,idx){GodotEventListeners.add(canvas,evt_name,function(){func(notif[idx])},true)})}function _godot_js_display_pixel_ratio_get(){return GodotDisplayScreen.getPixelRatio()}function _godot_js_display_screen_dpi_get(){return GodotDisplay.findDPI()}function _godot_js_display_screen_size_get(width,height){const scale=GodotDisplayScreen.getPixelRatio();GodotRuntime.setHeapValue(width,window.screen.width*scale,"i32");GodotRuntime.setHeapValue(height,window.screen.height*scale,"i32")}function _godot_js_display_setup_canvas(p_width,p_height,p_fullscreen,p_hidpi){const canvas=GodotConfig.canvas;GodotEventListeners.add(canvas,"contextmenu",function(ev){ev.preventDefault()},false);GodotEventListeners.add(canvas,"webglcontextlost",function(ev){alert("WebGL context lost, please reload the page");ev.preventDefault()},false);GodotDisplayScreen.hidpi=!!p_hidpi;switch(GodotConfig.canvas_resize_policy){case 0:GodotDisplayScreen.desired_size=[canvas.width,canvas.height];break;case 1:GodotDisplayScreen.desired_size=[p_width,p_height];break;default:canvas.style.position="absolute";canvas.style.top=0;canvas.style.left=0;break}GodotDisplayScreen.updateSize();if(p_fullscreen){GodotDisplayScreen.requestFullscreen()}}function _godot_js_display_size_update(){const updated=GodotDisplayScreen.updateSize();if(updated){GodotDisplayVK.updateSize()}return updated}function _godot_js_display_touchscreen_is_available(){return"ontouchstart"in window}function _godot_js_display_vk_available(){return GodotDisplayVK.available()}function _godot_js_display_vk_cb(p_input_cb){const input_cb=GodotRuntime.get_func(p_input_cb);if(GodotDisplayVK.available()){GodotDisplayVK.init(input_cb)}}function _godot_js_display_vk_hide(){GodotDisplayVK.hide()}function _godot_js_display_vk_show(p_text,p_multiline,p_start,p_end){const text=GodotRuntime.parseString(p_text);const start=p_start>0?p_start:0;const end=p_end>0?p_end:start;GodotDisplayVK.show(text,p_multiline,start,end)}function _godot_js_display_window_blur_cb(callback){const func=GodotRuntime.get_func(callback);GodotEventListeners.add(window,"blur",function(){func()},false)}function _godot_js_display_window_icon_set(p_ptr,p_len){let link=document.getElementById("-gd-engine-icon");if(link===null){link=document.createElement("link");link.rel="icon";link.id="-gd-engine-icon";document.head.appendChild(link)}const old_icon=GodotDisplay.window_icon;const png=new Blob([GodotRuntime.heapSlice(HEAPU8,p_ptr,p_len)],{type:"image/png"});GodotDisplay.window_icon=URL.createObjectURL(png);link.href=GodotDisplay.window_icon;if(old_icon){URL.revokeObjectURL(old_icon)}}function _godot_js_display_window_size_get(p_width,p_height){GodotRuntime.setHeapValue(p_width,GodotConfig.canvas.width,"i32");GodotRuntime.setHeapValue(p_height,GodotConfig.canvas.height,"i32")}function _godot_js_display_window_title_set(p_data){document.title=GodotRuntime.parseString(p_data)}function _godot_js_eval(p_js,p_use_global_ctx,p_union_ptr,p_byte_arr,p_byte_arr_write,p_callback){const js_code=GodotRuntime.parseString(p_js);let eval_ret=null;try{if(p_use_global_ctx){const global_eval=eval;eval_ret=global_eval(js_code)}else{eval_ret=eval(js_code)}}catch(e){GodotRuntime.error(e)}switch(typeof eval_ret){case"boolean":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"i32");return 1;case"number":GodotRuntime.setHeapValue(p_union_ptr,eval_ret,"double");return 3;case"string":GodotRuntime.setHeapValue(p_union_ptr,GodotRuntime.allocString(eval_ret),"*");return 4;case"object":if(eval_ret===null){break}if(ArrayBuffer.isView(eval_ret)&&!(eval_ret instanceof Uint8Array)){eval_ret=new Uint8Array(eval_ret.buffer)}else if(eval_ret instanceof ArrayBuffer){eval_ret=new Uint8Array(eval_ret)}if(eval_ret instanceof Uint8Array){const func=GodotRuntime.get_func(p_callback);const bytes_ptr=func(p_byte_arr,p_byte_arr_write,eval_ret.length);HEAPU8.set(eval_ret,bytes_ptr);return 20}break}return 0}var IDHandler={_last_id:0,_references:{},get:function(p_id){return IDHandler._references[p_id]},add:function(p_data){const id=++IDHandler._last_id;IDHandler._references[id]=p_data;return id},remove:function(p_id){delete IDHandler._references[p_id]}};var GodotFetch={onread:function(id,result){const obj=IDHandler.get(id);if(!obj){return}if(result.value){obj.chunks.push(result.value)}obj.reading=false;obj.done=result.done},onresponse:function(id,response){const obj=IDHandler.get(id);if(!obj){return}let chunked=false;response.headers.forEach(function(value,header){const v=value.toLowerCase().trim();const h=header.toLowerCase().trim();if(h==="transfer-encoding"&&v==="chunked"){chunked=true}});obj.status=response.status;obj.response=response;obj.reader=response.body.getReader();obj.chunked=chunked},onerror:function(id,err){GodotRuntime.error(err);const obj=IDHandler.get(id);if(!obj){return}obj.error=err},create:function(method,url,headers,body){const obj={request:null,response:null,reader:null,error:null,done:false,reading:false,status:0,chunks:[],bodySize:-1};const id=IDHandler.add(obj);const init={method:method,headers:headers,body:body};obj.request=fetch(url,init);obj.request.then(GodotFetch.onresponse.bind(null,id)).catch(GodotFetch.onerror.bind(null,id));return id},free:function(id){const obj=IDHandler.get(id);if(!obj){return}IDHandler.remove(id);if(!obj.request){return}obj.request.then(function(response){response.abort()}).catch(function(e){})},read:function(id){const obj=IDHandler.get(id);if(!obj){return}if(obj.reader&&!obj.reading){if(obj.done){obj.reader=null;return}obj.reading=true;obj.reader.read().then(GodotFetch.onread.bind(null,id)).catch(GodotFetch.onerror.bind(null,id))}}};function _godot_js_fetch_body_length_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.bodySize}function _godot_js_fetch_create(p_method,p_url,p_headers,p_headers_size,p_body,p_body_size){const method=GodotRuntime.parseString(p_method);const url=GodotRuntime.parseString(p_url);const headers=GodotRuntime.parseStringArray(p_headers,p_headers_size);const body=p_body_size?GodotRuntime.heapSlice(HEAP8,p_body,p_body_size):null;return GodotFetch.create(method,url,headers.map(function(hv){const idx=hv.indexOf(":");if(idx<=0){return[]}return[hv.slice(0,idx).trim(),hv.slice(idx+1).trim()]}).filter(function(v){return v.length===2}),body)}function _godot_js_fetch_free(id){GodotFetch.free(id)}function _godot_js_fetch_http_status_get(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}return obj.status}function _godot_js_fetch_is_chunked(p_id){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return-1}return obj.chunked?1:0}function _godot_js_fetch_read_chunk(p_id,p_buf,p_buf_size){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 0}let to_read=p_buf_size;const chunks=obj.chunks;while(to_read&&chunks.length){const chunk=obj.chunks[0];if(chunk.length>to_read){GodotRuntime.heapCopy(HEAP8,chunk.slice(0,to_read),p_buf);chunks[0]=chunk.slice(to_read);to_read=0}else{GodotRuntime.heapCopy(HEAP8,chunk,p_buf);to_read-=chunk.length;chunks.pop()}}if(!chunks.length){GodotFetch.read(p_id)}return p_buf_size-to_read}function _godot_js_fetch_read_headers(p_id,p_parse_cb,p_ref){const obj=IDHandler.get(p_id);if(!obj||!obj.response){return 1}const cb=GodotRuntime.get_func(p_parse_cb);const arr=[];obj.response.headers.forEach(function(v,h){arr.push(`${h}:${v}`)});const c_ptr=GodotRuntime.allocStringArray(arr);cb(arr.length,c_ptr,p_ref);GodotRuntime.freeStringArray(c_ptr,arr.length);return 0}function _godot_js_fetch_state_get(p_id){const obj=IDHandler.get(p_id);if(!obj){return-1}if(obj.error){return-1}if(!obj.response){return 0}if(obj.reader){return 1}if(obj.done){return 2}return-1}var GodotInputGamepads={samples:[],get_pads:function(){try{const pads=navigator.getGamepads();if(pads){return pads}return[]}catch(e){return[]}},get_samples:function(){return GodotInputGamepads.samples},get_sample:function(index){const samples=GodotInputGamepads.samples;return index=0){os="Android"}else if(ua.indexOf("Linux")>=0){os="Linux"}else if(ua.indexOf("iPhone")>=0){os="iOS"}else if(ua.indexOf("Macintosh")>=0){os="MacOSX"}else if(ua.indexOf("Windows")>=0){os="Windows"}const id=pad.id;const exp1=/vendor: ([0-9a-f]{4}) product: ([0-9a-f]{4})/i;const exp2=/^([0-9a-f]+)-([0-9a-f]+)-/i;let vendor="";let product="";if(exp1.test(id)){const match=exp1.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}else if(exp2.test(id)){const match=exp2.exec(id);vendor=match[1].padStart(4,"0");product=match[2].padStart(4,"0")}if(!vendor||!product){return`${os}Unknown`}return os+vendor+product}};var GodotInputDragDrop={promises:[],pending_files:[],add_entry:function(entry){if(entry.isDirectory){GodotInputDragDrop.add_dir(entry)}else if(entry.isFile){GodotInputDragDrop.add_file(entry)}else{GodotRuntime.error("Unrecognized entry...",entry)}},add_dir:function(entry){GodotInputDragDrop.promises.push(new Promise(function(resolve,reject){const reader=entry.createReader();reader.readEntries(function(entries){for(let i=0;i{const path=elem["path"];GodotFS.copy_to_fs(DROP+path,elem["data"]);let idx=path.indexOf("/");if(idx===-1){drops.push(DROP+path)}else{const sub=path.substr(0,idx);idx=sub.indexOf("/");if(idx<0&&drops.indexOf(DROP+sub)===-1){drops.push(DROP+sub)}}files.push(DROP+path)});GodotInputDragDrop.promises=[];GodotInputDragDrop.pending_files=[];callback(drops);if(GodotConfig.persistent_drops){GodotOS.atexit(function(resolve,reject){GodotInputDragDrop.remove_drop(files,DROP);resolve()})}else{GodotInputDragDrop.remove_drop(files,DROP)}})},remove_drop:function(files,drop_path){const dirs=[drop_path.substr(0,drop_path.length-1)];files.forEach(function(file){FS.unlink(file);let dir=file.replace(drop_path,"");let idx=dir.lastIndexOf("/");while(idx>0){dir=dir.substr(0,idx);if(dirs.indexOf(drop_path+dir)===-1){dirs.push(drop_path+dir)}idx=dir.lastIndexOf("/")}});dirs.sort(function(a,b){const al=(a.match(/\//g)||[]).length;const bl=(b.match(/\//g)||[]).length;if(al>bl){return-1}else if(al{if(GodotWebXR.session&&GodotWebXR.space){const onFrame=function(time,frame){GodotWebXR.frame=frame;GodotWebXR.pose=frame.getViewerPose(GodotWebXR.space);callback(time);GodotWebXR.frame=null;GodotWebXR.pose=null};GodotWebXR.session.requestAnimationFrame(onFrame)}else{GodotWebXR.orig_requestAnimationFrame(callback)}},monkeyPatchRequestAnimationFrame:enable=>{if(GodotWebXR.orig_requestAnimationFrame===null){GodotWebXR.orig_requestAnimationFrame=Browser.requestAnimationFrame}Browser.requestAnimationFrame=enable?GodotWebXR.requestAnimationFrame:GodotWebXR.orig_requestAnimationFrame},pauseResumeMainLoop:()=>{Browser.mainLoop.pause();window.setTimeout(function(){Browser.mainLoop.resume()},0)},shaderProgram:null,programInfo:null,buffer:null,vsSource:"\n\t\t\tconst vec2 scale = vec2(0.5, 0.5);\n\t\t\tattribute vec4 aVertexPosition;\n\n\t\t\tvarying highp vec2 vTextureCoord;\n\n\t\t\tvoid main () {\n\t\t\t\tgl_Position = aVertexPosition;\n\t\t\t\tvTextureCoord = aVertexPosition.xy * scale + scale;\n\t\t\t}\n\t\t",fsSource:"\n\t\t\tvarying highp vec2 vTextureCoord;\n\n\t\t\tuniform sampler2D uSampler;\n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D(uSampler, vTextureCoord);\n\t\t\t}\n\t\t",initShaderProgram:(gl,vsSource,fsSource)=>{const vertexShader=GodotWebXR.loadShader(gl,gl.VERTEX_SHADER,vsSource);const fragmentShader=GodotWebXR.loadShader(gl,gl.FRAGMENT_SHADER,fsSource);const shaderProgram=gl.createProgram();gl.attachShader(shaderProgram,vertexShader);gl.attachShader(shaderProgram,fragmentShader);gl.linkProgram(shaderProgram);if(!gl.getProgramParameter(shaderProgram,gl.LINK_STATUS)){GodotRuntime.error(`Unable to initialize the shader program: ${gl.getProgramInfoLog(shaderProgram)}`);return null}return shaderProgram},loadShader:(gl,type,source)=>{const shader=gl.createShader(type);gl.shaderSource(shader,source);gl.compileShader(shader);if(!gl.getShaderParameter(shader,gl.COMPILE_STATUS)){GodotRuntime.error(`An error occurred compiling the shader: ${gl.getShaderInfoLog(shader)}`);gl.deleteShader(shader);return null}return shader},initBuffer:gl=>{const positionBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);const positions=[-1,-1,1,-1,-1,1,1,1];gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(positions),gl.STATIC_DRAW);return positionBuffer},blitTexture:(gl,texture)=>{if(GodotWebXR.shaderProgram===null){GodotWebXR.shaderProgram=GodotWebXR.initShaderProgram(gl,GodotWebXR.vsSource,GodotWebXR.fsSource);GodotWebXR.programInfo={program:GodotWebXR.shaderProgram,attribLocations:{vertexPosition:gl.getAttribLocation(GodotWebXR.shaderProgram,"aVertexPosition")},uniformLocations:{uSampler:gl.getUniformLocation(GodotWebXR.shaderProgram,"uSampler")}};GodotWebXR.buffer=GodotWebXR.initBuffer(gl)}const orig_program=gl.getParameter(gl.CURRENT_PROGRAM);gl.useProgram(GodotWebXR.shaderProgram);gl.bindBuffer(gl.ARRAY_BUFFER,GodotWebXR.buffer);gl.vertexAttribPointer(GodotWebXR.programInfo.attribLocations.vertexPosition,2,gl.FLOAT,false,0,0);gl.enableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,texture);gl.uniform1i(GodotWebXR.programInfo.uniformLocations.uSampler,0);gl.drawArrays(gl.TRIANGLE_STRIP,0,4);gl.bindTexture(gl.TEXTURE_2D,null);gl.disableVertexAttribArray(GodotWebXR.programInfo.attribLocations.vertexPosition);gl.bindBuffer(gl.ARRAY_BUFFER,null);gl.useProgram(orig_program)},controllers:[],sampleControllers:()=>{if(!GodotWebXR.session){return}let other_index=2;const controllers=[];GodotWebXR.session.inputSources.forEach(input_source=>{if(input_source.targetRayMode==="tracked-pointer"){if(input_source.handedness==="right"){controllers[1]=input_source}else if(input_source.handedness==="left"||!controllers[0]){controllers[0]=input_source}}else{controllers[other_index++]=input_source}});GodotWebXR.controllers=controllers},getControllerId:input_source=>GodotWebXR.controllers.indexOf(input_source)};function _godot_webxr_commit_for_eye(p_eye,p_texture_id){if(!GodotWebXR.session||!GodotWebXR.pose){return}const view_index=p_eye===2?1:0;const glLayer=GodotWebXR.session.renderState.baseLayer;const view=GodotWebXR.pose.views[view_index];const viewport=glLayer.getViewport(view);const gl=GodotWebXR.gl;const orig_framebuffer=gl.getParameter(gl.FRAMEBUFFER_BINDING);const orig_viewport=gl.getParameter(gl.VIEWPORT);gl.bindFramebuffer(gl.FRAMEBUFFER,glLayer.framebuffer);gl.viewport(viewport.x,viewport.y,viewport.width,viewport.height);GodotWebXR.blitTexture(gl,GL.textures[p_texture_id]);gl.bindFramebuffer(gl.FRAMEBUFFER,orig_framebuffer);gl.viewport(orig_viewport[0],orig_viewport[1],orig_viewport[2],orig_viewport[3])}function _godot_webxr_get_bounds_geometry(){if(!GodotWebXR.space||!GodotWebXR.space.boundsGeometry){return 0}const point_count=GodotWebXR.space.boundsGeometry.length;if(point_count===0){return 0}const buf=GodotRuntime.malloc((point_count*3+1)*4);GodotRuntime.setHeapValue(buf,point_count,"i32");for(let i=0;i=GodotWebXR.controllers.length){return 0}const controller=GodotWebXR.controllers[p_controller];if(!controller){return 0}switch(controller.targetRayMode){case"gaze":return 1;case"tracked-pointer":return 2;case"screen":return 3;default:break}return 0}function _godot_webxr_get_controller_transform(p_controller){if(!GodotWebXR.session||!GodotWebXR.frame){return 0}const controller=GodotWebXR.controllers[p_controller];if(!controller){return 0}const frame=GodotWebXR.frame;const space=GodotWebXR.space;const pose=frame.getPose(controller.targetRaySpace,space);if(!pose){return 0}const matrix=pose.transform.matrix;const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_projection_for_eye(p_eye){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const view_index=p_eye===2?1:0;const matrix=GodotWebXR.pose.views[view_index].projectionMatrix;const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_render_targetsize(){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const glLayer=GodotWebXR.session.renderState.baseLayer;const view=GodotWebXR.pose.views[0];const viewport=glLayer.getViewport(view);const buf=GodotRuntime.malloc(2*4);GodotRuntime.setHeapValue(buf+0,viewport.width,"i32");GodotRuntime.setHeapValue(buf+4,viewport.height,"i32");return buf}function _godot_webxr_get_transform_for_eye(p_eye){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}const views=GodotWebXR.pose.views;let matrix;if(p_eye===0){matrix=GodotWebXR.pose.transform.matrix}else{matrix=views[p_eye-1].transform.matrix}const buf=GodotRuntime.malloc(16*4);for(let i=0;i<16;i++){GodotRuntime.setHeapValue(buf+i*4,matrix[i],"float")}return buf}function _godot_webxr_get_view_count(){if(!GodotWebXR.session||!GodotWebXR.pose){return 0}return GodotWebXR.pose.views.length}function _godot_webxr_get_visibility_state(){if(!GodotWebXR.session||!GodotWebXR.session.visibilityState){return 0}return GodotRuntime.allocString(GodotWebXR.session.visibilityState)}function _godot_webxr_initialize(p_session_mode,p_required_features,p_optional_features,p_requested_reference_spaces,p_on_session_started,p_on_session_ended,p_on_session_failed,p_on_controller_changed,p_on_input_event,p_on_simple_event){GodotWebXR.monkeyPatchRequestAnimationFrame(true);const session_mode=GodotRuntime.parseString(p_session_mode);const required_features=GodotRuntime.parseString(p_required_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const optional_features=GodotRuntime.parseString(p_optional_features).split(",").map(s=>s.trim()).filter(s=>s!=="");const requested_reference_space_types=GodotRuntime.parseString(p_requested_reference_spaces).split(",").map(s=>s.trim());const onstarted=GodotRuntime.get_func(p_on_session_started);const onended=GodotRuntime.get_func(p_on_session_ended);const onfailed=GodotRuntime.get_func(p_on_session_failed);const oncontroller=GodotRuntime.get_func(p_on_controller_changed);const oninputevent=GodotRuntime.get_func(p_on_input_event);const onsimpleevent=GodotRuntime.get_func(p_on_simple_event);const session_init={};if(required_features.length>0){session_init["requiredFeatures"]=required_features}if(optional_features.length>0){session_init["optionalFeatures"]=optional_features}navigator.xr.requestSession(session_mode,session_init).then(function(session){GodotWebXR.session=session;session.addEventListener("end",function(evt){onended()});session.addEventListener("inputsourceschange",function(evt){let controller_changed=false;[evt.added,evt.removed].forEach(lst=>{lst.forEach(input_source=>{if(input_source.targetRayMode==="tracked-pointer"){controller_changed=true}})});if(controller_changed){oncontroller()}});["selectstart","selectend","select","squeezestart","squeezeend","squeeze"].forEach((input_event,index)=>{session.addEventListener(input_event,function(evt){GodotWebXR.sampleControllers();oninputevent(index,GodotWebXR.getControllerId(evt.inputSource))})});session.addEventListener("visibilitychange",function(evt){const c_str=GodotRuntime.allocString("visibility_state_changed");onsimpleevent(c_str);GodotRuntime.free(c_str)});const gl_context_handle=_emscripten_webgl_get_current_context();const gl=GL.getContext(gl_context_handle).GLctx;GodotWebXR.gl=gl;gl.makeXRCompatible().then(function(){session.updateRenderState({baseLayer:new XRWebGLLayer(session,gl)});function onReferenceSpaceSuccess(reference_space,reference_space_type){GodotWebXR.space=reference_space;reference_space.onreset=function(evt){const c_str=GodotRuntime.allocString("reference_space_reset");onsimpleevent(c_str);GodotRuntime.free(c_str)};GodotWebXR.pauseResumeMainLoop();window.setTimeout(function(){const c_str=GodotRuntime.allocString(reference_space_type);onstarted(c_str);GodotRuntime.free(c_str)},0)}function requestReferenceSpace(){const reference_space_type=requested_reference_space_types.shift();session.requestReferenceSpace(reference_space_type).then(refSpace=>{onReferenceSpaceSuccess(refSpace,reference_space_type)}).catch(()=>{if(requested_reference_space_types.length===0){const c_str=GodotRuntime.allocString("Unable to get any of the requested reference space types");onfailed(c_str);GodotRuntime.free(c_str)}else{requestReferenceSpace()}})}requestReferenceSpace()}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to make WebGL context compatible with WebXR: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}).catch(function(error){const c_str=GodotRuntime.allocString(`Unable to start session: ${error}`);onfailed(c_str);GodotRuntime.free(c_str)})}function _godot_webxr_is_controller_connected(p_controller){if(!GodotWebXR.session||!GodotWebXR.frame){return false}return!!GodotWebXR.controllers[p_controller]}function _godot_webxr_is_session_supported(p_session_mode,p_callback){const session_mode=GodotRuntime.parseString(p_session_mode);const cb=GodotRuntime.get_func(p_callback);if(navigator.xr){navigator.xr.isSessionSupported(session_mode).then(function(supported){const c_str=GodotRuntime.allocString(session_mode);cb(c_str,supported?1:0);GodotRuntime.free(c_str)})}else{const c_str=GodotRuntime.allocString(session_mode);cb(c_str,0);GodotRuntime.free(c_str)}}function _godot_webxr_is_supported(){return!!navigator.xr}function _godot_webxr_sample_controller_data(){GodotWebXR.sampleControllers()}function _godot_webxr_uninitialize(){if(GodotWebXR.session){GodotWebXR.session.end().catch(e=>{})}GodotWebXR.session=null;GodotWebXR.space=null;GodotWebXR.frame=null;GodotWebXR.pose=null;GodotWebXR.monkeyPatchRequestAnimationFrame(false);GodotWebXR.pauseResumeMainLoop()}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _strftime_l(s,maxsize,format,tm){return _strftime(s,maxsize,format,tm)}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.staticInit();Module["requestFullscreen"]=function Module_requestFullscreen(lockPointer,resizeCanvas){Browser.requestFullscreen(lockPointer,resizeCanvas)};Module["requestAnimationFrame"]=function Module_requestAnimationFrame(func){Browser.requestAnimationFrame(func)};Module["setCanvasSize"]=function Module_setCanvasSize(width,height,noUpdates){Browser.setCanvasSize(width,height,noUpdates)};Module["pauseMainLoop"]=function Module_pauseMainLoop(){Browser.mainLoop.pause()};Module["resumeMainLoop"]=function Module_resumeMainLoop(){Browser.mainLoop.resume()};Module["getUserMedia"]=function Module_getUserMedia(){Browser.getUserMedia()};Module["createContext"]=function Module_createContext(canvas,useWebGL,setInModule,webGLContextAttributes){return Browser.createContext(canvas,useWebGL,setInModule,webGLContextAttributes)};var preloadedImages={};var preloadedAudios={};var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var __miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){__miniTempWebGLIntBuffers[i]=__miniTempWebGLIntBuffersStorage.subarray(0,i+1)}Module["request_quit"]=function(){GodotOS.request_quit()};Module["onExit"]=GodotOS.cleanup;GodotOS._fs_sync_promise=Promise.resolve();Module["initConfig"]=GodotConfig.init_config;Module["initFS"]=GodotFS.init;Module["copyToFS"]=GodotFS.copy_to_fs;ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};GodotOS.atexit(function(resolve,reject){GodotDisplayCursor.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotEventListeners.clear();resolve()});GodotOS.atexit(function(resolve,reject){GodotDisplayVK.clear();resolve()});GodotJSWrapper.proxies=new Map;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?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 asmLibraryArg={"Xc":___call_sighandler,"Rc":___syscall__newselect,"Mc":___syscall_accept4,"Lc":___syscall_bind,"rd":___syscall_chdir,"qd":___syscall_chmod,"Kc":___syscall_connect,"sd":___syscall_faccessat,"Fa":___syscall_fcntl64,"fd":___syscall_getcwd,"Wc":___syscall_getdents64,"Jc":___syscall_getsockname,"Ic":___syscall_getsockopt,"mb":___syscall_ioctl,"Hc":___syscall_listen,"ad":___syscall_lstat64,"_c":___syscall_mkdirat,"$c":___syscall_newfstatat,"nb":___syscall_openat,"Zc":___syscall_poll,"Vc":___syscall_readlinkat,"Gc":___syscall_recvfrom,"Sc":___syscall_renameat,"Tc":___syscall_rmdir,"Fc":___syscall_sendto,"jb":___syscall_socket,"bd":___syscall_stat64,"Qc":___syscall_statfs64,"Pc":___syscall_symlink,"Uc":___syscall_unlinkat,"nd":__dlinit,"pd":__dlopen_js,"od":__dlsym_js,"Va":__emscripten_date_now,"id":__emscripten_get_now_is_monotonic,"Ec":__emscripten_throw_longjmp,"jd":__gmtime_js,"kd":__localtime_js,"md":__tzset_js,"ja":_abort,"qb":_emscripten_cancel_main_loop,"Jh":_emscripten_force_exit,"Ua":_emscripten_get_now,"yi":_emscripten_glActiveTexture,"xi":_emscripten_glAttachShader,"mf":_emscripten_glBeginQuery,"Qi":_emscripten_glBeginQueryEXT,"Ue":_emscripten_glBeginTransformFeedback,"wi":_emscripten_glBindAttribLocation,"vi":_emscripten_glBindBuffer,"Qe":_emscripten_glBindBufferBase,"Re":_emscripten_glBindBufferRange,"ui":_emscripten_glBindFramebuffer,"ti":_emscripten_glBindRenderbuffer,"Td":_emscripten_glBindSampler,"si":_emscripten_glBindTexture,"Kd":_emscripten_glBindTransformFeedback,"Ze":_emscripten_glBindVertexArray,"Hi":_emscripten_glBindVertexArrayOES,"ri":_emscripten_glBlendColor,"qi":_emscripten_glBlendEquation,"pi":_emscripten_glBlendEquationSeparate,"ni":_emscripten_glBlendFunc,"mi":_emscripten_glBlendFuncSeparate,"af":_emscripten_glBlitFramebuffer,"li":_emscripten_glBufferData,"ki":_emscripten_glBufferSubData,"ji":_emscripten_glCheckFramebufferStatus,"ii":_emscripten_glClear,"re":_emscripten_glClearBufferfi,"se":_emscripten_glClearBufferfv,"ue":_emscripten_glClearBufferiv,"te":_emscripten_glClearBufferuiv,"hi":_emscripten_glClearColor,"gi":_emscripten_glClearDepthf,"fi":_emscripten_glClearStencil,"ce":_emscripten_glClientWaitSync,"ei":_emscripten_glColorMask,"bi":_emscripten_glCompileShader,"ai":_emscripten_glCompressedTexImage2D,"rf":_emscripten_glCompressedTexImage3D,"$h":_emscripten_glCompressedTexSubImage2D,"qf":_emscripten_glCompressedTexSubImage3D,"pe":_emscripten_glCopyBufferSubData,"_h":_emscripten_glCopyTexImage2D,"Zh":_emscripten_glCopyTexSubImage2D,"sf":_emscripten_glCopyTexSubImage3D,"Yh":_emscripten_glCreateProgram,"Xh":_emscripten_glCreateShader,"Wh":_emscripten_glCullFace,"Vh":_emscripten_glDeleteBuffers,"Uh":_emscripten_glDeleteFramebuffers,"Th":_emscripten_glDeleteProgram,"of":_emscripten_glDeleteQueries,"Si":_emscripten_glDeleteQueriesEXT,"Sh":_emscripten_glDeleteRenderbuffers,"Vd":_emscripten_glDeleteSamplers,"Rh":_emscripten_glDeleteShader,"de":_emscripten_glDeleteSync,"Qh":_emscripten_glDeleteTextures,"Jd":_emscripten_glDeleteTransformFeedbacks,"Ye":_emscripten_glDeleteVertexArrays,"Gi":_emscripten_glDeleteVertexArraysOES,"Ph":_emscripten_glDepthFunc,"Oh":_emscripten_glDepthMask,"Nh":_emscripten_glDepthRangef,"Mh":_emscripten_glDetachShader,"Lh":_emscripten_glDisable,"Kh":_emscripten_glDisableVertexAttribArray,"Ih":_emscripten_glDrawArrays,"he":_emscripten_glDrawArraysInstanced,"Ci":_emscripten_glDrawArraysInstancedANGLE,"Bf":_emscripten_glDrawArraysInstancedARB,"Cf":_emscripten_glDrawArraysInstancedEXT,"td":_emscripten_glDrawArraysInstancedNV,"hf":_emscripten_glDrawBuffers,"xf":_emscripten_glDrawBuffersEXT,"Di":_emscripten_glDrawBuffersWEBGL,"Hh":_emscripten_glDrawElements,"ge":_emscripten_glDrawElementsInstanced,"Bi":_emscripten_glDrawElementsInstancedANGLE,"yf":_emscripten_glDrawElementsInstancedARB,"zf":_emscripten_glDrawElementsInstancedEXT,"Af":_emscripten_glDrawElementsInstancedNV,"vf":_emscripten_glDrawRangeElements,"Gh":_emscripten_glEnable,"Fh":_emscripten_glEnableVertexAttribArray,"lf":_emscripten_glEndQuery,"Pi":_emscripten_glEndQueryEXT,"Se":_emscripten_glEndTransformFeedback,"fe":_emscripten_glFenceSync,"Eh":_emscripten_glFinish,"Dh":_emscripten_glFlush,"Ch":_emscripten_glFramebufferRenderbuffer,"Bh":_emscripten_glFramebufferTexture2D,"_e":_emscripten_glFramebufferTextureLayer,"Ah":_emscripten_glFrontFace,"zh":_emscripten_glGenBuffers,"xh":_emscripten_glGenFramebuffers,"pf":_emscripten_glGenQueries,"Ti":_emscripten_glGenQueriesEXT,"wh":_emscripten_glGenRenderbuffers,"Wd":_emscripten_glGenSamplers,"vh":_emscripten_glGenTextures,"Id":_emscripten_glGenTransformFeedbacks,"Xe":_emscripten_glGenVertexArrays,"Fi":_emscripten_glGenVertexArraysOES,"yh":_emscripten_glGenerateMipmap,"uh":_emscripten_glGetActiveAttrib,"th":_emscripten_glGetActiveUniform,"je":_emscripten_glGetActiveUniformBlockName,"ke":_emscripten_glGetActiveUniformBlockiv,"ne":_emscripten_glGetActiveUniformsiv,"sh":_emscripten_glGetAttachedShaders,"rh":_emscripten_glGetAttribLocation,"qh":_emscripten_glGetBooleanv,"Xd":_emscripten_glGetBufferParameteri64v,"ph":_emscripten_glGetBufferParameteriv,"nh":_emscripten_glGetError,"mh":_emscripten_glGetFloatv,"Ee":_emscripten_glGetFragDataLocation,"lh":_emscripten_glGetFramebufferAttachmentParameteriv,"Yd":_emscripten_glGetInteger64i_v,"_d":_emscripten_glGetInteger64v,"Ve":_emscripten_glGetIntegeri_v,"kh":_emscripten_glGetIntegerv,"wd":_emscripten_glGetInternalformativ,"Dd":_emscripten_glGetProgramBinary,"ih":_emscripten_glGetProgramInfoLog,"jh":_emscripten_glGetProgramiv,"Ji":_emscripten_glGetQueryObjecti64vEXT,"Mi":_emscripten_glGetQueryObjectivEXT,"Ii":_emscripten_glGetQueryObjectui64vEXT,"jf":_emscripten_glGetQueryObjectuiv,"Li":_emscripten_glGetQueryObjectuivEXT,"kf":_emscripten_glGetQueryiv,"Ni":_emscripten_glGetQueryivEXT,"hh":_emscripten_glGetRenderbufferParameteriv,"Md":_emscripten_glGetSamplerParameterfv,"Nd":_emscripten_glGetSamplerParameteriv,"fh":_emscripten_glGetShaderInfoLog,"eh":_emscripten_glGetShaderPrecisionFormat,"ch":_emscripten_glGetShaderSource,"gh":_emscripten_glGetShaderiv,"bh":_emscripten_glGetString,"qe":_emscripten_glGetStringi,"Zd":_emscripten_glGetSynciv,"ah":_emscripten_glGetTexParameterfv,"$g":_emscripten_glGetTexParameteriv,"Oe":_emscripten_glGetTransformFeedbackVarying,"le":_emscripten_glGetUniformBlockIndex,"oe":_emscripten_glGetUniformIndices,"Yg":_emscripten_glGetUniformLocation,"_g":_emscripten_glGetUniformfv,"Zg":_emscripten_glGetUniformiv,"Fe":_emscripten_glGetUniformuiv,"Me":_emscripten_glGetVertexAttribIiv,"Le":_emscripten_glGetVertexAttribIuiv,"Vg":_emscripten_glGetVertexAttribPointerv,"Xg":_emscripten_glGetVertexAttribfv,"Wg":_emscripten_glGetVertexAttribiv,"Tg":_emscripten_glHint,"Ad":_emscripten_glInvalidateFramebuffer,"zd":_emscripten_glInvalidateSubFramebuffer,"Sg":_emscripten_glIsBuffer,"Rg":_emscripten_glIsEnabled,"Qg":_emscripten_glIsFramebuffer,"Pg":_emscripten_glIsProgram,"nf":_emscripten_glIsQuery,"Ri":_emscripten_glIsQueryEXT,"Og":_emscripten_glIsRenderbuffer,"Ud":_emscripten_glIsSampler,"Ng":_emscripten_glIsShader,"ee":_emscripten_glIsSync,"Mg":_emscripten_glIsTexture,"Hd":_emscripten_glIsTransformFeedback,"We":_emscripten_glIsVertexArray,"Ei":_emscripten_glIsVertexArrayOES,"Lg":_emscripten_glLineWidth,"Kg":_emscripten_glLinkProgram,"Fd":_emscripten_glPauseTransformFeedback,"Ig":_emscripten_glPixelStorei,"Hg":_emscripten_glPolygonOffset,"Cd":_emscripten_glProgramBinary,"Bd":_emscripten_glProgramParameteri,"Oi":_emscripten_glQueryCounterEXT,"wf":_emscripten_glReadBuffer,"Gg":_emscripten_glReadPixels,"Fg":_emscripten_glReleaseShaderCompiler,"Eg":_emscripten_glRenderbufferStorage,"$e":_emscripten_glRenderbufferStorageMultisample,"Ed":_emscripten_glResumeTransformFeedback,"Dg":_emscripten_glSampleCoverage,"Pd":_emscripten_glSamplerParameterf,"Od":_emscripten_glSamplerParameterfv,"Sd":_emscripten_glSamplerParameteri,"Qd":_emscripten_glSamplerParameteriv,"Cg":_emscripten_glScissor,"Bg":_emscripten_glShaderBinary,"Ag":_emscripten_glShaderSource,"zg":_emscripten_glStencilFunc,"xg":_emscripten_glStencilFuncSeparate,"wg":_emscripten_glStencilMask,"vg":_emscripten_glStencilMaskSeparate,"ug":_emscripten_glStencilOp,"tg":_emscripten_glStencilOpSeparate,"sg":_emscripten_glTexImage2D,"uf":_emscripten_glTexImage3D,"rg":_emscripten_glTexParameterf,"qg":_emscripten_glTexParameterfv,"pg":_emscripten_glTexParameteri,"og":_emscripten_glTexParameteriv,"yd":_emscripten_glTexStorage2D,"xd":_emscripten_glTexStorage3D,"mg":_emscripten_glTexSubImage2D,"tf":_emscripten_glTexSubImage3D,"Pe":_emscripten_glTransformFeedbackVaryings,"lg":_emscripten_glUniform1f,"kg":_emscripten_glUniform1fv,"jg":_emscripten_glUniform1i,"ig":_emscripten_glUniform1iv,"De":_emscripten_glUniform1ui,"ze":_emscripten_glUniform1uiv,"hg":_emscripten_glUniform2f,"gg":_emscripten_glUniform2fv,"fg":_emscripten_glUniform2i,"eg":_emscripten_glUniform2iv,"Ce":_emscripten_glUniform2ui,"ye":_emscripten_glUniform2uiv,"dg":_emscripten_glUniform3f,"ag":_emscripten_glUniform3fv,"$f":_emscripten_glUniform3i,"_f":_emscripten_glUniform3iv,"Be":_emscripten_glUniform3ui,"we":_emscripten_glUniform3uiv,"Zf":_emscripten_glUniform4f,"Yf":_emscripten_glUniform4fv,"Xf":_emscripten_glUniform4i,"Wf":_emscripten_glUniform4iv,"Ae":_emscripten_glUniform4ui,"ve":_emscripten_glUniform4uiv,"ie":_emscripten_glUniformBlockBinding,"Vf":_emscripten_glUniformMatrix2fv,"gf":_emscripten_glUniformMatrix2x3fv,"ef":_emscripten_glUniformMatrix2x4fv,"Uf":_emscripten_glUniformMatrix3fv,"ff":_emscripten_glUniformMatrix3x2fv,"cf":_emscripten_glUniformMatrix3x4fv,"Tf":_emscripten_glUniformMatrix4fv,"df":_emscripten_glUniformMatrix4x2fv,"bf":_emscripten_glUniformMatrix4x3fv,"Rf":_emscripten_glUseProgram,"Qf":_emscripten_glValidateProgram,"Pf":_emscripten_glVertexAttrib1f,"Of":_emscripten_glVertexAttrib1fv,"Nf":_emscripten_glVertexAttrib2f,"Mf":_emscripten_glVertexAttrib2fv,"Lf":_emscripten_glVertexAttrib3f,"Kf":_emscripten_glVertexAttrib3fv,"Jf":_emscripten_glVertexAttrib4f,"If":_emscripten_glVertexAttrib4fv,"Ld":_emscripten_glVertexAttribDivisor,"Ai":_emscripten_glVertexAttribDivisorANGLE,"Df":_emscripten_glVertexAttribDivisorARB,"Ef":_emscripten_glVertexAttribDivisorEXT,"ud":_emscripten_glVertexAttribDivisorNV,"Ke":_emscripten_glVertexAttribI4i,"He":_emscripten_glVertexAttribI4iv,"Je":_emscripten_glVertexAttribI4ui,"Ge":_emscripten_glVertexAttribI4uiv,"Ne":_emscripten_glVertexAttribIPointer,"Gf":_emscripten_glVertexAttribPointer,"Ff":_emscripten_glViewport,"$d":_emscripten_glWaitSync,"hd":_emscripten_memcpy_big,"Ta":_emscripten_resize_heap,"pb":_emscripten_set_main_loop,"fb":_emscripten_webgl_commit_frame,"Cc":_emscripten_webgl_create_context,"bc":_emscripten_webgl_destroy_context,"Oc":_emscripten_webgl_init_context_attributes,"xc":_emscripten_webgl_make_context_current,"dd":_environ_get,"ed":_environ_sizes_get,"ua":_fd_close,"cd":_fd_fdstat_get,"lb":_fd_read,"Ac":_fd_seek,"kb":_fd_write,"k":_getTempRet0,"Sa":_getaddrinfo,"Pb":_getnameinfo,"c":_glActiveTexture,"Na":_glAttachShader,"bb":_glBeginTransformFeedback,"vb":_glBindAttribLocation,"b":_glBindBuffer,"P":_glBindBufferBase,"e":_glBindFramebuffer,"_":_glBindRenderbuffer,"a":_glBindTexture,"m":_glBindVertexArray,"D":_glBlendEquation,"X":_glBlendFunc,"w":_glBlendFuncSeparate,"ha":_glBlitFramebuffer,"q":_glBufferData,"K":_glBufferSubData,"M":_glCheckFramebufferStatus,"J":_glClear,"qa":_glClearBufferfv,"O":_glClearColor,"aa":_glClearDepthf,"N":_glColorMask,"ka":_glCompileShader,"Ab":_glCompressedTexImage2D,"gj":_glCompressedTexSubImage2D,"zb":_glCompressedTexSubImage3D,"ej":_glCopyBufferSubData,"_a":_glCopyTexSubImage2D,"$a":_glCreateProgram,"Da":_glCreateShader,"ra":_glCullFace,"L":_glDeleteBuffers,"F":_glDeleteFramebuffers,"Q":_glDeleteProgram,"U":_glDeleteRenderbuffers,"I":_glDeleteShader,"A":_glDeleteTextures,"ea":_glDeleteVertexArrays,"Y":_glDepthFunc,"H":_glDepthMask,"i":_glDisable,"p":_glDisableVertexAttribArray,"B":_glDrawArrays,"ya":_glDrawArraysInstanced,"Ja":_glDrawBuffers,"ba":_glDrawElements,"Ka":_glDrawElementsInstanced,"s":_glEnable,"j":_glEnableVertexAttribArray,"ab":_glEndTransformFeedback,"Db":_glFinish,"Z":_glFramebufferRenderbuffer,"x":_glFramebufferTexture2D,"fj":_glFramebufferTextureLayer,"Bb":_glFrontFace,"C":_glGenBuffers,"E":_glGenFramebuffers,"ga":_glGenRenderbuffers,"v":_glGenTextures,"W":_glGenVertexArrays,"R":_glGenerateMipmap,"Cb":_glGetError,"wb":_glGetFloatv,"$":_glGetIntegerv,"Zi":_glGetProgramBinary,"tb":_glGetProgramInfoLog,"Ea":_glGetProgramiv,"Oa":_glGetShaderInfoLog,"Vi":_glGetShaderSource,"da":_glGetShaderiv,"wa":_glGetString,"dj":_glGetStringi,"Xi":_glGetUniformBlockIndex,"va":_glGetUniformLocation,"lj":_glInvalidateFramebuffer,"ub":_glLinkProgram,"la":_glPixelStorei,"bj":_glProgramBinary,"_i":_glProgramParameteri,"ia":_glReadBuffer,"cb":_glReadPixels,"fa":_glRenderbufferStorage,"Ga":_glRenderbufferStorageMultisample,"T":_glScissor,"Pa":_glShaderSource,"r":_glTexImage2D,"Ia":_glTexImage3D,"g":_glTexParameterf,"d":_glTexParameteri,"ij":_glTexStorage2D,"Ha":_glTexSubImage2D,"Qa":_glTexSubImage3D,"$i":_glTransformFeedbackVaryings,"f":_glUniform1f,"u":_glUniform1i,"db":_glUniform1iv,"xb":_glUniform1ui,"Za":_glUniform2f,"n":_glUniform2fv,"Ca":_glUniform2i,"ma":_glUniform2iv,"Ya":_glUniform3f,"V":_glUniform3fv,"Ba":_glUniform3i,"xa":_glUniform4f,"y":_glUniform4fv,"Aa":_glUniform4i,"Wi":_glUniformBlockBinding,"sb":_glUniformMatrix2fv,"rb":_glUniformMatrix3fv,"o":_glUniformMatrix4fv,"pa":_glUseProgram,"z":_glVertexAttrib4f,"S":_glVertexAttrib4fv,"G":_glVertexAttribDivisor,"pj":_glVertexAttribI4ui,"La":_glVertexAttribIPointer,"h":_glVertexAttribPointer,"t":_glViewport,"di":_godot_audio_capture_start,"cg":_godot_audio_capture_stop,"be":_godot_audio_has_script_processor,"dc":_godot_audio_has_worklet,"bk":_godot_audio_init,"ck":_godot_audio_is_available,"kj":_godot_audio_resume,"yc":_godot_audio_script_create,"nc":_godot_audio_script_start,"Ub":_godot_audio_worklet_create,"ak":_godot_audio_worklet_start_no_threads,"Sb":_godot_js_config_canvas_id_get,"dh":_godot_js_config_locale_get,"_b":_godot_js_display_alert,"me":_godot_js_display_canvas_focus,"xe":_godot_js_display_canvas_is_focused,"ld":_godot_js_display_clipboard_get,"vd":_godot_js_display_clipboard_set,"Te":_godot_js_display_cursor_is_hidden,"Ie":_godot_js_display_cursor_is_locked,"Wa":_godot_js_display_cursor_lock_set,"ob":_godot_js_display_cursor_set_custom_shape,"Hf":_godot_js_display_cursor_set_shape,"Xa":_godot_js_display_cursor_set_visible,"yg":_godot_js_display_desired_size_set,"oc":_godot_js_display_fullscreen_cb,"Sf":_godot_js_display_fullscreen_exit,"bg":_godot_js_display_fullscreen_request,"Rj":_godot_js_display_glGetBufferSubData,"ib":_godot_js_display_has_webgl,"Yc":_godot_js_display_is_swap_ok_cancel,"lc":_godot_js_display_notification_cb,"cc":_godot_js_display_pixel_ratio_get,"ec":_godot_js_display_screen_dpi_get,"Jg":_godot_js_display_screen_size_get,"gd":_godot_js_display_setup_canvas,"Ug":_godot_js_display_size_update,"ae":_godot_js_display_touchscreen_is_available,"jc":_godot_js_display_vk_available,"kc":_godot_js_display_vk_cb,"hc":_godot_js_display_vk_hide,"ic":_godot_js_display_vk_show,"mc":_godot_js_display_window_blur_cb,"Yb":_godot_js_display_window_icon_set,"ng":_godot_js_display_window_size_get,"Zb":_godot_js_display_window_title_set,"zi":_godot_js_eval,"qj":_godot_js_fetch_body_length_get,"Aj":_godot_js_fetch_create,"Jb":_godot_js_fetch_free,"nj":_godot_js_fetch_http_status_get,"rj":_godot_js_fetch_is_chunked,"oj":_godot_js_fetch_read_chunk,"mj":_godot_js_fetch_read_headers,"eb":_godot_js_fetch_state_get,"pc":_godot_js_input_drop_files_cb,"rc":_godot_js_input_gamepad_cb,"fc":_godot_js_input_gamepad_sample,"Rd":_godot_js_input_gamepad_sample_count,"Gd":_godot_js_input_gamepad_sample_get,"sc":_godot_js_input_key_cb,"wc":_godot_js_input_mouse_button_cb,"vc":_godot_js_input_mouse_move_cb,"uc":_godot_js_input_mouse_wheel_cb,"qc":_godot_js_input_paste_cb,"tc":_godot_js_input_touch_cb,"Wb":_godot_js_input_vibrate_handheld,"oi":_godot_js_os_download_buffer,"ac":_godot_js_os_execute,"oh":_godot_js_os_finish_async,"Rb":_godot_js_os_fs_is_persistent,"gc":_godot_js_os_fs_sync,"$b":_godot_js_os_hw_concurrency_get,"Tb":_godot_js_os_request_quit_cb,"Xb":_godot_js_os_shell_open,"Qb":_godot_js_pwa_cb,"Vb":_godot_js_pwa_update,"Ob":_godot_js_rtc_datachannel_close,"Vj":_godot_js_rtc_datachannel_connect,"Sj":_godot_js_rtc_datachannel_destroy,"Wj":_godot_js_rtc_datachannel_get_buffered_amount,"_j":_godot_js_rtc_datachannel_id_get,"Xj":_godot_js_rtc_datachannel_is_negotiated,"$j":_godot_js_rtc_datachannel_is_ordered,"Uj":_godot_js_rtc_datachannel_label_get,"Zj":_godot_js_rtc_datachannel_max_packet_lifetime_get,"Yj":_godot_js_rtc_datachannel_max_retransmits_get,"Tj":_godot_js_rtc_datachannel_protocol_get,"Nb":_godot_js_rtc_datachannel_ready_state_get,"Mb":_godot_js_rtc_datachannel_send,"Qj":_godot_js_rtc_pc_close,"Lj":_godot_js_rtc_pc_create,"Kj":_godot_js_rtc_pc_datachannel_create,"Lb":_godot_js_rtc_pc_destroy,"Mj":_godot_js_rtc_pc_ice_candidate_add,"Oj":_godot_js_rtc_pc_local_description_set,"Pj":_godot_js_rtc_pc_offer_create,"Nj":_godot_js_rtc_pc_remote_description_set,"Kb":_godot_js_websocket_buffered_amount,"Ij":_godot_js_websocket_close,"Hj":_godot_js_websocket_create,"Ib":_godot_js_websocket_destroy,"Jj":_godot_js_websocket_send,"Yi":_godot_js_wrapper_create_cb,"Ki":_godot_js_wrapper_create_object,"Ui":_godot_js_wrapper_interface_get,"aj":_godot_js_wrapper_object_call,"hj":_godot_js_wrapper_object_get,"yb":_godot_js_wrapper_object_getvar,"jj":_godot_js_wrapper_object_set,"cj":_godot_js_wrapper_object_setvar,"ci":_godot_js_wrapper_object_unref,"vj":_godot_webxr_commit_for_eye,"Ej":_godot_webxr_get_bounds_geometry,"Fb":_godot_webxr_get_controller_axes,"sj":_godot_webxr_get_controller_buttons,"uj":_godot_webxr_get_controller_count,"Ra":_godot_webxr_get_controller_target_ray_mode,"tj":_godot_webxr_get_controller_transform,"wj":_godot_webxr_get_projection_for_eye,"yj":_godot_webxr_get_render_targetsize,"xj":_godot_webxr_get_transform_for_eye,"Dj":_godot_webxr_get_view_count,"Fj":_godot_webxr_get_visibility_state,"Bj":_godot_webxr_initialize,"Gb":_godot_webxr_is_controller_connected,"Gj":_godot_webxr_is_session_supported,"Cj":_godot_webxr_is_supported,"Hb":_godot_webxr_sample_controller_data,"zj":_godot_webxr_uninitialize,"za":invoke_ii,"na":invoke_iii,"gb":invoke_iiii,"hb":invoke_iiiii,"Dc":invoke_iiiiii,"Bc":invoke_iiiiiii,"zc":invoke_iij,"ca":invoke_vi,"oa":invoke_vii,"ta":invoke_viii,"sa":invoke_viiii,"Ma":invoke_viiiiiii,"l":_setTempRet0,"Eb":_strftime,"Nc":_strftime_l};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["ek"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["fk"]).apply(null,arguments)};var __Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=function(){return(__Z13godot_js_mainiPPc=Module["__Z13godot_js_mainiPPc"]=Module["asm"]["gk"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["hk"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["ik"]).apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return(_htonl=Module["_htonl"]=Module["asm"]["jk"]).apply(null,arguments)};var _htons=Module["_htons"]=function(){return(_htons=Module["_htons"]=Module["asm"]["kk"]).apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return(_ntohs=Module["_ntohs"]=Module["asm"]["lk"]).apply(null,arguments)};var _fflush=Module["_fflush"]=function(){return(_fflush=Module["_fflush"]=Module["asm"]["mk"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["nk"]).apply(null,arguments)};var __emwebxr_on_input_event=Module["__emwebxr_on_input_event"]=function(){return(__emwebxr_on_input_event=Module["__emwebxr_on_input_event"]=Module["asm"]["ok"]).apply(null,arguments)};var __emwebxr_on_simple_event=Module["__emwebxr_on_simple_event"]=function(){return(__emwebxr_on_simple_event=Module["__emwebxr_on_simple_event"]=Module["asm"]["pk"]).apply(null,arguments)};var ___funcs_on_exit=Module["___funcs_on_exit"]=function(){return(___funcs_on_exit=Module["___funcs_on_exit"]=Module["asm"]["qk"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["sk"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["tk"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["uk"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["vk"]).apply(null,arguments)};var dynCall_iij=Module["dynCall_iij"]=function(){return(dynCall_iij=Module["dynCall_iij"]=Module["asm"]["wk"]).apply(null,arguments)};function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iij(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iij(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["cwrap"]=cwrap;Module["callMain"]=callMain;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];args=args||[];args.unshift(thisProgram);var argc=args.length;var argv=stackAlloc((argc+1)*4);var argv_ptr=argv>>2;args.forEach(arg=>{HEAP32[argv_ptr++]=allocateUTF8OnStack(arg)});HEAP32[argv_ptr]=0;try{var ret=entryFunction(argc,argv);exit(ret,true);return ret}catch(e){return handleException(e)}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;if(!keepRuntimeAlive()){exitRuntime()}procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=false;if(Module["noInitialRun"])shouldRunNow=false;run(); + + + return Godot.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = Godot; +else if (typeof define === 'function' && define['amd']) + define([], function() { return Godot; }); +else if (typeof exports === 'object') + exports["Godot"] = Godot; + +const Preloader = /** @constructor */ function () { // eslint-disable-line no-unused-vars + function getTrackedResponse(response, load_status) { + function onloadprogress(reader, controller) { + return reader.read().then(function (result) { + if (load_status.done) { + return Promise.resolve(); + } + if (result.value) { + controller.enqueue(result.value); + load_status.loaded += result.value.length; + } + if (!result.done) { + return onloadprogress(reader, controller); + } + load_status.done = true; + return Promise.resolve(); + }); + } + const reader = response.body.getReader(); + return new Response(new ReadableStream({ + start: function (controller) { + onloadprogress(reader, controller).then(function () { + controller.close(); + }); + }, + }), { headers: response.headers }); + } + + function loadFetch(file, tracker, fileSize, raw) { + tracker[file] = { + total: fileSize || 0, + loaded: 0, + done: false, + }; + return fetch(file).then(function (response) { + if (!response.ok) { + return Promise.reject(new Error(`Failed loading file '${file}'`)); + } + const tr = getTrackedResponse(response, tracker[file]); + if (raw) { + return Promise.resolve(tr); + } + return tr.arrayBuffer(); + }); + } + + function retry(func, attempts = 1) { + function onerror(err) { + if (attempts <= 1) { + return Promise.reject(err); + } + return new Promise(function (resolve, reject) { + setTimeout(function () { + retry(func, attempts - 1).then(resolve).catch(reject); + }, 1000); + }); + } + return func().catch(onerror); + } + + const DOWNLOAD_ATTEMPTS_MAX = 4; + const loadingFiles = {}; + const lastProgress = { loaded: 0, total: 0 }; + let progressFunc = null; + + const animateProgress = function () { + let loaded = 0; + let total = 0; + let totalIsValid = true; + let progressIsFinal = true; + + Object.keys(loadingFiles).forEach(function (file) { + const stat = loadingFiles[file]; + if (!stat.done) { + progressIsFinal = false; + } + if (!totalIsValid || stat.total === 0) { + totalIsValid = false; + total = 0; + } else { + total += stat.total; + } + loaded += stat.loaded; + }); + if (loaded !== lastProgress.loaded || total !== lastProgress.total) { + lastProgress.loaded = loaded; + lastProgress.total = total; + if (typeof progressFunc === 'function') { + progressFunc(loaded, total); + } + } + if (!progressIsFinal) { + requestAnimationFrame(animateProgress); + } + }; + + this.animateProgress = animateProgress; + + this.setProgressFunc = function (callback) { + progressFunc = callback; + }; + + this.loadPromise = function (file, fileSize, raw = false) { + return retry(loadFetch.bind(null, file, loadingFiles, fileSize, raw), DOWNLOAD_ATTEMPTS_MAX); + }; + + this.preloadedFiles = []; + this.preload = function (pathOrBuffer, destPath, fileSize) { + let buffer = null; + if (typeof pathOrBuffer === 'string') { + const me = this; + return this.loadPromise(pathOrBuffer, fileSize).then(function (buf) { + me.preloadedFiles.push({ + path: destPath || pathOrBuffer, + buffer: buf, + }); + return Promise.resolve(); + }); + } else if (pathOrBuffer instanceof ArrayBuffer) { + buffer = new Uint8Array(pathOrBuffer); + } else if (ArrayBuffer.isView(pathOrBuffer)) { + buffer = new Uint8Array(pathOrBuffer.buffer); + } + if (buffer) { + this.preloadedFiles.push({ + path: destPath, + buffer: pathOrBuffer, + }); + return Promise.resolve(); + } + return Promise.reject(new Error('Invalid object for preloading')); + }; +}; + +/** + * An object used to configure the Engine instance based on godot export options, and to override those in custom HTML + * templates if needed. + * + * @header Engine configuration + * @summary The Engine configuration object. This is just a typedef, create it like a regular object, e.g.: + * + * ``const MyConfig = { executable: 'godot', unloadAfterInit: false }`` + * + * @typedef {Object} EngineConfig + */ +const EngineConfig = {}; // eslint-disable-line no-unused-vars + +/** + * @struct + * @constructor + * @ignore + */ +const InternalConfig = function (initConfig) { // eslint-disable-line no-unused-vars + const cfg = /** @lends {InternalConfig.prototype} */ { + /** + * Whether the unload the engine automatically after the instance is initialized. + * + * @memberof EngineConfig + * @default + * @type {boolean} + */ + unloadAfterInit: true, + /** + * The HTML DOM Canvas object to use. + * + * By default, the first canvas element in the document will be used is none is specified. + * + * @memberof EngineConfig + * @default + * @type {?HTMLCanvasElement} + */ + canvas: null, + /** + * The name of the WASM file without the extension. (Set by Godot Editor export process). + * + * @memberof EngineConfig + * @default + * @type {string} + */ + executable: '', + /** + * An alternative name for the game pck to load. The executable name is used otherwise. + * + * @memberof EngineConfig + * @default + * @type {?string} + */ + mainPack: null, + /** + * Specify a language code to select the proper localization for the game. + * + * The browser locale will be used if none is specified. See complete list of + * :ref:`supported locales `. + * + * @memberof EngineConfig + * @type {?string} + * @default + */ + locale: null, + /** + * The canvas resize policy determines how the canvas should be resized by Godot. + * + * ``0`` means Godot won't do any resizing. This is useful if you want to control the canvas size from + * javascript code in your template. + * + * ``1`` means Godot will resize the canvas on start, and when changing window size via engine functions. + * + * ``2`` means Godot will adapt the canvas size to match the whole browser window. + * + * @memberof EngineConfig + * @type {number} + * @default + */ + canvasResizePolicy: 2, + /** + * The arguments to be passed as command line arguments on startup. + * + * See :ref:`command line tutorial `. + * + * **Note**: :js:meth:`startGame ` will always add the ``--main-pack`` argument. + * + * @memberof EngineConfig + * @type {Array} + * @default + */ + args: [], + /** + * When enabled, the game canvas will automatically grab the focus when the engine starts. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + focusCanvas: true, + /** + * When enabled, this will turn on experimental virtual keyboard support on mobile. + * + * @memberof EngineConfig + * @type {boolean} + * @default + */ + experimentalVK: false, + /** + * The progressive web app service worker to install. + * @memberof EngineConfig + * @default + * @type {string} + */ + serviceWorker: '', + /** + * @ignore + * @type {Array.} + */ + persistentPaths: ['/userfs'], + /** + * @ignore + * @type {boolean} + */ + persistentDrops: false, + /** + * @ignore + * @type {Array.} + */ + gdnativeLibs: [], + /** + * @ignore + * @type {Array.} + */ + fileSizes: [], + /** + * A callback function for handling Godot's ``OS.execute`` calls. + * + * This is for example used in the Web Editor template to switch between project manager and editor, and for running the game. + * + * @callback EngineConfig.onExecute + * @param {string} path The path that Godot's wants executed. + * @param {Array.} args The arguments of the "command" to execute. + */ + /** + * @ignore + * @type {?function(string, Array.)} + */ + onExecute: null, + /** + * A callback function for being notified when the Godot instance quits. + * + * **Note**: This function will not be called if the engine crashes or become unresponsive. + * + * @callback EngineConfig.onExit + * @param {number} status_code The status code returned by Godot on exit. + */ + /** + * @ignore + * @type {?function(number)} + */ + onExit: null, + /** + * A callback function for displaying download progress. + * + * The function is called once per frame while downloading files, so the usage of ``requestAnimationFrame()`` + * is not necessary. + * + * If the callback function receives a total amount of bytes as 0, this means that it is impossible to calculate. + * Possible reasons include: + * + * - Files are delivered with server-side chunked compression + * - Files are delivered with server-side compression on Chromium + * - Not all file downloads have started yet (usually on servers without multi-threading) + * + * @callback EngineConfig.onProgress + * @param {number} current The current amount of downloaded bytes so far. + * @param {number} total The total amount of bytes to be downloaded. + */ + /** + * @ignore + * @type {?function(number, number)} + */ + onProgress: null, + /** + * A callback function for handling the standard output stream. This method should usually only be used in debug pages. + * + * By default, ``console.log()`` is used. + * + * @callback EngineConfig.onPrint + * @param {...*} [var_args] A variadic number of arguments to be printed. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrint: function () { + console.log.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + /** + * A callback function for handling the standard error stream. This method should usually only be used in debug pages. + * + * By default, ``console.error()`` is used. + * + * @callback EngineConfig.onPrintError + * @param {...*} [var_args] A variadic number of arguments to be printed as errors. + */ + /** + * @ignore + * @type {?function(...*)} + */ + onPrintError: function (var_args) { + console.error.apply(console, Array.from(arguments)); // eslint-disable-line no-console + }, + }; + + /** + * @ignore + * @struct + * @constructor + * @param {EngineConfig} opts + */ + function Config(opts) { + this.update(opts); + } + + Config.prototype = cfg; + + /** + * @ignore + * @param {EngineConfig} opts + */ + Config.prototype.update = function (opts) { + const config = opts || {}; + // NOTE: We must explicitly pass the default, accessing it via + // the key will fail due to closure compiler renames. + function parse(key, def) { + if (typeof (config[key]) === 'undefined') { + return def; + } + return config[key]; + } + // Module config + this.unloadAfterInit = parse('unloadAfterInit', this.unloadAfterInit); + this.onPrintError = parse('onPrintError', this.onPrintError); + this.onPrint = parse('onPrint', this.onPrint); + this.onProgress = parse('onProgress', this.onProgress); + + // Godot config + this.canvas = parse('canvas', this.canvas); + this.executable = parse('executable', this.executable); + this.mainPack = parse('mainPack', this.mainPack); + this.locale = parse('locale', this.locale); + this.canvasResizePolicy = parse('canvasResizePolicy', this.canvasResizePolicy); + this.persistentPaths = parse('persistentPaths', this.persistentPaths); + this.persistentDrops = parse('persistentDrops', this.persistentDrops); + this.experimentalVK = parse('experimentalVK', this.experimentalVK); + this.focusCanvas = parse('focusCanvas', this.focusCanvas); + this.serviceWorker = parse('serviceWorker', this.serviceWorker); + this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs); + this.fileSizes = parse('fileSizes', this.fileSizes); + this.args = parse('args', this.args); + this.onExecute = parse('onExecute', this.onExecute); + this.onExit = parse('onExit', this.onExit); + }; + + /** + * @ignore + * @param {string} loadPath + * @param {Response} response + */ + Config.prototype.getModuleConfig = function (loadPath, response) { + let r = response; + return { + 'print': this.onPrint, + 'printErr': this.onPrintError, + 'thisProgram': this.executable, + 'noExitRuntime': true, + 'dynamicLibraries': [`${loadPath}.side.wasm`], + 'instantiateWasm': function (imports, onSuccess) { + function done(result) { + onSuccess(result['instance'], result['module']); + } + if (typeof (WebAssembly.instantiateStreaming) !== 'undefined') { + WebAssembly.instantiateStreaming(Promise.resolve(r), imports).then(done); + } else { + r.arrayBuffer().then(function (buffer) { + WebAssembly.instantiate(buffer, imports).then(done); + }); + } + r = null; + return {}; + }, + 'locateFile': function (path) { + if (path.endsWith('.worker.js')) { + return `${loadPath}.worker.js`; + } else if (path.endsWith('.audio.worklet.js')) { + return `${loadPath}.audio.worklet.js`; + } else if (path.endsWith('.js')) { + return `${loadPath}.js`; + } else if (path.endsWith('.side.wasm')) { + return `${loadPath}.side.wasm`; + } else if (path.endsWith('.wasm')) { + return `${loadPath}.wasm`; + } + return path; + }, + }; + }; + + /** + * @ignore + * @param {function()} cleanup + */ + Config.prototype.getGodotConfig = function (cleanup) { + // Try to find a canvas + if (!(this.canvas instanceof HTMLCanvasElement)) { + const nodes = document.getElementsByTagName('canvas'); + if (nodes.length && nodes[0] instanceof HTMLCanvasElement) { + this.canvas = nodes[0]; + } + if (!this.canvas) { + throw new Error('No canvas found in page'); + } + } + // Canvas can grab focus on click, or key events won't work. + if (this.canvas.tabIndex < 0) { + this.canvas.tabIndex = 0; + } + + // Browser locale, or custom one if defined. + let locale = this.locale; + if (!locale) { + locale = navigator.languages ? navigator.languages[0] : navigator.language; + locale = locale.split('.')[0]; + } + locale = locale.replace('-', '_'); + const onExit = this.onExit; + + // Godot configuration. + return { + 'canvas': this.canvas, + 'canvasResizePolicy': this.canvasResizePolicy, + 'locale': locale, + 'persistentDrops': this.persistentDrops, + 'virtualKeyboard': this.experimentalVK, + 'focusCanvas': this.focusCanvas, + 'onExecute': this.onExecute, + 'onExit': function (p_code) { + cleanup(); // We always need to call the cleanup callback to free memory. + if (typeof (onExit) === 'function') { + onExit(p_code); + } + }, + }; + }; + return new Config(initConfig); +}; + +/** + * Projects exported for the Web expose the :js:class:`Engine` class to the JavaScript environment, that allows + * fine control over the engine's start-up process. + * + * This API is built in an asynchronous manner and requires basic understanding + * of `Promises `__. + * + * @module Engine + * @header HTML5 shell class reference + */ +const Engine = (function () { + const preloader = new Preloader(); + + let loadPromise = null; + let loadPath = ''; + let initPromise = null; + + /** + * @classdesc The ``Engine`` class provides methods for loading and starting exported projects on the Web. For default export + * settings, this is already part of the exported HTML page. To understand practical use of the ``Engine`` class, + * see :ref:`Custom HTML page for Web export `. + * + * @description Create a new Engine instance with the given configuration. + * + * @global + * @constructor + * @param {EngineConfig} initConfig The initial config for this instance. + */ + function Engine(initConfig) { // eslint-disable-line no-shadow + this.config = new InternalConfig(initConfig); + this.rtenv = null; + } + + /** + * Load the engine from the specified base path. + * + * @param {string} basePath Base path of the engine to load. + * @param {number=} [size=0] The file size if known. + * @returns {Promise} A Promise that resolves once the engine is loaded. + * + * @function Engine.load + */ + Engine.load = function (basePath, size) { + if (loadPromise == null) { + loadPath = basePath; + loadPromise = preloader.loadPromise(`${loadPath}.wasm`, size, true); + requestAnimationFrame(preloader.animateProgress); + } + return loadPromise; + }; + + /** + * Unload the engine to free memory. + * + * This method will be called automatically depending on the configuration. See :js:attr:`unloadAfterInit`. + * + * @function Engine.unload + */ + Engine.unload = function () { + loadPromise = null; + }; + + /** + * Check whether WebGL is available. Optionally, specify a particular version of WebGL to check for. + * + * @param {number=} [majorVersion=1] The major WebGL version to check for. + * @returns {boolean} If the given major version of WebGL is available. + * @function Engine.isWebGLAvailable + */ + Engine.isWebGLAvailable = function (majorVersion = 1) { + try { + return !!document.createElement('canvas').getContext(['webgl', 'webgl2'][majorVersion - 1]); + } catch (e) { /* Not available */ } + return false; + }; + + /** + * Safe Engine constructor, creates a new prototype for every new instance to avoid prototype pollution. + * @ignore + * @constructor + */ + function SafeEngine(initConfig) { + const proto = /** @lends Engine.prototype */ { + /** + * Initialize the engine instance. Optionally, pass the base path to the engine to load it, + * if it hasn't been loaded yet. See :js:meth:`Engine.load`. + * + * @param {string=} basePath Base path of the engine to load. + * @return {Promise} A ``Promise`` that resolves once the engine is loaded and initialized. + */ + init: function (basePath) { + if (initPromise) { + return initPromise; + } + if (loadPromise == null) { + if (!basePath) { + initPromise = Promise.reject(new Error('A base path must be provided when calling `init` and the engine is not loaded.')); + return initPromise; + } + Engine.load(basePath, this.config.fileSizes[`${basePath}.wasm`]); + } + const me = this; + function doInit(promise) { + // Care! Promise chaining is bogus with old emscripten versions. + // This caused a regression with the Mono build (which uses an older emscripten version). + // Make sure to test that when refactoring. + return new Promise(function (resolve, reject) { + promise.then(function (response) { + const cloned = new Response(response.clone().body, { 'headers': [['content-type', 'application/wasm']] }); + Godot(me.config.getModuleConfig(loadPath, cloned)).then(function (module) { + const paths = me.config.persistentPaths; + module['initFS'](paths).then(function (err) { + me.rtenv = module; + if (me.config.unloadAfterInit) { + Engine.unload(); + } + resolve(); + }); + }); + }); + }); + } + preloader.setProgressFunc(this.config.onProgress); + initPromise = doInit(loadPromise); + return initPromise; + }, + + /** + * Load a file so it is available in the instance's file system once it runs. Must be called **before** starting the + * instance. + * + * If not provided, the ``path`` is derived from the URL of the loaded file. + * + * @param {string|ArrayBuffer} file The file to preload. + * + * If a ``string`` the file will be loaded from that path. + * + * If an ``ArrayBuffer`` or a view on one, the buffer will used as the content of the file. + * + * @param {string=} path Path by which the file will be accessible. Required, if ``file`` is not a string. + * + * @returns {Promise} A Promise that resolves once the file is loaded. + */ + preloadFile: function (file, path) { + return preloader.preload(file, path, this.config.fileSizes[file]); + }, + + /** + * Start the engine instance using the given override configuration (if any). + * :js:meth:`startGame ` can be used in typical cases instead. + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * The engine must be loaded beforehand. + * + * Fails if a canvas cannot be found on the page, or not specified in the configuration. + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the engine started. + */ + start: function (override) { + this.config.update(override); + const me = this; + return me.init().then(function () { + if (!me.rtenv) { + return Promise.reject(new Error('The engine must be initialized before it can be started')); + } + + let config = {}; + try { + config = me.config.getGodotConfig(function () { + me.rtenv = null; + }); + } catch (e) { + return Promise.reject(e); + } + // Godot configuration. + me.rtenv['initConfig'](config); + + // Preload GDNative libraries. + const libs = []; + me.config.gdnativeLibs.forEach(function (lib) { + libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true })); + }); + return Promise.all(libs).then(function () { + return new Promise(function (resolve, reject) { + preloader.preloadedFiles.forEach(function (file) { + me.rtenv['copyToFS'](file.path, file.buffer); + }); + preloader.preloadedFiles.length = 0; // Clear memory + me.rtenv['callMain'](me.config.args); + initPromise = null; + if (me.config.serviceWorker && 'serviceWorker' in navigator) { + navigator.serviceWorker.register(me.config.serviceWorker); + } + resolve(); + }); + }); + }); + }, + + /** + * Start the game instance using the given configuration override (if any). + * + * This will initialize the instance if it is not initialized. For manual initialization, see :js:meth:`init `. + * + * This will load the engine if it is not loaded, and preload the main pck. + * + * This method expects the initial config (or the override) to have both the :js:attr:`executable` and :js:attr:`mainPack` + * properties set (normally done by the editor during export). + * + * @param {EngineConfig} override An optional configuration override. + * @return {Promise} Promise that resolves once the game started. + */ + startGame: function (override) { + this.config.update(override); + // Add main-pack argument. + const exe = this.config.executable; + const pack = this.config.mainPack || `${exe}.pck`; + this.config.args = ['--main-pack', pack].concat(this.config.args); + // Start and init with execName as loadPath if not inited. + const me = this; + return Promise.all([ + this.init(exe), + this.preloadFile(pack, pack), + ]).then(function () { + return me.start.apply(me); + }); + }, + + /** + * Create a file at the specified ``path`` with the passed as ``buffer`` in the instance's file system. + * + * @param {string} path The location where the file will be created. + * @param {ArrayBuffer} buffer The content of the file. + */ + copyToFS: function (path, buffer) { + if (this.rtenv == null) { + throw new Error('Engine must be inited before copying files'); + } + this.rtenv['copyToFS'](path, buffer); + }, + + /** + * Request that the current instance quit. + * + * This is akin the user pressing the close button in the window manager, and will + * have no effect if the engine has crashed, or is stuck in a loop. + * + */ + requestQuit: function () { + if (this.rtenv) { + this.rtenv['request_quit'](); + } + }, + }; + + Engine.prototype = proto; + // Closure compiler exported instance methods. + Engine.prototype['init'] = Engine.prototype.init; + Engine.prototype['preloadFile'] = Engine.prototype.preloadFile; + Engine.prototype['start'] = Engine.prototype.start; + Engine.prototype['startGame'] = Engine.prototype.startGame; + Engine.prototype['copyToFS'] = Engine.prototype.copyToFS; + Engine.prototype['requestQuit'] = Engine.prototype.requestQuit; + // Also expose static methods as instance methods + Engine.prototype['load'] = Engine.load; + Engine.prototype['unload'] = Engine.unload; + Engine.prototype['isWebGLAvailable'] = Engine.isWebGLAvailable; + return new Engine(initConfig); + } + + // Closure compiler exported static methods. + SafeEngine['load'] = Engine.load; + SafeEngine['unload'] = Engine.unload; + SafeEngine['isWebGLAvailable'] = Engine.isWebGLAvailable; + + return SafeEngine; +}()); +if (typeof window !== 'undefined') { + window['Engine'] = Engine; +} diff --git a/bins/1.1.1.0/html5/index.pck b/bins/1.1.1.0/html5/index.pck new file mode 100644 index 0000000..162a478 Binary files /dev/null and b/bins/1.1.1.0/html5/index.pck differ diff --git a/bins/1.1.1.0/html5/index.png b/bins/1.1.1.0/html5/index.png new file mode 100644 index 0000000..a7baea4 Binary files /dev/null and b/bins/1.1.1.0/html5/index.png differ diff --git a/bins/1.1.1.0/html5/index.wasm b/bins/1.1.1.0/html5/index.wasm new file mode 100644 index 0000000..5151d56 Binary files /dev/null and b/bins/1.1.1.0/html5/index.wasm differ diff --git a/bins/1.1.1.0/html5/thelostmemory_v1.1.1.0_html5.zip b/bins/1.1.1.0/html5/thelostmemory_v1.1.1.0_html5.zip new file mode 100644 index 0000000..6c14c10 Binary files /dev/null and b/bins/1.1.1.0/html5/thelostmemory_v1.1.1.0_html5.zip differ diff --git a/bins/1.1.1.0/win/thelostmemory.exe b/bins/1.1.1.0/win/thelostmemory.exe new file mode 100644 index 0000000..a06c347 Binary files /dev/null and b/bins/1.1.1.0/win/thelostmemory.exe differ diff --git a/bins/1.1.1.0/win/thelostmemory.pck b/bins/1.1.1.0/win/thelostmemory.pck new file mode 100644 index 0000000..49ac0c6 Binary files /dev/null and b/bins/1.1.1.0/win/thelostmemory.pck differ diff --git a/bins/1.1.1.0/win/thelostmemory_v1.1.1.0_win.zip b/bins/1.1.1.0/win/thelostmemory_v1.1.1.0_win.zip new file mode 100644 index 0000000..565f596 Binary files /dev/null and b/bins/1.1.1.0/win/thelostmemory_v1.1.1.0_win.zip differ diff --git a/project/.import/.gdignore b/project/.import/.gdignore new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/project/.import/.gdignore @@ -0,0 +1 @@ + diff --git a/project/.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.md5 b/project/.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.md5 new file mode 100644 index 0000000..7306499 --- /dev/null +++ b/project/.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.md5 @@ -0,0 +1,3 @@ +source_md5="d3b8e1b6f28750540001384a4dae6073" +dest_md5="13f329af143fe51772e631f58386f355" + diff --git a/project/.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.sample b/project/.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.sample new file mode 100644 index 0000000..853e792 Binary files /dev/null and b/project/.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.sample differ diff --git a/project/.import/Bench.png-1169e8a3d49377ed2d9605dd4b9e2e38.md5 b/project/.import/Bench.png-1169e8a3d49377ed2d9605dd4b9e2e38.md5 new file mode 100644 index 0000000..c2e10a0 --- /dev/null +++ b/project/.import/Bench.png-1169e8a3d49377ed2d9605dd4b9e2e38.md5 @@ -0,0 +1,3 @@ +source_md5="dac424961c13cbf6f62c6dbf45aee29b" +dest_md5="c08cde08724fba167aa5b1f68c78e4da" + diff --git a/project/.import/Bench.png-1169e8a3d49377ed2d9605dd4b9e2e38.stex b/project/.import/Bench.png-1169e8a3d49377ed2d9605dd4b9e2e38.stex new file mode 100644 index 0000000..40313ef Binary files /dev/null and b/project/.import/Bench.png-1169e8a3d49377ed2d9605dd4b9e2e38.stex differ diff --git a/project/.import/Big-wooden-fence-1.png-39523221f0e93c5d0ad5ffe51af6bf6c.md5 b/project/.import/Big-wooden-fence-1.png-39523221f0e93c5d0ad5ffe51af6bf6c.md5 new file mode 100644 index 0000000..ee4b568 --- /dev/null +++ b/project/.import/Big-wooden-fence-1.png-39523221f0e93c5d0ad5ffe51af6bf6c.md5 @@ -0,0 +1,3 @@ +source_md5="d72436f33cb482560d1014f65468c3af" +dest_md5="b4d6d8f2187a7ab945376ae3cc9f794a" + diff --git a/project/.import/Big-wooden-fence-1.png-39523221f0e93c5d0ad5ffe51af6bf6c.stex b/project/.import/Big-wooden-fence-1.png-39523221f0e93c5d0ad5ffe51af6bf6c.stex new file mode 100644 index 0000000..6de30db Binary files /dev/null and b/project/.import/Big-wooden-fence-1.png-39523221f0e93c5d0ad5ffe51af6bf6c.stex differ diff --git a/project/.import/Big-wooden-fence-2.png-9222e5526c162fb3ca1141c4bdcf6ef3.md5 b/project/.import/Big-wooden-fence-2.png-9222e5526c162fb3ca1141c4bdcf6ef3.md5 new file mode 100644 index 0000000..304e90f --- /dev/null +++ b/project/.import/Big-wooden-fence-2.png-9222e5526c162fb3ca1141c4bdcf6ef3.md5 @@ -0,0 +1,3 @@ +source_md5="914e8af982a26c54bd0c20e5da9c58f1" +dest_md5="6ebfea520ca23d920a9f55cb931d3f00" + diff --git a/project/.import/Big-wooden-fence-2.png-9222e5526c162fb3ca1141c4bdcf6ef3.stex b/project/.import/Big-wooden-fence-2.png-9222e5526c162fb3ca1141c4bdcf6ef3.stex new file mode 100644 index 0000000..7fa9d59 Binary files /dev/null and b/project/.import/Big-wooden-fence-2.png-9222e5526c162fb3ca1141c4bdcf6ef3.stex differ diff --git a/project/.import/Big-wooden-fence-3.png-6690edf91d02ae3dd8a6e5d5ff7f12cb.md5 b/project/.import/Big-wooden-fence-3.png-6690edf91d02ae3dd8a6e5d5ff7f12cb.md5 new file mode 100644 index 0000000..fca007d --- /dev/null +++ b/project/.import/Big-wooden-fence-3.png-6690edf91d02ae3dd8a6e5d5ff7f12cb.md5 @@ -0,0 +1,3 @@ +source_md5="83a4c00ec3566a6993e9e02ca3be991a" +dest_md5="7b7e0ca976b7dabe832cc005f3c46ead" + diff --git a/project/.import/Big-wooden-fence-3.png-6690edf91d02ae3dd8a6e5d5ff7f12cb.stex b/project/.import/Big-wooden-fence-3.png-6690edf91d02ae3dd8a6e5d5ff7f12cb.stex new file mode 100644 index 0000000..77abc4a Binary files /dev/null and b/project/.import/Big-wooden-fence-3.png-6690edf91d02ae3dd8a6e5d5ff7f12cb.stex differ diff --git a/project/.import/Big-wooden-fence-4.png-f7ce7dbfe0fce7f7fd2a03ecf983dc79.md5 b/project/.import/Big-wooden-fence-4.png-f7ce7dbfe0fce7f7fd2a03ecf983dc79.md5 new file mode 100644 index 0000000..9fc702f --- /dev/null +++ b/project/.import/Big-wooden-fence-4.png-f7ce7dbfe0fce7f7fd2a03ecf983dc79.md5 @@ -0,0 +1,3 @@ +source_md5="dfe59b9b696bbc6f80a14472847fadd4" +dest_md5="5040637b1f76615484949228153ed061" + diff --git a/project/.import/Big-wooden-fence-4.png-f7ce7dbfe0fce7f7fd2a03ecf983dc79.stex b/project/.import/Big-wooden-fence-4.png-f7ce7dbfe0fce7f7fd2a03ecf983dc79.stex new file mode 100644 index 0000000..1e60a83 Binary files /dev/null and b/project/.import/Big-wooden-fence-4.png-f7ce7dbfe0fce7f7fd2a03ecf983dc79.stex differ diff --git a/project/.import/Bright-grass-tileset.png-c0ee7148cc2b817a3587dcbad4364966.md5 b/project/.import/Bright-grass-tileset.png-c0ee7148cc2b817a3587dcbad4364966.md5 new file mode 100644 index 0000000..a5c845d --- /dev/null +++ b/project/.import/Bright-grass-tileset.png-c0ee7148cc2b817a3587dcbad4364966.md5 @@ -0,0 +1,3 @@ +source_md5="74c8cd32fc67386b042e86df2b94813d" +dest_md5="173f05f114a919f048952aa6e3d95f5f" + diff --git a/project/.import/Bright-grass-tileset.png-c0ee7148cc2b817a3587dcbad4364966.stex b/project/.import/Bright-grass-tileset.png-c0ee7148cc2b817a3587dcbad4364966.stex new file mode 100644 index 0000000..d08ee91 Binary files /dev/null and b/project/.import/Bright-grass-tileset.png-c0ee7148cc2b817a3587dcbad4364966.stex differ diff --git a/project/.import/Bush-1.png-de0919960f06866d25b341a9bb7755db.md5 b/project/.import/Bush-1.png-de0919960f06866d25b341a9bb7755db.md5 new file mode 100644 index 0000000..6d8dc0d --- /dev/null +++ b/project/.import/Bush-1.png-de0919960f06866d25b341a9bb7755db.md5 @@ -0,0 +1,3 @@ +source_md5="dc108b7636207265771d15cc4add06e5" +dest_md5="adee137b71ca1826e3392da7addda26f" + diff --git a/project/.import/Bush-1.png-de0919960f06866d25b341a9bb7755db.stex b/project/.import/Bush-1.png-de0919960f06866d25b341a9bb7755db.stex new file mode 100644 index 0000000..6909b2d Binary files /dev/null and b/project/.import/Bush-1.png-de0919960f06866d25b341a9bb7755db.stex differ diff --git a/project/.import/Bush-2.png-c5334cda3d51fe7bfd410a668ae28e14.md5 b/project/.import/Bush-2.png-c5334cda3d51fe7bfd410a668ae28e14.md5 new file mode 100644 index 0000000..bfc05f2 --- /dev/null +++ b/project/.import/Bush-2.png-c5334cda3d51fe7bfd410a668ae28e14.md5 @@ -0,0 +1,3 @@ +source_md5="581ed0a3402b7712f04f6538e960baf0" +dest_md5="e542453df2dc90e422fd9fa4ddcf33bd" + diff --git a/project/.import/Bush-2.png-c5334cda3d51fe7bfd410a668ae28e14.stex b/project/.import/Bush-2.png-c5334cda3d51fe7bfd410a668ae28e14.stex new file mode 100644 index 0000000..c10fe02 Binary files /dev/null and b/project/.import/Bush-2.png-c5334cda3d51fe7bfd410a668ae28e14.stex differ diff --git a/project/.import/Bush-3.png-5f0c4d93af669f4b4d758b065e1480cb.md5 b/project/.import/Bush-3.png-5f0c4d93af669f4b4d758b065e1480cb.md5 new file mode 100644 index 0000000..21da051 --- /dev/null +++ b/project/.import/Bush-3.png-5f0c4d93af669f4b4d758b065e1480cb.md5 @@ -0,0 +1,3 @@ +source_md5="d3e3c3068e0aef308f5da8d9cd5128c0" +dest_md5="fee91571c56b13830d2479e8fbdddcae" + diff --git a/project/.import/Bush-3.png-5f0c4d93af669f4b4d758b065e1480cb.stex b/project/.import/Bush-3.png-5f0c4d93af669f4b4d758b065e1480cb.stex new file mode 100644 index 0000000..56ea793 Binary files /dev/null and b/project/.import/Bush-3.png-5f0c4d93af669f4b4d758b065e1480cb.stex differ diff --git a/project/.import/Bush-4.png-7a1bf07c9b546819bc08c14bb222bac1.md5 b/project/.import/Bush-4.png-7a1bf07c9b546819bc08c14bb222bac1.md5 new file mode 100644 index 0000000..b7317ca --- /dev/null +++ b/project/.import/Bush-4.png-7a1bf07c9b546819bc08c14bb222bac1.md5 @@ -0,0 +1,3 @@ +source_md5="1f483e9e7e3042c95c6fae879421e21b" +dest_md5="e1d6075bee16f2080f8b70c395a173a9" + diff --git a/project/.import/Bush-4.png-7a1bf07c9b546819bc08c14bb222bac1.stex b/project/.import/Bush-4.png-7a1bf07c9b546819bc08c14bb222bac1.stex new file mode 100644 index 0000000..6a2258e Binary files /dev/null and b/project/.import/Bush-4.png-7a1bf07c9b546819bc08c14bb222bac1.stex differ diff --git a/project/.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.md5 b/project/.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.md5 new file mode 100644 index 0000000..abf6ae4 --- /dev/null +++ b/project/.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.md5 @@ -0,0 +1,3 @@ +source_md5="e810e104de7d06db1e6e5c13bdf9ae75" +dest_md5="ba08252ff99c8f1a532f2c6beb56f878" + diff --git a/project/.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.stex b/project/.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.stex new file mode 100644 index 0000000..13b827a Binary files /dev/null and b/project/.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.stex differ diff --git a/project/.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.md5 b/project/.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.md5 new file mode 100644 index 0000000..6fd3340 --- /dev/null +++ b/project/.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.md5 @@ -0,0 +1,3 @@ +source_md5="8033e5afb60c6510d30ff67ee88a9b49" +dest_md5="2e608f11672f12e468dacb2122d6a0c6" + diff --git a/project/.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.stex b/project/.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.stex new file mode 100644 index 0000000..bc958ec Binary files /dev/null and b/project/.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.stex differ diff --git a/project/.import/Chest.png-bdcaf3f7eec17008e9b01e441be655d8.md5 b/project/.import/Chest.png-bdcaf3f7eec17008e9b01e441be655d8.md5 new file mode 100644 index 0000000..d616cb7 --- /dev/null +++ b/project/.import/Chest.png-bdcaf3f7eec17008e9b01e441be655d8.md5 @@ -0,0 +1,3 @@ +source_md5="4e7e9d32491b82f79cc3a3031de580c7" +dest_md5="7f3ee09ee73531ad13406fec89f7a0d9" + diff --git a/project/.import/Chest.png-bdcaf3f7eec17008e9b01e441be655d8.stex b/project/.import/Chest.png-bdcaf3f7eec17008e9b01e441be655d8.stex new file mode 100644 index 0000000..b6f94e7 Binary files /dev/null and b/project/.import/Chest.png-bdcaf3f7eec17008e9b01e441be655d8.stex differ diff --git a/project/.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.md5 b/project/.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.md5 new file mode 100644 index 0000000..1d7cd16 --- /dev/null +++ b/project/.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.md5 @@ -0,0 +1,3 @@ +source_md5="e50d59ad56ece23462abdf4641ff33d3" +dest_md5="d1a1a9c1229e54f0f63a23bb8df95dfa" + diff --git a/project/.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.stex b/project/.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.stex new file mode 100644 index 0000000..eff5eea Binary files /dev/null and b/project/.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.stex differ diff --git a/project/.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.md5 b/project/.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.md5 new file mode 100644 index 0000000..d65aa0e --- /dev/null +++ b/project/.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.md5 @@ -0,0 +1,3 @@ +source_md5="e5ba347e9198ce16ff1f504649e69f91" +dest_md5="d382eadc322f74a09366fcbe2ab70baa" + diff --git a/project/.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.stex b/project/.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.stex new file mode 100644 index 0000000..e2b1c2d Binary files /dev/null and b/project/.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.stex differ diff --git a/project/.import/Dark-grass-tileset.png-f93ed6b32bf35efe459d9ca254a2b6e0.md5 b/project/.import/Dark-grass-tileset.png-f93ed6b32bf35efe459d9ca254a2b6e0.md5 new file mode 100644 index 0000000..9902c88 --- /dev/null +++ b/project/.import/Dark-grass-tileset.png-f93ed6b32bf35efe459d9ca254a2b6e0.md5 @@ -0,0 +1,3 @@ +source_md5="92b8fdc59064743cfc0477ad9b1752b0" +dest_md5="aa4e2a2c803c3e2ef61ba4f882655088" + diff --git a/project/.import/Dark-grass-tileset.png-f93ed6b32bf35efe459d9ca254a2b6e0.stex b/project/.import/Dark-grass-tileset.png-f93ed6b32bf35efe459d9ca254a2b6e0.stex new file mode 100644 index 0000000..0261471 Binary files /dev/null and b/project/.import/Dark-grass-tileset.png-f93ed6b32bf35efe459d9ca254a2b6e0.stex differ diff --git a/project/.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.md5 b/project/.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.md5 new file mode 100644 index 0000000..d867225 --- /dev/null +++ b/project/.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.md5 @@ -0,0 +1,3 @@ +source_md5="1a7e02294591a053634f66b57ebff1ef" +dest_md5="aa10e8729e11477970392a88e4b65b85" + diff --git a/project/.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.stex b/project/.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.stex new file mode 100644 index 0000000..4d9293f Binary files /dev/null and b/project/.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.stex differ diff --git a/project/.import/Earth-tileset.png-20f284de39b4e7ebaf3bc31f6b13799f.md5 b/project/.import/Earth-tileset.png-20f284de39b4e7ebaf3bc31f6b13799f.md5 new file mode 100644 index 0000000..9a838b6 --- /dev/null +++ b/project/.import/Earth-tileset.png-20f284de39b4e7ebaf3bc31f6b13799f.md5 @@ -0,0 +1,3 @@ +source_md5="53c15f8f32e4668c86a6c240c599a580" +dest_md5="9013df52a7a260148df80bd016d0fb62" + diff --git a/project/.import/Earth-tileset.png-20f284de39b4e7ebaf3bc31f6b13799f.stex b/project/.import/Earth-tileset.png-20f284de39b4e7ebaf3bc31f6b13799f.stex new file mode 100644 index 0000000..8b699ee Binary files /dev/null and b/project/.import/Earth-tileset.png-20f284de39b4e7ebaf3bc31f6b13799f.stex differ diff --git a/project/.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.md5 b/project/.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.md5 new file mode 100644 index 0000000..5fef6b1 --- /dev/null +++ b/project/.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.md5 @@ -0,0 +1,3 @@ +source_md5="c9e110f57aedb2189b68c53469c2b4ab" +dest_md5="ae3ad257f76e8af3c3a8e5da733db499" + diff --git a/project/.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.stex b/project/.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.stex new file mode 100644 index 0000000..6bd9a98 Binary files /dev/null and b/project/.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.stex differ diff --git a/project/.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.md5 b/project/.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.md5 new file mode 100644 index 0000000..baad65b --- /dev/null +++ b/project/.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.md5 @@ -0,0 +1,3 @@ +source_md5="57901306bb9b7440b22b19f5b2ae99a8" +dest_md5="9c44147b0305dec3b5b6c16e0fda843e" + diff --git a/project/.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.stex b/project/.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.stex new file mode 100644 index 0000000..24e7da1 Binary files /dev/null and b/project/.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.stex differ diff --git a/project/.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.md5 b/project/.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.md5 new file mode 100644 index 0000000..28b8a0d --- /dev/null +++ b/project/.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.md5 @@ -0,0 +1,3 @@ +source_md5="870b051e2003343fea95e26cedb0508c" +dest_md5="7f51da2eb9175c6118ad9a2f63b75335" + diff --git a/project/.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.stex b/project/.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.stex new file mode 100644 index 0000000..9e7b8ec Binary files /dev/null and b/project/.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.stex differ diff --git a/project/.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.md5 b/project/.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.md5 new file mode 100644 index 0000000..872f7f8 --- /dev/null +++ b/project/.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.md5 @@ -0,0 +1,3 @@ +source_md5="65233b7cd54d81bb8534ff7be288da8f" +dest_md5="b670a767da2b5338e00848146f6afee2" + diff --git a/project/.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.stex b/project/.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.stex new file mode 100644 index 0000000..c415f28 Binary files /dev/null and b/project/.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.stex differ diff --git a/project/.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.md5 b/project/.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.md5 new file mode 100644 index 0000000..dce2eee --- /dev/null +++ b/project/.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.md5 @@ -0,0 +1,3 @@ +source_md5="6728428a1290e00c2469da8c8ef6858d" +dest_md5="c18097f5b0f208985541e5e3ab0d68ce" + diff --git a/project/.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.stex b/project/.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.stex new file mode 100644 index 0000000..66fcbc2 Binary files /dev/null and b/project/.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.stex differ diff --git a/project/.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.md5 b/project/.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.md5 new file mode 100644 index 0000000..afc07b8 --- /dev/null +++ b/project/.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.md5 @@ -0,0 +1,3 @@ +source_md5="0a32728291ccf1630aa58ef61df2b6ce" +dest_md5="a237a9555ba876df93761735246d97dd" + diff --git a/project/.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.stex b/project/.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.stex new file mode 100644 index 0000000..34852de Binary files /dev/null and b/project/.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.stex differ diff --git a/project/.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.md5 b/project/.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.md5 new file mode 100644 index 0000000..759623b --- /dev/null +++ b/project/.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.md5 @@ -0,0 +1,3 @@ +source_md5="bd5d2d2ed8f2e567bd0096ccdbea13df" +dest_md5="73941f9856f385ccf29e613b2cf5d0ed" + diff --git a/project/.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.stex b/project/.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.stex new file mode 100644 index 0000000..3eaab49 Binary files /dev/null and b/project/.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.stex differ diff --git a/project/.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.md5 b/project/.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.md5 new file mode 100644 index 0000000..db521b9 --- /dev/null +++ b/project/.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.md5 @@ -0,0 +1,3 @@ +source_md5="e61701176ef35b0eddd74a9b61f86e2c" +dest_md5="eef1804e29af263c154f8a8bc2287aa1" + diff --git a/project/.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.stex b/project/.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.stex new file mode 100644 index 0000000..96452eb Binary files /dev/null and b/project/.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.stex differ diff --git a/project/.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.md5 b/project/.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.md5 new file mode 100644 index 0000000..a626be8 --- /dev/null +++ b/project/.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.md5 @@ -0,0 +1,3 @@ +source_md5="88c7597f9d0a5e8d9b8eb3710e94d5be" +dest_md5="1a2a0cb1278d7b58626b612852ac8bcf" + diff --git a/project/.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.stex b/project/.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.stex new file mode 100644 index 0000000..579f872 Binary files /dev/null and b/project/.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.stex differ diff --git a/project/.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.md5 b/project/.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.md5 new file mode 100644 index 0000000..1a24736 --- /dev/null +++ b/project/.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.md5 @@ -0,0 +1,3 @@ +source_md5="9b6c3d113ded39de7ad66631bb813271" +dest_md5="46f4585f50787ad9057763956c4c867a" + diff --git a/project/.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.stex b/project/.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.stex new file mode 100644 index 0000000..add1d1a Binary files /dev/null and b/project/.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.stex differ diff --git a/project/.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.md5 b/project/.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.md5 new file mode 100644 index 0000000..81a020d --- /dev/null +++ b/project/.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.md5 @@ -0,0 +1,3 @@ +source_md5="db6f486877067ebc6208ecd2e94c9c95" +dest_md5="f2d3ae3e1577e658a3ee3ad735c8e357" + diff --git a/project/.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.stex b/project/.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.stex new file mode 100644 index 0000000..ab11793 Binary files /dev/null and b/project/.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.stex differ diff --git a/project/.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.md5 b/project/.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.md5 new file mode 100644 index 0000000..299b92f --- /dev/null +++ b/project/.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.md5 @@ -0,0 +1,3 @@ +source_md5="ffec06162617d64beb48285e3c6088e9" +dest_md5="e273b01f84a0f0a455ed08ea5f5ee2ec" + diff --git a/project/.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.stex b/project/.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.stex new file mode 100644 index 0000000..f16e88c Binary files /dev/null and b/project/.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.stex differ diff --git a/project/.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.md5 b/project/.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.md5 new file mode 100644 index 0000000..f4612d9 --- /dev/null +++ b/project/.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.md5 @@ -0,0 +1,3 @@ +source_md5="ce8d1e93cf71af80bb803c427248eefd" +dest_md5="2ba90ad6b818fe612c9a7375a50f9a13" + diff --git a/project/.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.stex b/project/.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.stex new file mode 100644 index 0000000..f08fdd3 Binary files /dev/null and b/project/.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.stex differ diff --git a/project/.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.md5 b/project/.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.md5 new file mode 100644 index 0000000..3eb4dff --- /dev/null +++ b/project/.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.md5 @@ -0,0 +1,3 @@ +source_md5="c73a02e677c8ff956d6c6148ef60bad1" +dest_md5="2bd7a15bb3027ba645d99767c734a6e5" + diff --git a/project/.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.stex b/project/.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.stex new file mode 100644 index 0000000..518b43e Binary files /dev/null and b/project/.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.stex differ diff --git a/project/.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.md5 b/project/.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.md5 new file mode 100644 index 0000000..6425bd6 --- /dev/null +++ b/project/.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.md5 @@ -0,0 +1,3 @@ +source_md5="642123d9e3748e038510a931396ee8e6" +dest_md5="db5891eb421488481d6c3d9328a19d44" + diff --git a/project/.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.stex b/project/.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.stex new file mode 100644 index 0000000..b8daabc Binary files /dev/null and b/project/.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.stex differ diff --git a/project/.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.md5 b/project/.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.md5 new file mode 100644 index 0000000..ba2dd44 --- /dev/null +++ b/project/.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.md5 @@ -0,0 +1,3 @@ +source_md5="c70d0038e7be49cefd783c382a346f2a" +dest_md5="1a0f33dd472f59c3cd60a557442de08a" + diff --git a/project/.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.stex b/project/.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.stex new file mode 100644 index 0000000..99ee998 Binary files /dev/null and b/project/.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.stex differ diff --git a/project/.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.md5 b/project/.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.md5 new file mode 100644 index 0000000..6a5e18e --- /dev/null +++ b/project/.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.md5 @@ -0,0 +1,3 @@ +source_md5="26791fd15fcc7cfdb8e2dbdfeec7a34a" +dest_md5="50dfaf75a561465cf37db8cda4ca8c69" + diff --git a/project/.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.stex b/project/.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.stex new file mode 100644 index 0000000..273b612 Binary files /dev/null and b/project/.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.stex differ diff --git a/project/.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.md5 b/project/.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.md5 new file mode 100644 index 0000000..bc69257 --- /dev/null +++ b/project/.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.md5 @@ -0,0 +1,3 @@ +source_md5="59a74af7b24b1f319df666ee0fa2669c" +dest_md5="8fd1e368678ff4224c764a09c3981319" + diff --git a/project/.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.stex b/project/.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.stex new file mode 100644 index 0000000..de62102 Binary files /dev/null and b/project/.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.stex differ diff --git a/project/.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.md5 b/project/.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.md5 new file mode 100644 index 0000000..2734076 --- /dev/null +++ b/project/.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.md5 @@ -0,0 +1,3 @@ +source_md5="0e38fad66b472486135d7cb248897627" +dest_md5="e3fc6531c35208626d931ead325fb16f" + diff --git a/project/.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.stex b/project/.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.stex new file mode 100644 index 0000000..35091f5 Binary files /dev/null and b/project/.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.stex differ diff --git a/project/.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.md5 b/project/.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.md5 new file mode 100644 index 0000000..1194f86 --- /dev/null +++ b/project/.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.md5 @@ -0,0 +1,3 @@ +source_md5="3d2f7e5b1c26c1cd771a27b99c363b8a" +dest_md5="41dff3b2ca7fcef0b359228de1500fc8" + diff --git a/project/.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.stex b/project/.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.stex new file mode 100644 index 0000000..53ebc84 Binary files /dev/null and b/project/.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.stex differ diff --git a/project/.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.md5 b/project/.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.md5 new file mode 100644 index 0000000..f9940dd --- /dev/null +++ b/project/.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.md5 @@ -0,0 +1,3 @@ +source_md5="e53d10c7b81f270425e50451f43fe154" +dest_md5="a6750c180f4fbbdb1ab97215d0615cd5" + diff --git a/project/.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.stex b/project/.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.stex new file mode 100644 index 0000000..5ae4f7f Binary files /dev/null and b/project/.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.stex differ diff --git a/project/.import/Flower-1.png-2dac8d9d444879cc14599208eeafef77.md5 b/project/.import/Flower-1.png-2dac8d9d444879cc14599208eeafef77.md5 new file mode 100644 index 0000000..e3942f2 --- /dev/null +++ b/project/.import/Flower-1.png-2dac8d9d444879cc14599208eeafef77.md5 @@ -0,0 +1,3 @@ +source_md5="66e6c525ec39a94cc3afa8b522300068" +dest_md5="d1a7259259425dcc41f48a8cf9a7a726" + diff --git a/project/.import/Flower-1.png-2dac8d9d444879cc14599208eeafef77.stex b/project/.import/Flower-1.png-2dac8d9d444879cc14599208eeafef77.stex new file mode 100644 index 0000000..1f8fac3 Binary files /dev/null and b/project/.import/Flower-1.png-2dac8d9d444879cc14599208eeafef77.stex differ diff --git a/project/.import/Flower-2.png-5f191e9b7d8f3431f455d863da654df9.md5 b/project/.import/Flower-2.png-5f191e9b7d8f3431f455d863da654df9.md5 new file mode 100644 index 0000000..dbf7541 --- /dev/null +++ b/project/.import/Flower-2.png-5f191e9b7d8f3431f455d863da654df9.md5 @@ -0,0 +1,3 @@ +source_md5="9e608f2f7299815e7f40c90e66074215" +dest_md5="833ea00eb75a759671bc15b47abb3642" + diff --git a/project/.import/Flower-2.png-5f191e9b7d8f3431f455d863da654df9.stex b/project/.import/Flower-2.png-5f191e9b7d8f3431f455d863da654df9.stex new file mode 100644 index 0000000..3ea1502 Binary files /dev/null and b/project/.import/Flower-2.png-5f191e9b7d8f3431f455d863da654df9.stex differ diff --git a/project/.import/Flower-3.png-c3ecf29a7157e554221543ec2acf964c.md5 b/project/.import/Flower-3.png-c3ecf29a7157e554221543ec2acf964c.md5 new file mode 100644 index 0000000..e521644 --- /dev/null +++ b/project/.import/Flower-3.png-c3ecf29a7157e554221543ec2acf964c.md5 @@ -0,0 +1,3 @@ +source_md5="db9c3a6d0402110ab15d3d798181f9c1" +dest_md5="e1c8a2ef1286cd1aad78723e5331aca7" + diff --git a/project/.import/Flower-3.png-c3ecf29a7157e554221543ec2acf964c.stex b/project/.import/Flower-3.png-c3ecf29a7157e554221543ec2acf964c.stex new file mode 100644 index 0000000..dc9df5e Binary files /dev/null and b/project/.import/Flower-3.png-c3ecf29a7157e554221543ec2acf964c.stex differ diff --git a/project/.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.md5 b/project/.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.md5 new file mode 100644 index 0000000..78cad22 --- /dev/null +++ b/project/.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.md5 @@ -0,0 +1,3 @@ +source_md5="c949bcc9ee1a5fc9b9037b84c33e9b44" +dest_md5="1db7c1781751046d6d64109c9169596d" + diff --git a/project/.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.stex b/project/.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.stex new file mode 100644 index 0000000..2ef3f04 Binary files /dev/null and b/project/.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.stex differ diff --git a/project/.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.md5 b/project/.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.md5 new file mode 100644 index 0000000..4721a6c --- /dev/null +++ b/project/.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.md5 @@ -0,0 +1,3 @@ +source_md5="77ce498a58684595f5a729f7cf3afaa4" +dest_md5="5897bd98218035db7638a832402fedf4" + diff --git a/project/.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.stex b/project/.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.stex new file mode 100644 index 0000000..451c774 Binary files /dev/null and b/project/.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.stex differ diff --git a/project/.import/Grass-1.png-93fb09ac6e5e6fa0e5e3931b3c32ca38.md5 b/project/.import/Grass-1.png-93fb09ac6e5e6fa0e5e3931b3c32ca38.md5 new file mode 100644 index 0000000..614257e --- /dev/null +++ b/project/.import/Grass-1.png-93fb09ac6e5e6fa0e5e3931b3c32ca38.md5 @@ -0,0 +1,3 @@ +source_md5="0630c4fcaea1b406d7d262d98e96b325" +dest_md5="a137acef01e25325dfd106eb24a4e829" + diff --git a/project/.import/Grass-1.png-93fb09ac6e5e6fa0e5e3931b3c32ca38.stex b/project/.import/Grass-1.png-93fb09ac6e5e6fa0e5e3931b3c32ca38.stex new file mode 100644 index 0000000..3b45065 Binary files /dev/null and b/project/.import/Grass-1.png-93fb09ac6e5e6fa0e5e3931b3c32ca38.stex differ diff --git a/project/.import/Grass-2.png-b3992530e888caaf7d1e886ac11acb81.md5 b/project/.import/Grass-2.png-b3992530e888caaf7d1e886ac11acb81.md5 new file mode 100644 index 0000000..2ca9fae --- /dev/null +++ b/project/.import/Grass-2.png-b3992530e888caaf7d1e886ac11acb81.md5 @@ -0,0 +1,3 @@ +source_md5="c1fdccf75c8568e6eddca59566b9878d" +dest_md5="6f6eb0e2ecb37087ec1849e6d2d25c8f" + diff --git a/project/.import/Grass-2.png-b3992530e888caaf7d1e886ac11acb81.stex b/project/.import/Grass-2.png-b3992530e888caaf7d1e886ac11acb81.stex new file mode 100644 index 0000000..985ab67 Binary files /dev/null and b/project/.import/Grass-2.png-b3992530e888caaf7d1e886ac11acb81.stex differ diff --git a/project/.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.md5 b/project/.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.md5 new file mode 100644 index 0000000..d77f085 --- /dev/null +++ b/project/.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.md5 @@ -0,0 +1,3 @@ +source_md5="9a09e1495358b459c8c3c0fb9b67ca0b" +dest_md5="22e9dd77565cb5373091e14c0e844c25" + diff --git a/project/.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.stex b/project/.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.stex new file mode 100644 index 0000000..35aeb31 Binary files /dev/null and b/project/.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.stex differ diff --git a/project/.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.md5 b/project/.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.md5 new file mode 100644 index 0000000..c7ca50e --- /dev/null +++ b/project/.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.md5 @@ -0,0 +1,3 @@ +source_md5="31e62ab84458d7ce24c2a1f7b0abc736" +dest_md5="26fb4428804675bbcf05e8ba7f23cc76" + diff --git a/project/.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.stex b/project/.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.stex new file mode 100644 index 0000000..b4c25ea Binary files /dev/null and b/project/.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.stex differ diff --git a/project/.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.md5 b/project/.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.md5 new file mode 100644 index 0000000..38d726b --- /dev/null +++ b/project/.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.md5 @@ -0,0 +1,3 @@ +source_md5="18a162c9f52dd4065212f393f02028e9" +dest_md5="653fcc010f3e8bf3b406c01f594e0b0e" + diff --git a/project/.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.stex b/project/.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.stex new file mode 100644 index 0000000..860ae93 Binary files /dev/null and b/project/.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.stex differ diff --git a/project/.import/Sculpture-1.png-4ba3dba28c337760416c76ccda10cfee.md5 b/project/.import/Sculpture-1.png-4ba3dba28c337760416c76ccda10cfee.md5 new file mode 100644 index 0000000..37d273c --- /dev/null +++ b/project/.import/Sculpture-1.png-4ba3dba28c337760416c76ccda10cfee.md5 @@ -0,0 +1,3 @@ +source_md5="15580cb997ba6b61987b600f29847e12" +dest_md5="f4550dccd4b27bd5cba3f5666ff78263" + diff --git a/project/.import/Sculpture-1.png-4ba3dba28c337760416c76ccda10cfee.stex b/project/.import/Sculpture-1.png-4ba3dba28c337760416c76ccda10cfee.stex new file mode 100644 index 0000000..7f4dddf Binary files /dev/null and b/project/.import/Sculpture-1.png-4ba3dba28c337760416c76ccda10cfee.stex differ diff --git a/project/.import/Sculture-2.png-cea3b569fc814194cf410d6c3f73ce74.md5 b/project/.import/Sculture-2.png-cea3b569fc814194cf410d6c3f73ce74.md5 new file mode 100644 index 0000000..078e318 --- /dev/null +++ b/project/.import/Sculture-2.png-cea3b569fc814194cf410d6c3f73ce74.md5 @@ -0,0 +1,3 @@ +source_md5="821ed7a28ff1f3c9f4043a551c581a5b" +dest_md5="092d39d34c5190c852fece81d22fafb7" + diff --git a/project/.import/Sculture-2.png-cea3b569fc814194cf410d6c3f73ce74.stex b/project/.import/Sculture-2.png-cea3b569fc814194cf410d6c3f73ce74.stex new file mode 100644 index 0000000..e5a16c9 Binary files /dev/null and b/project/.import/Sculture-2.png-cea3b569fc814194cf410d6c3f73ce74.stex differ diff --git a/project/.import/Stone-1.png-972cee902be4e2e86461a23214860288.md5 b/project/.import/Stone-1.png-972cee902be4e2e86461a23214860288.md5 new file mode 100644 index 0000000..d5601ae --- /dev/null +++ b/project/.import/Stone-1.png-972cee902be4e2e86461a23214860288.md5 @@ -0,0 +1,3 @@ +source_md5="377b04dbb017084e34e9b5568b2cf432" +dest_md5="9b865d9c9c251566243e19348cf13b28" + diff --git a/project/.import/Stone-1.png-972cee902be4e2e86461a23214860288.stex b/project/.import/Stone-1.png-972cee902be4e2e86461a23214860288.stex new file mode 100644 index 0000000..4fbb151 Binary files /dev/null and b/project/.import/Stone-1.png-972cee902be4e2e86461a23214860288.stex differ diff --git a/project/.import/Stone-2.png-716c4ae86601f9a77c1b5a72d6b20255.md5 b/project/.import/Stone-2.png-716c4ae86601f9a77c1b5a72d6b20255.md5 new file mode 100644 index 0000000..907922d --- /dev/null +++ b/project/.import/Stone-2.png-716c4ae86601f9a77c1b5a72d6b20255.md5 @@ -0,0 +1,3 @@ +source_md5="fc72bdcb9ae306ca7ecb075a173954d0" +dest_md5="f51d8fc44e3c25e25be89ed3f3253666" + diff --git a/project/.import/Stone-2.png-716c4ae86601f9a77c1b5a72d6b20255.stex b/project/.import/Stone-2.png-716c4ae86601f9a77c1b5a72d6b20255.stex new file mode 100644 index 0000000..33cde88 Binary files /dev/null and b/project/.import/Stone-2.png-716c4ae86601f9a77c1b5a72d6b20255.stex differ diff --git a/project/.import/Stone-fence-1.png-72da00c51a5fba40903bc89534568cda.md5 b/project/.import/Stone-fence-1.png-72da00c51a5fba40903bc89534568cda.md5 new file mode 100644 index 0000000..3e638c4 --- /dev/null +++ b/project/.import/Stone-fence-1.png-72da00c51a5fba40903bc89534568cda.md5 @@ -0,0 +1,3 @@ +source_md5="948100927db46ae78a80f463cbf24ee5" +dest_md5="635839a7363cc0ec71a2c43d9a6c9fde" + diff --git a/project/.import/Stone-fence-1.png-72da00c51a5fba40903bc89534568cda.stex b/project/.import/Stone-fence-1.png-72da00c51a5fba40903bc89534568cda.stex new file mode 100644 index 0000000..86759fc Binary files /dev/null and b/project/.import/Stone-fence-1.png-72da00c51a5fba40903bc89534568cda.stex differ diff --git a/project/.import/Stone-fence-2.png-4a412abaf3a1697c6d2e302937d3b158.md5 b/project/.import/Stone-fence-2.png-4a412abaf3a1697c6d2e302937d3b158.md5 new file mode 100644 index 0000000..725cf2a --- /dev/null +++ b/project/.import/Stone-fence-2.png-4a412abaf3a1697c6d2e302937d3b158.md5 @@ -0,0 +1,3 @@ +source_md5="a24b8376d0bd0f528bb468132dbe6d23" +dest_md5="31e9e8e46834df587ab09178225f707c" + diff --git a/project/.import/Stone-fence-2.png-4a412abaf3a1697c6d2e302937d3b158.stex b/project/.import/Stone-fence-2.png-4a412abaf3a1697c6d2e302937d3b158.stex new file mode 100644 index 0000000..d80eb1d Binary files /dev/null and b/project/.import/Stone-fence-2.png-4a412abaf3a1697c6d2e302937d3b158.stex differ diff --git a/project/.import/Stone-fence-3.png-3b66cb0de37f39acd4ceed1ceda67687.md5 b/project/.import/Stone-fence-3.png-3b66cb0de37f39acd4ceed1ceda67687.md5 new file mode 100644 index 0000000..fb8a68b --- /dev/null +++ b/project/.import/Stone-fence-3.png-3b66cb0de37f39acd4ceed1ceda67687.md5 @@ -0,0 +1,3 @@ +source_md5="9485affb645c4b8ffab9b88d23d9a705" +dest_md5="fffd6440f36257ddfad9abb592190703" + diff --git a/project/.import/Stone-fence-3.png-3b66cb0de37f39acd4ceed1ceda67687.stex b/project/.import/Stone-fence-3.png-3b66cb0de37f39acd4ceed1ceda67687.stex new file mode 100644 index 0000000..880bd12 Binary files /dev/null and b/project/.import/Stone-fence-3.png-3b66cb0de37f39acd4ceed1ceda67687.stex differ diff --git a/project/.import/Stone-fence-4.png-e8f6d2303fd583bcb8b9371b14f19418.md5 b/project/.import/Stone-fence-4.png-e8f6d2303fd583bcb8b9371b14f19418.md5 new file mode 100644 index 0000000..dc78575 --- /dev/null +++ b/project/.import/Stone-fence-4.png-e8f6d2303fd583bcb8b9371b14f19418.md5 @@ -0,0 +1,3 @@ +source_md5="151c138f23500270c7c515552fb0c190" +dest_md5="bb842ad061aa8e6568586f64cab26675" + diff --git a/project/.import/Stone-fence-4.png-e8f6d2303fd583bcb8b9371b14f19418.stex b/project/.import/Stone-fence-4.png-e8f6d2303fd583bcb8b9371b14f19418.stex new file mode 100644 index 0000000..fcb5aab Binary files /dev/null and b/project/.import/Stone-fence-4.png-e8f6d2303fd583bcb8b9371b14f19418.stex differ diff --git a/project/.import/Stone-path-tileset-horizontal.png-5c0a4b73b760902227bbf5e34fadd140.md5 b/project/.import/Stone-path-tileset-horizontal.png-5c0a4b73b760902227bbf5e34fadd140.md5 new file mode 100644 index 0000000..069d6c1 --- /dev/null +++ b/project/.import/Stone-path-tileset-horizontal.png-5c0a4b73b760902227bbf5e34fadd140.md5 @@ -0,0 +1,3 @@ +source_md5="e72425863aadfaf8b8b11bfcb55fb337" +dest_md5="049bd193cd9f4ed718cdae5a94667b3f" + diff --git a/project/.import/Stone-path-tileset-horizontal.png-5c0a4b73b760902227bbf5e34fadd140.stex b/project/.import/Stone-path-tileset-horizontal.png-5c0a4b73b760902227bbf5e34fadd140.stex new file mode 100644 index 0000000..dbe3407 Binary files /dev/null and b/project/.import/Stone-path-tileset-horizontal.png-5c0a4b73b760902227bbf5e34fadd140.stex differ diff --git a/project/.import/Stone-path-tileset-vertical.png-ed70957154f637215341654b1ea90733.md5 b/project/.import/Stone-path-tileset-vertical.png-ed70957154f637215341654b1ea90733.md5 new file mode 100644 index 0000000..8385eaa --- /dev/null +++ b/project/.import/Stone-path-tileset-vertical.png-ed70957154f637215341654b1ea90733.md5 @@ -0,0 +1,3 @@ +source_md5="71100ac1d0f9dd5cc57d4ee9a1aa62a4" +dest_md5="9c1b726dd1905f943a4073c6c2e365e3" + diff --git a/project/.import/Stone-path-tileset-vertical.png-ed70957154f637215341654b1ea90733.stex b/project/.import/Stone-path-tileset-vertical.png-ed70957154f637215341654b1ea90733.stex new file mode 100644 index 0000000..a3dc9d3 Binary files /dev/null and b/project/.import/Stone-path-tileset-vertical.png-ed70957154f637215341654b1ea90733.stex differ diff --git a/project/.import/Stump.png-f4e591b4188e8109049ff81421a41db4.md5 b/project/.import/Stump.png-f4e591b4188e8109049ff81421a41db4.md5 new file mode 100644 index 0000000..cc53cf4 --- /dev/null +++ b/project/.import/Stump.png-f4e591b4188e8109049ff81421a41db4.md5 @@ -0,0 +1,3 @@ +source_md5="53f57780ca7958610f78263a0419b05f" +dest_md5="6ef00b7dc94947ff72f0782d174e035e" + diff --git a/project/.import/Stump.png-f4e591b4188e8109049ff81421a41db4.stex b/project/.import/Stump.png-f4e591b4188e8109049ff81421a41db4.stex new file mode 100644 index 0000000..76f2205 Binary files /dev/null and b/project/.import/Stump.png-f4e591b4188e8109049ff81421a41db4.stex differ diff --git a/project/.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.md5 b/project/.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.md5 new file mode 100644 index 0000000..5b5d812 --- /dev/null +++ b/project/.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.md5 @@ -0,0 +1,3 @@ +source_md5="b7cab481a3c42e303ff4b33b94e19d0d" +dest_md5="e3f8d4fe202dc14dad62ab163f9d639d" + diff --git a/project/.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.stex b/project/.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.stex new file mode 100644 index 0000000..edcc9b0 Binary files /dev/null and b/project/.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.stex differ diff --git a/project/.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.md5 b/project/.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.md5 new file mode 100644 index 0000000..1985596 --- /dev/null +++ b/project/.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.md5 @@ -0,0 +1,3 @@ +source_md5="15a015655fe232e08696dc9d323b6a9c" +dest_md5="404711408b4b3917ffc09537a4eafbf4" + diff --git a/project/.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.stex b/project/.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.stex new file mode 100644 index 0000000..9a83058 Binary files /dev/null and b/project/.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.stex differ diff --git a/project/.import/Tree-1-1.png-d5d732cc156d61b1ff6def3d82e29e6c.md5 b/project/.import/Tree-1-1.png-d5d732cc156d61b1ff6def3d82e29e6c.md5 new file mode 100644 index 0000000..8b78920 --- /dev/null +++ b/project/.import/Tree-1-1.png-d5d732cc156d61b1ff6def3d82e29e6c.md5 @@ -0,0 +1,3 @@ +source_md5="3a3ea91d671c33ee731bd91d98af9dfc" +dest_md5="a154935578a19749879b4073ba45afc1" + diff --git a/project/.import/Tree-1-1.png-d5d732cc156d61b1ff6def3d82e29e6c.stex b/project/.import/Tree-1-1.png-d5d732cc156d61b1ff6def3d82e29e6c.stex new file mode 100644 index 0000000..5463660 Binary files /dev/null and b/project/.import/Tree-1-1.png-d5d732cc156d61b1ff6def3d82e29e6c.stex differ diff --git a/project/.import/Tree-1-2.png-ed6412cd66c07e1a114dfe7aa0e2315d.md5 b/project/.import/Tree-1-2.png-ed6412cd66c07e1a114dfe7aa0e2315d.md5 new file mode 100644 index 0000000..e7e693b --- /dev/null +++ b/project/.import/Tree-1-2.png-ed6412cd66c07e1a114dfe7aa0e2315d.md5 @@ -0,0 +1,3 @@ +source_md5="5b0914536c605640e5c6eae243dcf0db" +dest_md5="461f8fe87ad2815a3729d1884315fd20" + diff --git a/project/.import/Tree-1-2.png-ed6412cd66c07e1a114dfe7aa0e2315d.stex b/project/.import/Tree-1-2.png-ed6412cd66c07e1a114dfe7aa0e2315d.stex new file mode 100644 index 0000000..640ada1 Binary files /dev/null and b/project/.import/Tree-1-2.png-ed6412cd66c07e1a114dfe7aa0e2315d.stex differ diff --git a/project/.import/Tree-1-3.png-88c6875bbf013788c748b676fd885d84.md5 b/project/.import/Tree-1-3.png-88c6875bbf013788c748b676fd885d84.md5 new file mode 100644 index 0000000..e928cbe --- /dev/null +++ b/project/.import/Tree-1-3.png-88c6875bbf013788c748b676fd885d84.md5 @@ -0,0 +1,3 @@ +source_md5="58d9865758cff3c9ea616f343dc437fa" +dest_md5="398007fe573993d76bfe807bd84e13c9" + diff --git a/project/.import/Tree-1-3.png-88c6875bbf013788c748b676fd885d84.stex b/project/.import/Tree-1-3.png-88c6875bbf013788c748b676fd885d84.stex new file mode 100644 index 0000000..c7285b6 Binary files /dev/null and b/project/.import/Tree-1-3.png-88c6875bbf013788c748b676fd885d84.stex differ diff --git a/project/.import/Tree-1-4.png-a11ea22dd9ee2327fc75af72422f0dd2.md5 b/project/.import/Tree-1-4.png-a11ea22dd9ee2327fc75af72422f0dd2.md5 new file mode 100644 index 0000000..0b3661c --- /dev/null +++ b/project/.import/Tree-1-4.png-a11ea22dd9ee2327fc75af72422f0dd2.md5 @@ -0,0 +1,3 @@ +source_md5="2c5368ea8e7b16654b2bfd7e749b268d" +dest_md5="d7386c17f7213fe27d3952bbc8bef3ac" + diff --git a/project/.import/Tree-1-4.png-a11ea22dd9ee2327fc75af72422f0dd2.stex b/project/.import/Tree-1-4.png-a11ea22dd9ee2327fc75af72422f0dd2.stex new file mode 100644 index 0000000..726ed03 Binary files /dev/null and b/project/.import/Tree-1-4.png-a11ea22dd9ee2327fc75af72422f0dd2.stex differ diff --git a/project/.import/Tree-2-1.png-9d9287cc0da7eee11df44a732310e92a.md5 b/project/.import/Tree-2-1.png-9d9287cc0da7eee11df44a732310e92a.md5 new file mode 100644 index 0000000..ebfc805 --- /dev/null +++ b/project/.import/Tree-2-1.png-9d9287cc0da7eee11df44a732310e92a.md5 @@ -0,0 +1,3 @@ +source_md5="845e168c9b00ee90b2241b1122e03aef" +dest_md5="e6010cd751de5719bc2db09b50685f2b" + diff --git a/project/.import/Tree-2-1.png-9d9287cc0da7eee11df44a732310e92a.stex b/project/.import/Tree-2-1.png-9d9287cc0da7eee11df44a732310e92a.stex new file mode 100644 index 0000000..8a8d193 Binary files /dev/null and b/project/.import/Tree-2-1.png-9d9287cc0da7eee11df44a732310e92a.stex differ diff --git a/project/.import/Tree-2-2.png-62a0ef7ae73d9618eace970618ec299e.md5 b/project/.import/Tree-2-2.png-62a0ef7ae73d9618eace970618ec299e.md5 new file mode 100644 index 0000000..a0b945a --- /dev/null +++ b/project/.import/Tree-2-2.png-62a0ef7ae73d9618eace970618ec299e.md5 @@ -0,0 +1,3 @@ +source_md5="d22d412bc4a84156f9f04d4e81322fc9" +dest_md5="180fb1853bf420634c1036733841b08c" + diff --git a/project/.import/Tree-2-2.png-62a0ef7ae73d9618eace970618ec299e.stex b/project/.import/Tree-2-2.png-62a0ef7ae73d9618eace970618ec299e.stex new file mode 100644 index 0000000..ce62328 Binary files /dev/null and b/project/.import/Tree-2-2.png-62a0ef7ae73d9618eace970618ec299e.stex differ diff --git a/project/.import/Tree-2-3.png-e2e219ed020377d676d0cfbb312351ab.md5 b/project/.import/Tree-2-3.png-e2e219ed020377d676d0cfbb312351ab.md5 new file mode 100644 index 0000000..e8642dc --- /dev/null +++ b/project/.import/Tree-2-3.png-e2e219ed020377d676d0cfbb312351ab.md5 @@ -0,0 +1,3 @@ +source_md5="bcf78451a6fa52549f8b90daebd69aae" +dest_md5="5dd83fb7a9d68b4a73c2678b46550e3a" + diff --git a/project/.import/Tree-2-3.png-e2e219ed020377d676d0cfbb312351ab.stex b/project/.import/Tree-2-3.png-e2e219ed020377d676d0cfbb312351ab.stex new file mode 100644 index 0000000..91a6c36 Binary files /dev/null and b/project/.import/Tree-2-3.png-e2e219ed020377d676d0cfbb312351ab.stex differ diff --git a/project/.import/Tree-2-4.png-ed4e74c29773ec32466dc42a6f668648.md5 b/project/.import/Tree-2-4.png-ed4e74c29773ec32466dc42a6f668648.md5 new file mode 100644 index 0000000..fba81dd --- /dev/null +++ b/project/.import/Tree-2-4.png-ed4e74c29773ec32466dc42a6f668648.md5 @@ -0,0 +1,3 @@ +source_md5="0538a6d525168492f738e148a5485ebc" +dest_md5="2e9323355b8741da4153100572b9ab84" + diff --git a/project/.import/Tree-2-4.png-ed4e74c29773ec32466dc42a6f668648.stex b/project/.import/Tree-2-4.png-ed4e74c29773ec32466dc42a6f668648.stex new file mode 100644 index 0000000..b4fdf73 Binary files /dev/null and b/project/.import/Tree-2-4.png-ed4e74c29773ec32466dc42a6f668648.stex differ diff --git a/project/.import/Tree-3-1.png-703f00bab496fd85451b3df7f3b0d4e9.md5 b/project/.import/Tree-3-1.png-703f00bab496fd85451b3df7f3b0d4e9.md5 new file mode 100644 index 0000000..48f8fc8 --- /dev/null +++ b/project/.import/Tree-3-1.png-703f00bab496fd85451b3df7f3b0d4e9.md5 @@ -0,0 +1,3 @@ +source_md5="6e6cfc49d76a853c532ae8d8a9f600b8" +dest_md5="99bba50ba39824ced048a5c3ae7d32ca" + diff --git a/project/.import/Tree-3-1.png-703f00bab496fd85451b3df7f3b0d4e9.stex b/project/.import/Tree-3-1.png-703f00bab496fd85451b3df7f3b0d4e9.stex new file mode 100644 index 0000000..809bda7 Binary files /dev/null and b/project/.import/Tree-3-1.png-703f00bab496fd85451b3df7f3b0d4e9.stex differ diff --git a/project/.import/Tree-3-2.png-dd4cb82bc5580955c8ff4f8d56c107cd.md5 b/project/.import/Tree-3-2.png-dd4cb82bc5580955c8ff4f8d56c107cd.md5 new file mode 100644 index 0000000..d39bd1f --- /dev/null +++ b/project/.import/Tree-3-2.png-dd4cb82bc5580955c8ff4f8d56c107cd.md5 @@ -0,0 +1,3 @@ +source_md5="e2cb4e21897af84982bebb554330f455" +dest_md5="719a2639269143c79b87a1108006cb57" + diff --git a/project/.import/Tree-3-2.png-dd4cb82bc5580955c8ff4f8d56c107cd.stex b/project/.import/Tree-3-2.png-dd4cb82bc5580955c8ff4f8d56c107cd.stex new file mode 100644 index 0000000..34c3bc0 Binary files /dev/null and b/project/.import/Tree-3-2.png-dd4cb82bc5580955c8ff4f8d56c107cd.stex differ diff --git a/project/.import/Tree-3-3.png-2ead28817396310a66039b59baa51b95.md5 b/project/.import/Tree-3-3.png-2ead28817396310a66039b59baa51b95.md5 new file mode 100644 index 0000000..92999cf --- /dev/null +++ b/project/.import/Tree-3-3.png-2ead28817396310a66039b59baa51b95.md5 @@ -0,0 +1,3 @@ +source_md5="1dbd4434bdb5542dd5c84bf930d7d3b5" +dest_md5="88dbba4e29b53e63baf9397422388d93" + diff --git a/project/.import/Tree-3-3.png-2ead28817396310a66039b59baa51b95.stex b/project/.import/Tree-3-3.png-2ead28817396310a66039b59baa51b95.stex new file mode 100644 index 0000000..daa6943 Binary files /dev/null and b/project/.import/Tree-3-3.png-2ead28817396310a66039b59baa51b95.stex differ diff --git a/project/.import/Tree-3-4.png-541e330cfa94947ea180d5122888bcdb.md5 b/project/.import/Tree-3-4.png-541e330cfa94947ea180d5122888bcdb.md5 new file mode 100644 index 0000000..46aeca1 --- /dev/null +++ b/project/.import/Tree-3-4.png-541e330cfa94947ea180d5122888bcdb.md5 @@ -0,0 +1,3 @@ +source_md5="eb819709eb26a54b4e5c28ccc660afe6" +dest_md5="eb77c2e7a0d866c862b30bffcbd78d0a" + diff --git a/project/.import/Tree-3-4.png-541e330cfa94947ea180d5122888bcdb.stex b/project/.import/Tree-3-4.png-541e330cfa94947ea180d5122888bcdb.stex new file mode 100644 index 0000000..5888c8b Binary files /dev/null and b/project/.import/Tree-3-4.png-541e330cfa94947ea180d5122888bcdb.stex differ diff --git a/project/.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.md5 b/project/.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.md5 new file mode 100644 index 0000000..5dbdd88 --- /dev/null +++ b/project/.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.md5 @@ -0,0 +1,3 @@ +source_md5="ee6cc34976b9980421cf2a25661755f7" +dest_md5="67f031e14975da5849c08fc38a2b75d1" + diff --git a/project/.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.stex b/project/.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.stex new file mode 100644 index 0000000..cc34061 Binary files /dev/null and b/project/.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.stex differ diff --git a/project/.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.md5 b/project/.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.md5 new file mode 100644 index 0000000..06713ff --- /dev/null +++ b/project/.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.md5 @@ -0,0 +1,3 @@ +source_md5="962c994a42ac5410757bb51dae5e00bc" +dest_md5="d4115c51051d3c0a327541d63cb10b83" + diff --git a/project/.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.stex b/project/.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.stex new file mode 100644 index 0000000..f4fb6f5 Binary files /dev/null and b/project/.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.stex differ diff --git a/project/.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.md5 b/project/.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.md5 new file mode 100644 index 0000000..55e4762 --- /dev/null +++ b/project/.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.md5 @@ -0,0 +1,3 @@ +source_md5="1c292efcc03dce611852f05feeea9132" +dest_md5="06b7caf3ca02544b2b49aa41a7c75bf8" + diff --git a/project/.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.stex b/project/.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.stex new file mode 100644 index 0000000..6387c5f Binary files /dev/null and b/project/.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.stex differ diff --git a/project/.import/Wooden-fence-1.png-8def5bae507c89ae20853fb17aaf5e37.md5 b/project/.import/Wooden-fence-1.png-8def5bae507c89ae20853fb17aaf5e37.md5 new file mode 100644 index 0000000..5e0a085 --- /dev/null +++ b/project/.import/Wooden-fence-1.png-8def5bae507c89ae20853fb17aaf5e37.md5 @@ -0,0 +1,3 @@ +source_md5="d0b2f2c774c734e4cd849c4b4cbbe5d8" +dest_md5="f63d866b569201499fb1a24096e80c52" + diff --git a/project/.import/Wooden-fence-1.png-8def5bae507c89ae20853fb17aaf5e37.stex b/project/.import/Wooden-fence-1.png-8def5bae507c89ae20853fb17aaf5e37.stex new file mode 100644 index 0000000..89843a4 Binary files /dev/null and b/project/.import/Wooden-fence-1.png-8def5bae507c89ae20853fb17aaf5e37.stex differ diff --git a/project/.import/Wooden-fence-2.png-85e2cd9852921417616fe63389eacd6c.md5 b/project/.import/Wooden-fence-2.png-85e2cd9852921417616fe63389eacd6c.md5 new file mode 100644 index 0000000..caf068a --- /dev/null +++ b/project/.import/Wooden-fence-2.png-85e2cd9852921417616fe63389eacd6c.md5 @@ -0,0 +1,3 @@ +source_md5="203959c083260a4663697babfba51f79" +dest_md5="4e53d82aa722f4f5dd805d33828cb388" + diff --git a/project/.import/Wooden-fence-2.png-85e2cd9852921417616fe63389eacd6c.stex b/project/.import/Wooden-fence-2.png-85e2cd9852921417616fe63389eacd6c.stex new file mode 100644 index 0000000..a738cb8 Binary files /dev/null and b/project/.import/Wooden-fence-2.png-85e2cd9852921417616fe63389eacd6c.stex differ diff --git a/project/.import/Wooden-fence-3.png-c6aaaba8c566dd3041a4a06e625e964f.md5 b/project/.import/Wooden-fence-3.png-c6aaaba8c566dd3041a4a06e625e964f.md5 new file mode 100644 index 0000000..8cc2134 --- /dev/null +++ b/project/.import/Wooden-fence-3.png-c6aaaba8c566dd3041a4a06e625e964f.md5 @@ -0,0 +1,3 @@ +source_md5="fb74b41e4d8aa7ca3b681ce23d605ed0" +dest_md5="362a69efc5f129e2d1dd4066364a0b48" + diff --git a/project/.import/Wooden-fence-3.png-c6aaaba8c566dd3041a4a06e625e964f.stex b/project/.import/Wooden-fence-3.png-c6aaaba8c566dd3041a4a06e625e964f.stex new file mode 100644 index 0000000..635ed34 Binary files /dev/null and b/project/.import/Wooden-fence-3.png-c6aaaba8c566dd3041a4a06e625e964f.stex differ diff --git a/project/.import/Wooden-fence-4.png-bd14b1734eac31240b502e5f285560a8.md5 b/project/.import/Wooden-fence-4.png-bd14b1734eac31240b502e5f285560a8.md5 new file mode 100644 index 0000000..7dd6871 --- /dev/null +++ b/project/.import/Wooden-fence-4.png-bd14b1734eac31240b502e5f285560a8.md5 @@ -0,0 +1,3 @@ +source_md5="bcba848f3771d4127e9e3b1363963810" +dest_md5="d395994396f495eb41bebd318b3122cb" + diff --git a/project/.import/Wooden-fence-4.png-bd14b1734eac31240b502e5f285560a8.stex b/project/.import/Wooden-fence-4.png-bd14b1734eac31240b502e5f285560a8.stex new file mode 100644 index 0000000..4bf0e2b Binary files /dev/null and b/project/.import/Wooden-fence-4.png-bd14b1734eac31240b502e5f285560a8.stex differ diff --git a/project/.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.md5 b/project/.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.md5 new file mode 100644 index 0000000..bcc8320 --- /dev/null +++ b/project/.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.md5 @@ -0,0 +1,3 @@ +source_md5="e839a4e388b5f4f5a9cd88fe18029e0a" +dest_md5="a011b8820cfcc428def1b546a9c1b272" + diff --git a/project/.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.stex b/project/.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.stex new file mode 100644 index 0000000..f882a02 Binary files /dev/null and b/project/.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.stex differ diff --git a/project/.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.md5 b/project/.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.md5 new file mode 100644 index 0000000..6bb7af1 --- /dev/null +++ b/project/.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.md5 @@ -0,0 +1,3 @@ +source_md5="bb4499a498d98f1155f861f3835a76b6" +dest_md5="bff45694e95d27f362a3c383775ea67c" + diff --git a/project/.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.stex b/project/.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.stex new file mode 100644 index 0000000..60705a8 Binary files /dev/null and b/project/.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.stex differ diff --git a/project/.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.md5 b/project/.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.md5 new file mode 100644 index 0000000..59c859a --- /dev/null +++ b/project/.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.md5 @@ -0,0 +1,3 @@ +source_md5="09e9e067b3bf7cc5e1acc70d49fb50b4" +dest_md5="af8316fd7405002949f7ea2142202462" + diff --git a/project/.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.stex b/project/.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.stex new file mode 100644 index 0000000..069c20f Binary files /dev/null and b/project/.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.stex differ diff --git a/project/.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.md5 b/project/.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.md5 new file mode 100644 index 0000000..0fedf51 --- /dev/null +++ b/project/.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.md5 @@ -0,0 +1,3 @@ +source_md5="7caaa99d7f2d7205728f3330a4a36980" +dest_md5="09e55c692f4993e75fc048c89f526164" + diff --git a/project/.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.stex b/project/.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.stex new file mode 100644 index 0000000..774a48b Binary files /dev/null and b/project/.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.stex differ diff --git a/project/.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.md5 b/project/.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.md5 new file mode 100644 index 0000000..54a0559 --- /dev/null +++ b/project/.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.md5 @@ -0,0 +1,3 @@ +source_md5="43b976e163d044ab0954c091b2912d42" +dest_md5="92a01a6188bb6c4d7e27efb4de231881" + diff --git a/project/.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.stex b/project/.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.stex new file mode 100644 index 0000000..492a0a4 Binary files /dev/null and b/project/.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.stex differ diff --git a/project/.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.md5 b/project/.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.md5 new file mode 100644 index 0000000..94ffb6a --- /dev/null +++ b/project/.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.md5 @@ -0,0 +1,3 @@ +source_md5="ff7f960c7a2afca1a0c09bdc63eee85d" +dest_md5="fff8c543d20725655629fcbe599f90c8" + diff --git a/project/.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.stex b/project/.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.stex new file mode 100644 index 0000000..2b610d7 Binary files /dev/null and b/project/.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.stex differ diff --git a/project/.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.md5 b/project/.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.md5 new file mode 100644 index 0000000..9bff4f1 --- /dev/null +++ b/project/.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.md5 @@ -0,0 +1,3 @@ +source_md5="a9c1495cb45594df6bcb87d2fcd8d81f" +dest_md5="832a14ac4b52c80c2dd7fc68ee1b8f42" + diff --git a/project/.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.stex b/project/.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.stex new file mode 100644 index 0000000..c73a279 Binary files /dev/null and b/project/.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.stex differ diff --git a/project/.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.md5 b/project/.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.md5 new file mode 100644 index 0000000..9dd1392 --- /dev/null +++ b/project/.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.md5 @@ -0,0 +1,3 @@ +source_md5="93bd04cf2501bd340a14a98604d78479" +dest_md5="474d8bb036fe8b54ce7f73c42ea1d05b" + diff --git a/project/.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.stex b/project/.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.stex new file mode 100644 index 0000000..1c3bd0a Binary files /dev/null and b/project/.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.stex differ diff --git a/project/.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.md5 b/project/.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.md5 new file mode 100644 index 0000000..3518581 --- /dev/null +++ b/project/.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.md5 @@ -0,0 +1,3 @@ +source_md5="2174720941a0aae10ba34fa3f2f9422e" +dest_md5="cf90ee139515a256cb5b8a8231076bf3" + diff --git a/project/.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.stex b/project/.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.stex new file mode 100644 index 0000000..7ed705a Binary files /dev/null and b/project/.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.stex differ diff --git a/project/.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.md5 b/project/.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.md5 new file mode 100644 index 0000000..96afdf9 --- /dev/null +++ b/project/.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.md5 @@ -0,0 +1,3 @@ +source_md5="6460487782d4743e260390bda5baa81b" +dest_md5="dcfd96fbbdbd1d43e64c048e05d4173e" + diff --git a/project/.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.stex b/project/.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.stex new file mode 100644 index 0000000..40f6180 Binary files /dev/null and b/project/.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.stex differ diff --git a/project/.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.md5 b/project/.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.md5 new file mode 100644 index 0000000..e70367c --- /dev/null +++ b/project/.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.md5 @@ -0,0 +1,3 @@ +source_md5="926823d4048f2590802a2c956a2a0e69" +dest_md5="874e36bc00309a8eda770991ab676f49" + diff --git a/project/.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.stex b/project/.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.stex new file mode 100644 index 0000000..9deb1a4 Binary files /dev/null and b/project/.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.stex differ diff --git a/project/.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.md5 b/project/.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.md5 new file mode 100644 index 0000000..865e41e --- /dev/null +++ b/project/.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.md5 @@ -0,0 +1,3 @@ +source_md5="d9bd7975bbbe5eb39e13985b22a524a1" +dest_md5="1001d932f7c2a521cca72c30815f76f8" + diff --git a/project/.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.stex b/project/.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.stex new file mode 100644 index 0000000..1801aa2 Binary files /dev/null and b/project/.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.stex differ diff --git a/project/.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.md5 b/project/.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.md5 new file mode 100644 index 0000000..c19e944 --- /dev/null +++ b/project/.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.md5 @@ -0,0 +1,3 @@ +source_md5="ff5b74f1a474b77f13c4d14ba2736ac3" +dest_md5="169542d489e99e8b0e701cc2799b2ac5" + diff --git a/project/.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.stex b/project/.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.stex new file mode 100644 index 0000000..b071215 Binary files /dev/null and b/project/.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.stex differ diff --git a/project/.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.md5 b/project/.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.md5 new file mode 100644 index 0000000..803e5f1 --- /dev/null +++ b/project/.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.md5 @@ -0,0 +1,3 @@ +source_md5="d091cc8d8bd985ffa46cd7053bef2958" +dest_md5="7f58cd5dc0420e1909acefecec556d2b" + diff --git a/project/.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.stex b/project/.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.stex new file mode 100644 index 0000000..24b6722 Binary files /dev/null and b/project/.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.stex differ diff --git a/project/.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.md5 b/project/.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.md5 new file mode 100644 index 0000000..fb243ee --- /dev/null +++ b/project/.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.md5 @@ -0,0 +1,3 @@ +source_md5="afca031642362a72a2c6d4fbf6545d4a" +dest_md5="bcf172e1bc5d3d228aa7e3c8f5b3179b" + diff --git a/project/.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.stex b/project/.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.stex new file mode 100644 index 0000000..17f76af Binary files /dev/null and b/project/.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.stex differ diff --git a/project/.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.md5 b/project/.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.md5 new file mode 100644 index 0000000..d5e7830 --- /dev/null +++ b/project/.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.md5 @@ -0,0 +1,3 @@ +source_md5="bc0cc6fe60b25c50c8a1c3fa5d2870ed" +dest_md5="9c86dd17cad5d368aa477ccac3b343c6" + diff --git a/project/.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.stex b/project/.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.stex new file mode 100644 index 0000000..723501b Binary files /dev/null and b/project/.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.stex differ diff --git a/project/.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.md5 b/project/.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.md5 new file mode 100644 index 0000000..6747d43 --- /dev/null +++ b/project/.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.md5 @@ -0,0 +1,3 @@ +source_md5="e157d636f0fc71ad2b6e25c22c645cf6" +dest_md5="746cc618e0339ea52178e8beac9c2aa0" + diff --git a/project/.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.stex b/project/.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.stex new file mode 100644 index 0000000..51ab7cd Binary files /dev/null and b/project/.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.stex differ diff --git a/project/.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.md5 b/project/.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.md5 new file mode 100644 index 0000000..215089e --- /dev/null +++ b/project/.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.md5 @@ -0,0 +1,3 @@ +source_md5="bc7061efa05e67d8ad40b1248a513c4b" +dest_md5="dd78c02dd080b5910eb211dfe58d659e" + diff --git a/project/.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.stex b/project/.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.stex new file mode 100644 index 0000000..19df270 Binary files /dev/null and b/project/.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.stex differ diff --git a/project/.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.md5 b/project/.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.md5 new file mode 100644 index 0000000..6819739 --- /dev/null +++ b/project/.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.md5 @@ -0,0 +1,3 @@ +source_md5="6945bd2099ce87b32082fcf7a738337d" +dest_md5="cc63b8e8fff53728f33628c81f5563e9" + diff --git a/project/.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.stex b/project/.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.stex new file mode 100644 index 0000000..9016e34 Binary files /dev/null and b/project/.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.stex differ diff --git a/project/.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.md5 b/project/.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.md5 new file mode 100644 index 0000000..d3ddac6 --- /dev/null +++ b/project/.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.md5 @@ -0,0 +1,3 @@ +source_md5="e6b63a3561d9cb72d926761395a1bb77" +dest_md5="1483d2f23d3711a762b917141c7ef4e9" + diff --git a/project/.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.stex b/project/.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.stex new file mode 100644 index 0000000..04a26da Binary files /dev/null and b/project/.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.stex differ diff --git a/project/.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.md5 b/project/.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.md5 new file mode 100644 index 0000000..a4f021e --- /dev/null +++ b/project/.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.md5 @@ -0,0 +1,3 @@ +source_md5="7f239015068868389da6d90581334d8e" +dest_md5="08be58cf1568ef772b5323eacae3bbae" + diff --git a/project/.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.stex b/project/.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.stex new file mode 100644 index 0000000..e328180 Binary files /dev/null and b/project/.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.stex differ diff --git a/project/.import/background.svg-deb28cb6c58a63f1c94833aff9cf693d.md5 b/project/.import/background.svg-deb28cb6c58a63f1c94833aff9cf693d.md5 new file mode 100644 index 0000000..3c5c216 --- /dev/null +++ b/project/.import/background.svg-deb28cb6c58a63f1c94833aff9cf693d.md5 @@ -0,0 +1,3 @@ +source_md5="cc12582767c3d9ae107cae41f6739332" +dest_md5="4d588a8295f1f8f55fe44f5224030cf5" + diff --git a/project/.import/background.svg-deb28cb6c58a63f1c94833aff9cf693d.stex b/project/.import/background.svg-deb28cb6c58a63f1c94833aff9cf693d.stex new file mode 100644 index 0000000..14cf2f7 Binary files /dev/null and b/project/.import/background.svg-deb28cb6c58a63f1c94833aff9cf693d.stex differ diff --git a/project/.import/bodyfall.wav-644341e91392defdd8d4f9cba2c70879.md5 b/project/.import/bodyfall.wav-644341e91392defdd8d4f9cba2c70879.md5 new file mode 100644 index 0000000..61c7888 --- /dev/null +++ b/project/.import/bodyfall.wav-644341e91392defdd8d4f9cba2c70879.md5 @@ -0,0 +1,3 @@ +source_md5="6741bb4048757d54a0749b6027c93200" +dest_md5="1edc025402b939eb66d17f2e75355f57" + diff --git a/project/.import/bodyfall.wav-644341e91392defdd8d4f9cba2c70879.sample b/project/.import/bodyfall.wav-644341e91392defdd8d4f9cba2c70879.sample new file mode 100644 index 0000000..1a62f60 Binary files /dev/null and b/project/.import/bodyfall.wav-644341e91392defdd8d4f9cba2c70879.sample differ diff --git a/project/.import/border.png-0be7b0e67e5060aa14b097bb4fddc453.md5 b/project/.import/border.png-0be7b0e67e5060aa14b097bb4fddc453.md5 new file mode 100644 index 0000000..3d2cf91 --- /dev/null +++ b/project/.import/border.png-0be7b0e67e5060aa14b097bb4fddc453.md5 @@ -0,0 +1,3 @@ +source_md5="d814d21f2d8214bde3eee2b8019fc9b3" +dest_md5="53857b1c418cba37f7582db47bf03019" + diff --git a/project/.import/border.png-0be7b0e67e5060aa14b097bb4fddc453.stex b/project/.import/border.png-0be7b0e67e5060aa14b097bb4fddc453.stex new file mode 100644 index 0000000..c486f07 Binary files /dev/null and b/project/.import/border.png-0be7b0e67e5060aa14b097bb4fddc453.stex differ diff --git a/project/.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.md5 b/project/.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.md5 new file mode 100644 index 0000000..970b6de --- /dev/null +++ b/project/.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.md5 @@ -0,0 +1,3 @@ +source_md5="820bb9f58aea78b1e5f97e795a2e48e4" +dest_md5="6747b0bf4eb965ac549cc9708e6e9aee" + diff --git a/project/.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.stex b/project/.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.stex new file mode 100644 index 0000000..1ef4731 Binary files /dev/null and b/project/.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.stex differ diff --git a/project/.import/car.png-74202fdd6f7bf80b43987bdd3830bb34.md5 b/project/.import/car.png-74202fdd6f7bf80b43987bdd3830bb34.md5 new file mode 100644 index 0000000..2434684 --- /dev/null +++ b/project/.import/car.png-74202fdd6f7bf80b43987bdd3830bb34.md5 @@ -0,0 +1,3 @@ +source_md5="67b51f7179764be48da028c5e7c92374" +dest_md5="8f3c70ba5f3981e5733ea6d4981c23a9" + diff --git a/project/.import/car.png-74202fdd6f7bf80b43987bdd3830bb34.stex b/project/.import/car.png-74202fdd6f7bf80b43987bdd3830bb34.stex new file mode 100644 index 0000000..f0e8ad4 Binary files /dev/null and b/project/.import/car.png-74202fdd6f7bf80b43987bdd3830bb34.stex differ diff --git a/project/.import/car.png-b2ca7bee34d0a72d15f9ed0bc2f7996f.md5 b/project/.import/car.png-b2ca7bee34d0a72d15f9ed0bc2f7996f.md5 new file mode 100644 index 0000000..4fdf583 --- /dev/null +++ b/project/.import/car.png-b2ca7bee34d0a72d15f9ed0bc2f7996f.md5 @@ -0,0 +1,3 @@ +source_md5="ef9fab582cd3ad22190f40cd59f9108a" +dest_md5="2d64048988b577e421e6099b1dc1dd7e" + diff --git a/project/.import/car.png-b2ca7bee34d0a72d15f9ed0bc2f7996f.stex b/project/.import/car.png-b2ca7bee34d0a72d15f9ed0bc2f7996f.stex new file mode 100644 index 0000000..fb40734 Binary files /dev/null and b/project/.import/car.png-b2ca7bee34d0a72d15f9ed0bc2f7996f.stex differ diff --git a/project/.import/change-background.svg-b779e98a98d293a18e8d288547972610.md5 b/project/.import/change-background.svg-b779e98a98d293a18e8d288547972610.md5 new file mode 100644 index 0000000..986733b --- /dev/null +++ b/project/.import/change-background.svg-b779e98a98d293a18e8d288547972610.md5 @@ -0,0 +1,3 @@ +source_md5="2927c4ecb374e329804ba99da575cbd1" +dest_md5="996364845886b6ef74fc78cb0d80c434" + diff --git a/project/.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex b/project/.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex new file mode 100644 index 0000000..7601928 Binary files /dev/null and b/project/.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex differ diff --git a/project/.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.md5 b/project/.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.md5 new file mode 100644 index 0000000..3be6302 --- /dev/null +++ b/project/.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.md5 @@ -0,0 +1,3 @@ +source_md5="2fde142ced0e37805aff1735e0d7e5db" +dest_md5="0f288044667591d7e6bb82ef6201a472" + diff --git a/project/.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.stex b/project/.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.stex new file mode 100644 index 0000000..af1877f Binary files /dev/null and b/project/.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.stex differ diff --git a/project/.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.md5 b/project/.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.md5 new file mode 100644 index 0000000..984f575 --- /dev/null +++ b/project/.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.md5 @@ -0,0 +1,3 @@ +source_md5="6926e3d1f80a5ea3b7c96f94f89656e4" +dest_md5="01d8c46398ab0d589d8ba2d8592bae4b" + diff --git a/project/.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.stex b/project/.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.stex new file mode 100644 index 0000000..9fe47f3 Binary files /dev/null and b/project/.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.stex differ diff --git a/project/.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.md5 b/project/.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.md5 new file mode 100644 index 0000000..37a257c --- /dev/null +++ b/project/.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.md5 @@ -0,0 +1,3 @@ +source_md5="416277bed8fece73ed4101416cf8b232" +dest_md5="7c686323ecbb99fced1b82d942fa0acb" + diff --git a/project/.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.stex b/project/.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.stex new file mode 100644 index 0000000..bf63a7f Binary files /dev/null and b/project/.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.stex differ diff --git a/project/.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.md5 b/project/.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.md5 new file mode 100644 index 0000000..e2bb2b5 --- /dev/null +++ b/project/.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.md5 @@ -0,0 +1,3 @@ +source_md5="0f83bfcc459ba8919d2f57f18659692b" +dest_md5="ec4d6abcd95b8c6d3a361e9fa9edbe6d" + diff --git a/project/.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.stex b/project/.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.stex new file mode 100644 index 0000000..9bd090c Binary files /dev/null and b/project/.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.stex differ diff --git a/project/.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.md5 b/project/.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.md5 new file mode 100644 index 0000000..44d786f --- /dev/null +++ b/project/.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.md5 @@ -0,0 +1,3 @@ +source_md5="59fb3cd3678ba86f5b0d7434997626ea" +dest_md5="fe97dcd665be9a48ee22aa4f976317e6" + diff --git a/project/.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.stex b/project/.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.stex new file mode 100644 index 0000000..41d3484 Binary files /dev/null and b/project/.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.stex differ diff --git a/project/.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.md5 b/project/.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.md5 new file mode 100644 index 0000000..61c4d46 --- /dev/null +++ b/project/.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.md5 @@ -0,0 +1,3 @@ +source_md5="a44ceea52275e998db8fc7b0a83f5f6a" +dest_md5="136fa2f2165a9827dde8d806a45c7936" + diff --git a/project/.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.stex b/project/.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.stex new file mode 100644 index 0000000..9eef820 Binary files /dev/null and b/project/.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.stex differ diff --git a/project/.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.md5 b/project/.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.md5 new file mode 100644 index 0000000..b22cfb5 --- /dev/null +++ b/project/.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.md5 @@ -0,0 +1,3 @@ +source_md5="859760eae3676f7fe3cdf54e2e1ce617" +dest_md5="d1092978ba8251ad4102cf31b99129fb" + diff --git a/project/.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.stex b/project/.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.stex new file mode 100644 index 0000000..b050b74 Binary files /dev/null and b/project/.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.stex differ diff --git a/project/.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.md5 b/project/.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.md5 new file mode 100644 index 0000000..37a257c --- /dev/null +++ b/project/.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.md5 @@ -0,0 +1,3 @@ +source_md5="416277bed8fece73ed4101416cf8b232" +dest_md5="7c686323ecbb99fced1b82d942fa0acb" + diff --git a/project/.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.stex b/project/.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.stex new file mode 100644 index 0000000..bf63a7f Binary files /dev/null and b/project/.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.stex differ diff --git a/project/.import/character.svg-dce8982b5c5669e98479bbff64aab08f.md5 b/project/.import/character.svg-dce8982b5c5669e98479bbff64aab08f.md5 new file mode 100644 index 0000000..181b6ba --- /dev/null +++ b/project/.import/character.svg-dce8982b5c5669e98479bbff64aab08f.md5 @@ -0,0 +1,3 @@ +source_md5="c3daef67731ff1cf29d3eb7a17b4162c" +dest_md5="600459f00335d6f3e0b572762b4b7834" + diff --git a/project/.import/character.svg-dce8982b5c5669e98479bbff64aab08f.stex b/project/.import/character.svg-dce8982b5c5669e98479bbff64aab08f.stex new file mode 100644 index 0000000..6407154 Binary files /dev/null and b/project/.import/character.svg-dce8982b5c5669e98479bbff64aab08f.stex differ diff --git a/project/.import/choice.svg-13eab5623c86309807d0cbedab2ce888.md5 b/project/.import/choice.svg-13eab5623c86309807d0cbedab2ce888.md5 new file mode 100644 index 0000000..171ae25 --- /dev/null +++ b/project/.import/choice.svg-13eab5623c86309807d0cbedab2ce888.md5 @@ -0,0 +1,3 @@ +source_md5="a1d7c036619a4452335eae250904c678" +dest_md5="68bcdb7f9e4d79dbc76336f8e43d2ce9" + diff --git a/project/.import/choice.svg-13eab5623c86309807d0cbedab2ce888.stex b/project/.import/choice.svg-13eab5623c86309807d0cbedab2ce888.stex new file mode 100644 index 0000000..1aec1ce Binary files /dev/null and b/project/.import/choice.svg-13eab5623c86309807d0cbedab2ce888.stex differ diff --git a/project/.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.md5 b/project/.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.md5 new file mode 100644 index 0000000..8da0017 --- /dev/null +++ b/project/.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.md5 @@ -0,0 +1,3 @@ +source_md5="7bc5d0de04e7f5c4fb8bf3484c8eeb33" +dest_md5="8471cfb64ebd79669fc4d84c4db0733e" + diff --git a/project/.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.stex b/project/.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.stex new file mode 100644 index 0000000..e55fb13 Binary files /dev/null and b/project/.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.stex differ diff --git a/project/.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.md5 b/project/.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.md5 new file mode 100644 index 0000000..c057171 --- /dev/null +++ b/project/.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.md5 @@ -0,0 +1,3 @@ +source_md5="6b6e8ee1d4985f0902a281cfdf049fe5" +dest_md5="08861ad4652eb96df5930e70243bbff8" + diff --git a/project/.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.stex b/project/.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.stex new file mode 100644 index 0000000..b4af27f Binary files /dev/null and b/project/.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.stex differ diff --git a/project/.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.md5 b/project/.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.md5 new file mode 100644 index 0000000..bbc2326 --- /dev/null +++ b/project/.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.md5 @@ -0,0 +1,3 @@ +source_md5="c9c3e7f937f16d6bed099a5eae65e2e1" +dest_md5="81cc6a9993a2d8c0204e1e77316e55cb" + diff --git a/project/.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.stex b/project/.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.stex new file mode 100644 index 0000000..1df0846 Binary files /dev/null and b/project/.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.stex differ diff --git a/project/.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.md5 b/project/.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.md5 new file mode 100644 index 0000000..ed97c11 --- /dev/null +++ b/project/.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.md5 @@ -0,0 +1,3 @@ +source_md5="a5499bf24db18bb99dc1109dec4c5253" +dest_md5="f8295c08627bb22cbec35ea56788cbe1" + diff --git a/project/.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.stex b/project/.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.stex new file mode 100644 index 0000000..dff19ba Binary files /dev/null and b/project/.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.stex differ diff --git a/project/.import/darkness.png-c49b0cfd2db7170b68bcc6ba116015c9.md5 b/project/.import/darkness.png-c49b0cfd2db7170b68bcc6ba116015c9.md5 new file mode 100644 index 0000000..4fad29f --- /dev/null +++ b/project/.import/darkness.png-c49b0cfd2db7170b68bcc6ba116015c9.md5 @@ -0,0 +1,3 @@ +source_md5="e7f9042799382712bbee666f47f0bdf2" +dest_md5="74f34b0d7d02ac440618a2b1a68efb71" + diff --git a/project/.import/darkness.png-c49b0cfd2db7170b68bcc6ba116015c9.stex b/project/.import/darkness.png-c49b0cfd2db7170b68bcc6ba116015c9.stex new file mode 100644 index 0000000..1dbfc10 Binary files /dev/null and b/project/.import/darkness.png-c49b0cfd2db7170b68bcc6ba116015c9.stex differ diff --git a/project/.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.md5 b/project/.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.md5 new file mode 100644 index 0000000..c299be1 --- /dev/null +++ b/project/.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.md5 @@ -0,0 +1,3 @@ +source_md5="3700cfa3376427000e8ac59c724f757e" +dest_md5="95c627d8222903a1b2b5282f99744fd8" + diff --git a/project/.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.stex b/project/.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.stex new file mode 100644 index 0000000..0dc0732 Binary files /dev/null and b/project/.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.stex differ diff --git a/project/.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.md5 b/project/.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.md5 new file mode 100644 index 0000000..b4e540c --- /dev/null +++ b/project/.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.md5 @@ -0,0 +1,3 @@ +source_md5="af798e82a811c8b5e02fc1f32923513f" +dest_md5="0748db3088ea3930f38df77838f790ac" + diff --git a/project/.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.stex b/project/.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.stex new file mode 100644 index 0000000..459639e Binary files /dev/null and b/project/.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.stex differ diff --git a/project/.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.md5 b/project/.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.md5 new file mode 100644 index 0000000..5d1ec2a --- /dev/null +++ b/project/.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.md5 @@ -0,0 +1,3 @@ +source_md5="22c458700fc37f14f3136224856bc95f" +dest_md5="da9fbe3fe11f90269415ea468dd30854" + diff --git a/project/.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.stex b/project/.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.stex new file mode 100644 index 0000000..5f890e8 Binary files /dev/null and b/project/.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.stex differ diff --git a/project/.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.md5 b/project/.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.md5 new file mode 100644 index 0000000..e1aa9b0 --- /dev/null +++ b/project/.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.md5 @@ -0,0 +1,3 @@ +source_md5="1f12596e1045d8fa77a6e06b27d69d37" +dest_md5="6e28fecd903d2b6df03778b10c22d5b0" + diff --git a/project/.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.stex b/project/.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.stex new file mode 100644 index 0000000..195a26f Binary files /dev/null and b/project/.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.stex differ diff --git a/project/.import/df-2.png-6e4167303060ad7b046acda78c51329c.md5 b/project/.import/df-2.png-6e4167303060ad7b046acda78c51329c.md5 new file mode 100644 index 0000000..1ea9b8d --- /dev/null +++ b/project/.import/df-2.png-6e4167303060ad7b046acda78c51329c.md5 @@ -0,0 +1,3 @@ +source_md5="36b79f1cecdd48ff47f7122a1368cea0" +dest_md5="f0b07873a2a6194503b8995691a8136c" + diff --git a/project/.import/df-2.png-6e4167303060ad7b046acda78c51329c.stex b/project/.import/df-2.png-6e4167303060ad7b046acda78c51329c.stex new file mode 100644 index 0000000..1b1bfcc Binary files /dev/null and b/project/.import/df-2.png-6e4167303060ad7b046acda78c51329c.stex differ diff --git a/project/.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.md5 b/project/.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.md5 new file mode 100644 index 0000000..d2f91be --- /dev/null +++ b/project/.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.md5 @@ -0,0 +1,3 @@ +source_md5="970933745c10206f5591d36415c2963d" +dest_md5="90ecb0311f9751442a45fbf371a58072" + diff --git a/project/.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.stex b/project/.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.stex new file mode 100644 index 0000000..3e61219 Binary files /dev/null and b/project/.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.stex differ diff --git a/project/.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.md5 b/project/.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.md5 new file mode 100644 index 0000000..1f3f481 --- /dev/null +++ b/project/.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.md5 @@ -0,0 +1,3 @@ +source_md5="b0518ed4cc2300b87847e6c4b188b31e" +dest_md5="dc4ad619d36832d27e43bf151bcd5ae1" + diff --git a/project/.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.stex b/project/.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.stex new file mode 100644 index 0000000..c5836e5 Binary files /dev/null and b/project/.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.stex differ diff --git a/project/.import/dialogic.csv-16baf6209d98cb8a09f0e1636bad0317.md5 b/project/.import/dialogic.csv-16baf6209d98cb8a09f0e1636bad0317.md5 new file mode 100644 index 0000000..935244e --- /dev/null +++ b/project/.import/dialogic.csv-16baf6209d98cb8a09f0e1636bad0317.md5 @@ -0,0 +1,3 @@ +source_md5="84eb286694f6a92413651151e9358228" +dest_md5="c297038a2646ea281ecc9dfa3e9a2e06" + diff --git a/project/.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.md5 b/project/.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.md5 new file mode 100644 index 0000000..89d9065 --- /dev/null +++ b/project/.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.md5 @@ -0,0 +1,3 @@ +source_md5="641130cc62cf72a9a046f7bba6c57cb3" +dest_md5="01f41f8b77506c3c92b6f49a01a71464" + diff --git a/project/.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.stex b/project/.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.stex new file mode 100644 index 0000000..a671291 Binary files /dev/null and b/project/.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.stex differ diff --git a/project/.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.md5 b/project/.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.md5 new file mode 100644 index 0000000..b2b004a --- /dev/null +++ b/project/.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.md5 @@ -0,0 +1,3 @@ +source_md5="18fff865a97f79ee0a36a1a8b1fe1a31" +dest_md5="d76ca7997af9029fbdc77ce46b55496e" + diff --git a/project/.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.stex b/project/.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.stex new file mode 100644 index 0000000..168ea1f Binary files /dev/null and b/project/.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.stex differ diff --git a/project/.import/end_good.png-5b41c16112432429bd4f2da8ce333ddf.md5 b/project/.import/end_good.png-5b41c16112432429bd4f2da8ce333ddf.md5 new file mode 100644 index 0000000..51c101a --- /dev/null +++ b/project/.import/end_good.png-5b41c16112432429bd4f2da8ce333ddf.md5 @@ -0,0 +1,3 @@ +source_md5="540bf83f9834b94b1097bc01bbf022b7" +dest_md5="a7758837b391293cfb6c69058b173211" + diff --git a/project/.import/end_good.png-5b41c16112432429bd4f2da8ce333ddf.stex b/project/.import/end_good.png-5b41c16112432429bd4f2da8ce333ddf.stex new file mode 100644 index 0000000..bc7c674 Binary files /dev/null and b/project/.import/end_good.png-5b41c16112432429bd4f2da8ce333ddf.stex differ diff --git a/project/.import/end_progress_0.png-a2b7b1918e0b70ee9965c9b4d0d04449.md5 b/project/.import/end_progress_0.png-a2b7b1918e0b70ee9965c9b4d0d04449.md5 new file mode 100644 index 0000000..ad95958 --- /dev/null +++ b/project/.import/end_progress_0.png-a2b7b1918e0b70ee9965c9b4d0d04449.md5 @@ -0,0 +1,3 @@ +source_md5="cdf95958316d02aae462b672b2a8d858" +dest_md5="efcf52fc4142032a3e75f2fdf7eaba60" + diff --git a/project/.import/end_progress_0.png-a2b7b1918e0b70ee9965c9b4d0d04449.stex b/project/.import/end_progress_0.png-a2b7b1918e0b70ee9965c9b4d0d04449.stex new file mode 100644 index 0000000..53da132 Binary files /dev/null and b/project/.import/end_progress_0.png-a2b7b1918e0b70ee9965c9b4d0d04449.stex differ diff --git a/project/.import/end_progress_1.png-b8f0bcf15b09694530da783e2b07dc05.md5 b/project/.import/end_progress_1.png-b8f0bcf15b09694530da783e2b07dc05.md5 new file mode 100644 index 0000000..68f4a56 --- /dev/null +++ b/project/.import/end_progress_1.png-b8f0bcf15b09694530da783e2b07dc05.md5 @@ -0,0 +1,3 @@ +source_md5="500e00dbd9f4b59ce8b8dd170c320b01" +dest_md5="88479ef119068771fa84eb1347c2484b" + diff --git a/project/.import/end_progress_1.png-b8f0bcf15b09694530da783e2b07dc05.stex b/project/.import/end_progress_1.png-b8f0bcf15b09694530da783e2b07dc05.stex new file mode 100644 index 0000000..5151c2e Binary files /dev/null and b/project/.import/end_progress_1.png-b8f0bcf15b09694530da783e2b07dc05.stex differ diff --git a/project/.import/end_progress_2.png-063dc76adfb67575472d03f54f61c88c.md5 b/project/.import/end_progress_2.png-063dc76adfb67575472d03f54f61c88c.md5 new file mode 100644 index 0000000..8967f72 --- /dev/null +++ b/project/.import/end_progress_2.png-063dc76adfb67575472d03f54f61c88c.md5 @@ -0,0 +1,3 @@ +source_md5="44fdbc1ddd20a9c827256f0ed66a097d" +dest_md5="1f05851d05b3e6237af41346da33dfb3" + diff --git a/project/.import/end_progress_2.png-063dc76adfb67575472d03f54f61c88c.stex b/project/.import/end_progress_2.png-063dc76adfb67575472d03f54f61c88c.stex new file mode 100644 index 0000000..24fabf2 Binary files /dev/null and b/project/.import/end_progress_2.png-063dc76adfb67575472d03f54f61c88c.stex differ diff --git a/project/.import/end_progress_3.png-e4e5f50c10e219f6a8528b768ef68ebb.md5 b/project/.import/end_progress_3.png-e4e5f50c10e219f6a8528b768ef68ebb.md5 new file mode 100644 index 0000000..559fa91 --- /dev/null +++ b/project/.import/end_progress_3.png-e4e5f50c10e219f6a8528b768ef68ebb.md5 @@ -0,0 +1,3 @@ +source_md5="8127cc1459d03e0c78a567a03699e626" +dest_md5="f77ea370b51f11573dff8b859eb396d6" + diff --git a/project/.import/end_progress_3.png-e4e5f50c10e219f6a8528b768ef68ebb.stex b/project/.import/end_progress_3.png-e4e5f50c10e219f6a8528b768ef68ebb.stex new file mode 100644 index 0000000..35f7b02 Binary files /dev/null and b/project/.import/end_progress_3.png-e4e5f50c10e219f6a8528b768ef68ebb.stex differ diff --git a/project/.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.md5 b/project/.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.md5 new file mode 100644 index 0000000..ecb4940 --- /dev/null +++ b/project/.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.md5 @@ -0,0 +1,3 @@ +source_md5="6ad5abf7b6ced4f600a6178f5bed0187" +dest_md5="edbf598274c45a96dbd5d210067e6f18" + diff --git a/project/.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.stex b/project/.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.stex new file mode 100644 index 0000000..c7c469d Binary files /dev/null and b/project/.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.stex differ diff --git a/project/.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.md5 b/project/.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.md5 new file mode 100644 index 0000000..bc8d80d --- /dev/null +++ b/project/.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.md5 @@ -0,0 +1,3 @@ +source_md5="adcd07c2ff3d297b83fd1a58b313ed90" +dest_md5="34584953f0260ea5a47c4ceb3ed543a9" + diff --git a/project/.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.stex b/project/.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.stex new file mode 100644 index 0000000..824aa67 Binary files /dev/null and b/project/.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.stex differ diff --git a/project/.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.md5 b/project/.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.md5 new file mode 100644 index 0000000..7290294 --- /dev/null +++ b/project/.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.md5 @@ -0,0 +1,3 @@ +source_md5="4d9e324f29aada425daae8fb9cadbd5d" +dest_md5="a1010a43d95ce6c70b443c007d64dd39" + diff --git a/project/.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.stex b/project/.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.stex new file mode 100644 index 0000000..ba9d19a Binary files /dev/null and b/project/.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.stex differ diff --git a/project/.import/fairy1.png-9f8b0fe4802187027e332afea270ab73.md5 b/project/.import/fairy1.png-9f8b0fe4802187027e332afea270ab73.md5 new file mode 100644 index 0000000..0d5f0da --- /dev/null +++ b/project/.import/fairy1.png-9f8b0fe4802187027e332afea270ab73.md5 @@ -0,0 +1,3 @@ +source_md5="ad9625e77dd940ede46481539b12a56f" +dest_md5="905ac335c51d4091ad580e1e44b7a436" + diff --git a/project/.import/fairy1.png-9f8b0fe4802187027e332afea270ab73.stex b/project/.import/fairy1.png-9f8b0fe4802187027e332afea270ab73.stex new file mode 100644 index 0000000..0ce2064 Binary files /dev/null and b/project/.import/fairy1.png-9f8b0fe4802187027e332afea270ab73.stex differ diff --git a/project/.import/fairy2.png-1b07985dd6c0bae580a4affda5031345.md5 b/project/.import/fairy2.png-1b07985dd6c0bae580a4affda5031345.md5 new file mode 100644 index 0000000..f8e5e5a --- /dev/null +++ b/project/.import/fairy2.png-1b07985dd6c0bae580a4affda5031345.md5 @@ -0,0 +1,3 @@ +source_md5="c8073e6e7d0b159778ef191cc7569f7a" +dest_md5="7e250b47c09f2f2ec6789155a02d6884" + diff --git a/project/.import/fairy2.png-1b07985dd6c0bae580a4affda5031345.stex b/project/.import/fairy2.png-1b07985dd6c0bae580a4affda5031345.stex new file mode 100644 index 0000000..6e7d28d Binary files /dev/null and b/project/.import/fairy2.png-1b07985dd6c0bae580a4affda5031345.stex differ diff --git a/project/.import/fairyshot.png-bd8ece4a5f0980b7dff59ba88d7cd0e3.md5 b/project/.import/fairyshot.png-bd8ece4a5f0980b7dff59ba88d7cd0e3.md5 new file mode 100644 index 0000000..1a8a120 --- /dev/null +++ b/project/.import/fairyshot.png-bd8ece4a5f0980b7dff59ba88d7cd0e3.md5 @@ -0,0 +1,3 @@ +source_md5="24ea8afdd1972e042ef33a6e2402d717" +dest_md5="835dd46503fa8e02cc33f3198bd02fdc" + diff --git a/project/.import/fairyshot.png-bd8ece4a5f0980b7dff59ba88d7cd0e3.stex b/project/.import/fairyshot.png-bd8ece4a5f0980b7dff59ba88d7cd0e3.stex new file mode 100644 index 0000000..ed3da18 Binary files /dev/null and b/project/.import/fairyshot.png-bd8ece4a5f0980b7dff59ba88d7cd0e3.stex differ diff --git a/project/.import/fairyshot.wav-ea1d8b5be8f95e61390139f252a33b58.md5 b/project/.import/fairyshot.wav-ea1d8b5be8f95e61390139f252a33b58.md5 new file mode 100644 index 0000000..e76d78c --- /dev/null +++ b/project/.import/fairyshot.wav-ea1d8b5be8f95e61390139f252a33b58.md5 @@ -0,0 +1,3 @@ +source_md5="8850f76500fa694d7f184fc4b9e8ef4f" +dest_md5="8754c70d5604862644755c6b12272fb6" + diff --git a/project/.import/fairyshot.wav-ea1d8b5be8f95e61390139f252a33b58.sample b/project/.import/fairyshot.wav-ea1d8b5be8f95e61390139f252a33b58.sample new file mode 100644 index 0000000..818256b Binary files /dev/null and b/project/.import/fairyshot.wav-ea1d8b5be8f95e61390139f252a33b58.sample differ diff --git a/project/.import/flashback.ogg-1546d5e47f1223c1ae2f41c2bc739d05.md5 b/project/.import/flashback.ogg-1546d5e47f1223c1ae2f41c2bc739d05.md5 new file mode 100644 index 0000000..5a06d80 --- /dev/null +++ b/project/.import/flashback.ogg-1546d5e47f1223c1ae2f41c2bc739d05.md5 @@ -0,0 +1,3 @@ +source_md5="afbb0c9c655595b4217937da62d51d34" +dest_md5="1c1ce39a4c86f308a6003df740eed378" + diff --git a/project/.import/flashback.ogg-1546d5e47f1223c1ae2f41c2bc739d05.oggstr b/project/.import/flashback.ogg-1546d5e47f1223c1ae2f41c2bc739d05.oggstr new file mode 100644 index 0000000..94b5740 Binary files /dev/null and b/project/.import/flashback.ogg-1546d5e47f1223c1ae2f41c2bc739d05.oggstr differ diff --git a/project/.import/flashback_thelast.ogg-ac44226163d8907a32f1adca5fad057c.md5 b/project/.import/flashback_thelast.ogg-ac44226163d8907a32f1adca5fad057c.md5 new file mode 100644 index 0000000..5a633b8 --- /dev/null +++ b/project/.import/flashback_thelast.ogg-ac44226163d8907a32f1adca5fad057c.md5 @@ -0,0 +1,3 @@ +source_md5="451233c668fe045f0a805f20966d839d" +dest_md5="2bb81ba97748b5ac3fb858f4e1b11f7a" + diff --git a/project/.import/flashback_thelast.ogg-ac44226163d8907a32f1adca5fad057c.oggstr b/project/.import/flashback_thelast.ogg-ac44226163d8907a32f1adca5fad057c.oggstr new file mode 100644 index 0000000..eacefaf Binary files /dev/null and b/project/.import/flashback_thelast.ogg-ac44226163d8907a32f1adca5fad057c.oggstr differ diff --git a/project/.import/get_hit.wav-1d93dd77fec9d3d96b17a975ddb95a33.md5 b/project/.import/get_hit.wav-1d93dd77fec9d3d96b17a975ddb95a33.md5 new file mode 100644 index 0000000..f6fa04e --- /dev/null +++ b/project/.import/get_hit.wav-1d93dd77fec9d3d96b17a975ddb95a33.md5 @@ -0,0 +1,3 @@ +source_md5="35621e1696870a76824d282d68671b1d" +dest_md5="11e52e1e9d6420b7334f627d9ba66a0a" + diff --git a/project/.import/get_hit.wav-1d93dd77fec9d3d96b17a975ddb95a33.sample b/project/.import/get_hit.wav-1d93dd77fec9d3d96b17a975ddb95a33.sample new file mode 100644 index 0000000..ae9e33c Binary files /dev/null and b/project/.import/get_hit.wav-1d93dd77fec9d3d96b17a975ddb95a33.sample differ diff --git a/project/.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.md5 b/project/.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.md5 new file mode 100644 index 0000000..69bbba7 --- /dev/null +++ b/project/.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.md5 @@ -0,0 +1,3 @@ +source_md5="29b9e99b13b824058e032d8631a9df1a" +dest_md5="3f82b9a31358ec20aef280d61bfedcdc" + diff --git a/project/.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.stex b/project/.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.stex new file mode 100644 index 0000000..6af3276 Binary files /dev/null and b/project/.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.stex differ diff --git a/project/.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.md5 b/project/.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.md5 new file mode 100644 index 0000000..d8ec40d --- /dev/null +++ b/project/.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.md5 @@ -0,0 +1,3 @@ +source_md5="37f5c893f3ee609a7e99208ee85458ee" +dest_md5="bfdc8520d381b1672179b5d8d5840a1f" + diff --git a/project/.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.stex b/project/.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.stex new file mode 100644 index 0000000..5c5b368 Binary files /dev/null and b/project/.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.stex differ diff --git a/project/.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.md5 b/project/.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.md5 new file mode 100644 index 0000000..e9cd1d8 --- /dev/null +++ b/project/.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.md5 @@ -0,0 +1,3 @@ +source_md5="1d4e698f970d2426ec23bdafc935b4dd" +dest_md5="c17f902915f9e4bc78399590787f7303" + diff --git a/project/.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.stex b/project/.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.stex new file mode 100644 index 0000000..6e11037 Binary files /dev/null and b/project/.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.stex differ diff --git a/project/.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.md5 b/project/.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.md5 new file mode 100644 index 0000000..4ec90c1 --- /dev/null +++ b/project/.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.md5 @@ -0,0 +1,3 @@ +source_md5="10a4101b754eab89d6776f5e887c6b14" +dest_md5="829812566e36d9952046a0eef4d6d412" + diff --git a/project/.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.stex b/project/.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.stex new file mode 100644 index 0000000..774388e Binary files /dev/null and b/project/.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.stex differ diff --git a/project/.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.md5 b/project/.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.md5 new file mode 100644 index 0000000..c03ad42 --- /dev/null +++ b/project/.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.md5 @@ -0,0 +1,3 @@ +source_md5="4d91379ef756cb415ba3540edb20c4b3" +dest_md5="6f88a6dea9c8740772eac2c268b5bb53" + diff --git a/project/.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.stex b/project/.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.stex new file mode 100644 index 0000000..e8b05dc Binary files /dev/null and b/project/.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.stex differ diff --git a/project/.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.md5 b/project/.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.md5 new file mode 100644 index 0000000..e2ba035 --- /dev/null +++ b/project/.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.md5 @@ -0,0 +1,3 @@ +source_md5="91c49f2218365c3cde74195627f3c030" +dest_md5="c1244675ab9397620c678544c7405f82" + diff --git a/project/.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.stex b/project/.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.stex new file mode 100644 index 0000000..c70ab9c Binary files /dev/null and b/project/.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.stex differ diff --git a/project/.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.md5 b/project/.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.md5 new file mode 100644 index 0000000..903aa77 --- /dev/null +++ b/project/.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.md5 @@ -0,0 +1,3 @@ +source_md5="7f26efe8a2fd7724ba026b00b059fb7c" +dest_md5="829fb5a5cfdcc67b3fafe1e243e1cb02" + diff --git a/project/.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.stex b/project/.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.stex new file mode 100644 index 0000000..3bb4e70 Binary files /dev/null and b/project/.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.stex differ diff --git a/project/.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.md5 b/project/.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.md5 new file mode 100644 index 0000000..637c94d --- /dev/null +++ b/project/.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.md5 @@ -0,0 +1,3 @@ +source_md5="be3cf2ca2a202bbfa3a1f7d3a72226da" +dest_md5="e8f04a709d077f1037f554ae5cde7a10" + diff --git a/project/.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.stex b/project/.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.stex new file mode 100644 index 0000000..0ef277e Binary files /dev/null and b/project/.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.stex differ diff --git a/project/.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.md5 b/project/.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.md5 new file mode 100644 index 0000000..0c7f4e8 --- /dev/null +++ b/project/.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.md5 @@ -0,0 +1,3 @@ +source_md5="12ad5925f67b6b508a76a7ff11db85af" +dest_md5="a4f9b3c4280a56b9a89b6dc88653ee34" + diff --git a/project/.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.stex b/project/.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.stex new file mode 100644 index 0000000..799257b Binary files /dev/null and b/project/.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.stex differ diff --git a/project/.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.md5 b/project/.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.md5 new file mode 100644 index 0000000..528d40e --- /dev/null +++ b/project/.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.md5 @@ -0,0 +1,3 @@ +source_md5="fd4d996f20869f8662d6882d270ed09a" +dest_md5="386aa3d1997b0812a51b648a0e56731b" + diff --git a/project/.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.stex b/project/.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.stex new file mode 100644 index 0000000..cd352ad Binary files /dev/null and b/project/.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.stex differ diff --git a/project/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 b/project/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 new file mode 100644 index 0000000..97a0580 --- /dev/null +++ b/project/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 @@ -0,0 +1,3 @@ +source_md5="1313d8c94c7964dec92a0e980ec94081" +dest_md5="120d921a2b9018b4f8cb2ae7e0221949" + diff --git a/project/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex b/project/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex new file mode 100644 index 0000000..35aacd9 Binary files /dev/null and b/project/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex differ diff --git a/project/.import/icon_dark.svg-e5597fe28dca2e66ba9595c6b6035ea9.md5 b/project/.import/icon_dark.svg-e5597fe28dca2e66ba9595c6b6035ea9.md5 new file mode 100644 index 0000000..f5b48ff --- /dev/null +++ b/project/.import/icon_dark.svg-e5597fe28dca2e66ba9595c6b6035ea9.md5 @@ -0,0 +1,3 @@ +source_md5="dda26919b11be95ad21c251ac96d9e18" +dest_md5="5d20348c26149915eb8abd2cff0e418a" + diff --git a/project/.import/icon_dark.svg-e5597fe28dca2e66ba9595c6b6035ea9.stex b/project/.import/icon_dark.svg-e5597fe28dca2e66ba9595c6b6035ea9.stex new file mode 100644 index 0000000..c0ee2fe Binary files /dev/null and b/project/.import/icon_dark.svg-e5597fe28dca2e66ba9595c6b6035ea9.stex differ diff --git a/project/.import/icon_light.svg-1e5ceee64a1946dfe9d292a4e653f0ec.md5 b/project/.import/icon_light.svg-1e5ceee64a1946dfe9d292a4e653f0ec.md5 new file mode 100644 index 0000000..1ca89bc --- /dev/null +++ b/project/.import/icon_light.svg-1e5ceee64a1946dfe9d292a4e653f0ec.md5 @@ -0,0 +1,3 @@ +source_md5="94bfd2bad9a9154c6f2bd43858229aa5" +dest_md5="f52498d85e02bb60e44064fdb4d5d6f2" + diff --git a/project/.import/icon_light.svg-1e5ceee64a1946dfe9d292a4e653f0ec.stex b/project/.import/icon_light.svg-1e5ceee64a1946dfe9d292a4e653f0ec.stex new file mode 100644 index 0000000..30572b7 Binary files /dev/null and b/project/.import/icon_light.svg-1e5ceee64a1946dfe9d292a4e653f0ec.stex differ diff --git a/project/.import/iris_anima.png-91ba159c5d37df8feef644693d9a65dd.md5 b/project/.import/iris_anima.png-91ba159c5d37df8feef644693d9a65dd.md5 new file mode 100644 index 0000000..f328074 --- /dev/null +++ b/project/.import/iris_anima.png-91ba159c5d37df8feef644693d9a65dd.md5 @@ -0,0 +1,3 @@ +source_md5="bca9e8f66ccdb371fb9faabef979886a" +dest_md5="8810b8b3e9f72ffbec1584c9cc6d9fa1" + diff --git a/project/.import/iris_anima.png-91ba159c5d37df8feef644693d9a65dd.stex b/project/.import/iris_anima.png-91ba159c5d37df8feef644693d9a65dd.stex new file mode 100644 index 0000000..f679de3 Binary files /dev/null and b/project/.import/iris_anima.png-91ba159c5d37df8feef644693d9a65dd.stex differ diff --git a/project/.import/iris_anima_fb.png-fa9d75d4cfd975179410a4e4c1b072b9.md5 b/project/.import/iris_anima_fb.png-fa9d75d4cfd975179410a4e4c1b072b9.md5 new file mode 100644 index 0000000..38b3896 --- /dev/null +++ b/project/.import/iris_anima_fb.png-fa9d75d4cfd975179410a4e4c1b072b9.md5 @@ -0,0 +1,3 @@ +source_md5="95dffacf61227921a0a8969fe47a814b" +dest_md5="b946808ce38f9c4c7629058cc9d663f3" + diff --git a/project/.import/iris_anima_fb.png-fa9d75d4cfd975179410a4e4c1b072b9.stex b/project/.import/iris_anima_fb.png-fa9d75d4cfd975179410a4e4c1b072b9.stex new file mode 100644 index 0000000..b1556c1 Binary files /dev/null and b/project/.import/iris_anima_fb.png-fa9d75d4cfd975179410a4e4c1b072b9.stex differ diff --git a/project/.import/iris_anima_fb2.png-08ea33dd3c82fe515f499b7290fd7d50.md5 b/project/.import/iris_anima_fb2.png-08ea33dd3c82fe515f499b7290fd7d50.md5 new file mode 100644 index 0000000..c7006b9 --- /dev/null +++ b/project/.import/iris_anima_fb2.png-08ea33dd3c82fe515f499b7290fd7d50.md5 @@ -0,0 +1,3 @@ +source_md5="e3af10d58cdf25581a7fe583df059b33" +dest_md5="9d801d74c3c5430da56574475d89c374" + diff --git a/project/.import/iris_anima_fb2.png-08ea33dd3c82fe515f499b7290fd7d50.stex b/project/.import/iris_anima_fb2.png-08ea33dd3c82fe515f499b7290fd7d50.stex new file mode 100644 index 0000000..57032e1 Binary files /dev/null and b/project/.import/iris_anima_fb2.png-08ea33dd3c82fe515f499b7290fd7d50.stex differ diff --git a/project/.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.md5 b/project/.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.md5 new file mode 100644 index 0000000..3709252 --- /dev/null +++ b/project/.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.md5 @@ -0,0 +1,3 @@ +source_md5="54dd9a6a11f7f5d5f6e1ec49f376e6e1" +dest_md5="05467a3cf7751120b3680b4da0d8a222" + diff --git a/project/.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.stex b/project/.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.stex new file mode 100644 index 0000000..62dd441 Binary files /dev/null and b/project/.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.stex differ diff --git a/project/.import/label.svg-1e5369b09915049583eed270d116d4e1.md5 b/project/.import/label.svg-1e5369b09915049583eed270d116d4e1.md5 new file mode 100644 index 0000000..dc85150 --- /dev/null +++ b/project/.import/label.svg-1e5369b09915049583eed270d116d4e1.md5 @@ -0,0 +1,3 @@ +source_md5="557ae577979655a75af0336af89f8d15" +dest_md5="9e497af82cbc501fb63c3031ccef0523" + diff --git a/project/.import/label.svg-1e5369b09915049583eed270d116d4e1.stex b/project/.import/label.svg-1e5369b09915049583eed270d116d4e1.stex new file mode 100644 index 0000000..f0f0c5e Binary files /dev/null and b/project/.import/label.svg-1e5369b09915049583eed270d116d4e1.stex differ diff --git a/project/.import/level1.ogg-df8e3ce1b9b0d0c6dcdc344e199f8820.md5 b/project/.import/level1.ogg-df8e3ce1b9b0d0c6dcdc344e199f8820.md5 new file mode 100644 index 0000000..bfe4fb9 --- /dev/null +++ b/project/.import/level1.ogg-df8e3ce1b9b0d0c6dcdc344e199f8820.md5 @@ -0,0 +1,3 @@ +source_md5="10f4149fccb40a0251fda8e9fac6312e" +dest_md5="1535fa332846c0f72ae13846d4aa133c" + diff --git a/project/.import/level1.ogg-df8e3ce1b9b0d0c6dcdc344e199f8820.oggstr b/project/.import/level1.ogg-df8e3ce1b9b0d0c6dcdc344e199f8820.oggstr new file mode 100644 index 0000000..7c48104 Binary files /dev/null and b/project/.import/level1.ogg-df8e3ce1b9b0d0c6dcdc344e199f8820.oggstr differ diff --git a/project/.import/level1.png-c6e0e7873515cde84edfbbf5ac2a46ae.md5 b/project/.import/level1.png-c6e0e7873515cde84edfbbf5ac2a46ae.md5 new file mode 100644 index 0000000..7efae4a --- /dev/null +++ b/project/.import/level1.png-c6e0e7873515cde84edfbbf5ac2a46ae.md5 @@ -0,0 +1,3 @@ +source_md5="332fa3bcfb67a63d835cb0121d3e44c5" +dest_md5="9476c8c247e64220c1f2acd178891b51" + diff --git a/project/.import/level1.png-c6e0e7873515cde84edfbbf5ac2a46ae.stex b/project/.import/level1.png-c6e0e7873515cde84edfbbf5ac2a46ae.stex new file mode 100644 index 0000000..8952a99 Binary files /dev/null and b/project/.import/level1.png-c6e0e7873515cde84edfbbf5ac2a46ae.stex differ diff --git a/project/.import/level2.ogg-a313b36c19ea0f230c20a72541086d62.md5 b/project/.import/level2.ogg-a313b36c19ea0f230c20a72541086d62.md5 new file mode 100644 index 0000000..1bcfeaa --- /dev/null +++ b/project/.import/level2.ogg-a313b36c19ea0f230c20a72541086d62.md5 @@ -0,0 +1,3 @@ +source_md5="d21a3b221d0ed07408e2263ec378278c" +dest_md5="86d423949c2e2c9675843ffebbd4fc45" + diff --git a/project/.import/level2.ogg-a313b36c19ea0f230c20a72541086d62.oggstr b/project/.import/level2.ogg-a313b36c19ea0f230c20a72541086d62.oggstr new file mode 100644 index 0000000..c93e4c2 Binary files /dev/null and b/project/.import/level2.ogg-a313b36c19ea0f230c20a72541086d62.oggstr differ diff --git a/project/.import/level2.png-364e72f2e692937b3dc5393b78a7f0bc.md5 b/project/.import/level2.png-364e72f2e692937b3dc5393b78a7f0bc.md5 new file mode 100644 index 0000000..5301fb7 --- /dev/null +++ b/project/.import/level2.png-364e72f2e692937b3dc5393b78a7f0bc.md5 @@ -0,0 +1,3 @@ +source_md5="81468de08ab28fcf5572f213019f7f6e" +dest_md5="3a4e477c4ca294236af420af37b479c9" + diff --git a/project/.import/level2.png-364e72f2e692937b3dc5393b78a7f0bc.stex b/project/.import/level2.png-364e72f2e692937b3dc5393b78a7f0bc.stex new file mode 100644 index 0000000..1ec9a96 Binary files /dev/null and b/project/.import/level2.png-364e72f2e692937b3dc5393b78a7f0bc.stex differ diff --git a/project/.import/level3.ogg-64c70567ab1b26a09808f4a7d147e6e1.md5 b/project/.import/level3.ogg-64c70567ab1b26a09808f4a7d147e6e1.md5 new file mode 100644 index 0000000..bfb0cba --- /dev/null +++ b/project/.import/level3.ogg-64c70567ab1b26a09808f4a7d147e6e1.md5 @@ -0,0 +1,3 @@ +source_md5="51cb2b536ba1a04916f9c472048f208b" +dest_md5="036a9f7c046900df46d549f43ce2e4a0" + diff --git a/project/.import/level3.ogg-64c70567ab1b26a09808f4a7d147e6e1.oggstr b/project/.import/level3.ogg-64c70567ab1b26a09808f4a7d147e6e1.oggstr new file mode 100644 index 0000000..aac6492 Binary files /dev/null and b/project/.import/level3.ogg-64c70567ab1b26a09808f4a7d147e6e1.oggstr differ diff --git a/project/.import/level3.png-1e7d65365de5017c65693f7b140e9dd3.md5 b/project/.import/level3.png-1e7d65365de5017c65693f7b140e9dd3.md5 new file mode 100644 index 0000000..99ac220 --- /dev/null +++ b/project/.import/level3.png-1e7d65365de5017c65693f7b140e9dd3.md5 @@ -0,0 +1,3 @@ +source_md5="73217deb5101e2ca7eeace6509a757ac" +dest_md5="11ce45b95884224b99182e9f518e7299" + diff --git a/project/.import/level3.png-1e7d65365de5017c65693f7b140e9dd3.stex b/project/.import/level3.png-1e7d65365de5017c65693f7b140e9dd3.stex new file mode 100644 index 0000000..5115841 Binary files /dev/null and b/project/.import/level3.png-1e7d65365de5017c65693f7b140e9dd3.stex differ diff --git a/project/.import/levelfinal.png-b1fe3ce694bf81994646c8e36d038aa6.md5 b/project/.import/levelfinal.png-b1fe3ce694bf81994646c8e36d038aa6.md5 new file mode 100644 index 0000000..d487910 --- /dev/null +++ b/project/.import/levelfinal.png-b1fe3ce694bf81994646c8e36d038aa6.md5 @@ -0,0 +1,3 @@ +source_md5="670e7fa2e94ebde98053ef1888387e65" +dest_md5="672e11d41beecb86243a15c3da8c9693" + diff --git a/project/.import/levelfinal.png-b1fe3ce694bf81994646c8e36d038aa6.stex b/project/.import/levelfinal.png-b1fe3ce694bf81994646c8e36d038aa6.stex new file mode 100644 index 0000000..ee37ba0 Binary files /dev/null and b/project/.import/levelfinal.png-b1fe3ce694bf81994646c8e36d038aa6.stex differ diff --git a/project/.import/levelfinal_start.ogg-05facebb35cce878439f93e7f0c1c42e.md5 b/project/.import/levelfinal_start.ogg-05facebb35cce878439f93e7f0c1c42e.md5 new file mode 100644 index 0000000..411c9e8 --- /dev/null +++ b/project/.import/levelfinal_start.ogg-05facebb35cce878439f93e7f0c1c42e.md5 @@ -0,0 +1,3 @@ +source_md5="ba05e2fae79c5fe16daa2bad46e0eb61" +dest_md5="4faf0d152354e04f6295a6decb44ce6f" + diff --git a/project/.import/levelfinal_start.ogg-05facebb35cce878439f93e7f0c1c42e.oggstr b/project/.import/levelfinal_start.ogg-05facebb35cce878439f93e7f0c1c42e.oggstr new file mode 100644 index 0000000..bfcd934 Binary files /dev/null and b/project/.import/levelfinal_start.ogg-05facebb35cce878439f93e7f0c1c42e.oggstr differ diff --git a/project/.import/light.png-6a784494c7d3cd18280e1811188faea0.md5 b/project/.import/light.png-6a784494c7d3cd18280e1811188faea0.md5 new file mode 100644 index 0000000..ec9e368 --- /dev/null +++ b/project/.import/light.png-6a784494c7d3cd18280e1811188faea0.md5 @@ -0,0 +1,3 @@ +source_md5="4ed59d27b38c9ef0674d7754de7b38a0" +dest_md5="58543191630235ba1f28bd6d20ada6ad" + diff --git a/project/.import/light.png-6a784494c7d3cd18280e1811188faea0.stex b/project/.import/light.png-6a784494c7d3cd18280e1811188faea0.stex new file mode 100644 index 0000000..a00ac05 Binary files /dev/null and b/project/.import/light.png-6a784494c7d3cd18280e1811188faea0.stex differ diff --git a/project/.import/melee_atk.ogg-3ae8a8e22acbe5b5c30fdd94507c3edb.md5 b/project/.import/melee_atk.ogg-3ae8a8e22acbe5b5c30fdd94507c3edb.md5 new file mode 100644 index 0000000..54b5036 --- /dev/null +++ b/project/.import/melee_atk.ogg-3ae8a8e22acbe5b5c30fdd94507c3edb.md5 @@ -0,0 +1,3 @@ +source_md5="ecefe1cef75829d403c51f60c074ffc6" +dest_md5="2caaec2421b4a6930cf94e8ecc08a911" + diff --git a/project/.import/melee_atk.ogg-3ae8a8e22acbe5b5c30fdd94507c3edb.oggstr b/project/.import/melee_atk.ogg-3ae8a8e22acbe5b5c30fdd94507c3edb.oggstr new file mode 100644 index 0000000..870a0a4 Binary files /dev/null and b/project/.import/melee_atk.ogg-3ae8a8e22acbe5b5c30fdd94507c3edb.oggstr differ diff --git a/project/.import/motor_fb.png-75bf89444f2f65dbb11996640c12f67b.md5 b/project/.import/motor_fb.png-75bf89444f2f65dbb11996640c12f67b.md5 new file mode 100644 index 0000000..b73974d --- /dev/null +++ b/project/.import/motor_fb.png-75bf89444f2f65dbb11996640c12f67b.md5 @@ -0,0 +1,3 @@ +source_md5="934face7dbe2ae5cd7954769952c3ecc" +dest_md5="a9351c79e9fba66b251550e6f0a46fd4" + diff --git a/project/.import/motor_fb.png-75bf89444f2f65dbb11996640c12f67b.stex b/project/.import/motor_fb.png-75bf89444f2f65dbb11996640c12f67b.stex new file mode 100644 index 0000000..85dbe03 Binary files /dev/null and b/project/.import/motor_fb.png-75bf89444f2f65dbb11996640c12f67b.stex differ diff --git a/project/.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.md5 b/project/.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.md5 new file mode 100644 index 0000000..20645c6 --- /dev/null +++ b/project/.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.md5 @@ -0,0 +1,3 @@ +source_md5="694e7b86bccb523721a52f7de9d5b0be" +dest_md5="f5bc627632fa2f5dccf3bfe01ed5d717" + diff --git a/project/.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.stex b/project/.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.stex new file mode 100644 index 0000000..2fa2b6a Binary files /dev/null and b/project/.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.stex differ diff --git a/project/.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.md5 b/project/.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.md5 new file mode 100644 index 0000000..f2f2eb5 --- /dev/null +++ b/project/.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.md5 @@ -0,0 +1,3 @@ +source_md5="17bf297f42b6eab3850fd64448597a12" +dest_md5="b7bb7f30792fdb95d522e2b840bf5ffe" + diff --git a/project/.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.stex b/project/.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.stex new file mode 100644 index 0000000..65f14b0 Binary files /dev/null and b/project/.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.stex differ diff --git a/project/.import/petals.png-ef4bb753646bcb6bbff6f616f6fb24cc.md5 b/project/.import/petals.png-ef4bb753646bcb6bbff6f616f6fb24cc.md5 new file mode 100644 index 0000000..2725acd --- /dev/null +++ b/project/.import/petals.png-ef4bb753646bcb6bbff6f616f6fb24cc.md5 @@ -0,0 +1,3 @@ +source_md5="f2dd5c0a57eedfd1fe2167df17eed2c4" +dest_md5="98e6fc0a266a43755310c69ea022193c" + diff --git a/project/.import/petals.png-ef4bb753646bcb6bbff6f616f6fb24cc.stex b/project/.import/petals.png-ef4bb753646bcb6bbff6f616f6fb24cc.stex new file mode 100644 index 0000000..33ba1e1 Binary files /dev/null and b/project/.import/petals.png-ef4bb753646bcb6bbff6f616f6fb24cc.stex differ diff --git a/project/.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.md5 b/project/.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.md5 new file mode 100644 index 0000000..7f4f9f9 --- /dev/null +++ b/project/.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.md5 @@ -0,0 +1,3 @@ +source_md5="198220045f68a40861d3e2ef6b5944a3" +dest_md5="ee194ef879e9a06dd1346322a90d4ba4" + diff --git a/project/.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.stex b/project/.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.stex new file mode 100644 index 0000000..422d976 Binary files /dev/null and b/project/.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.stex differ diff --git a/project/.import/playermelee.png-2f10abeb2c38234275efe95d79f5fcb3.md5 b/project/.import/playermelee.png-2f10abeb2c38234275efe95d79f5fcb3.md5 new file mode 100644 index 0000000..4e037c9 --- /dev/null +++ b/project/.import/playermelee.png-2f10abeb2c38234275efe95d79f5fcb3.md5 @@ -0,0 +1,3 @@ +source_md5="63c3a93b2c0e2b0930150333b4419d49" +dest_md5="c8ba7485485283d57832e49db87800a5" + diff --git a/project/.import/playermelee.png-2f10abeb2c38234275efe95d79f5fcb3.stex b/project/.import/playermelee.png-2f10abeb2c38234275efe95d79f5fcb3.stex new file mode 100644 index 0000000..a8033e5 Binary files /dev/null and b/project/.import/playermelee.png-2f10abeb2c38234275efe95d79f5fcb3.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.md5 b/project/.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.md5 new file mode 100644 index 0000000..b5d06d1 --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.md5 @@ -0,0 +1,3 @@ +source_md5="2f2cd914a240a02c77277150d8d11293" +dest_md5="76681936f100de14c22dc8e226ac66b6" + diff --git a/project/.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.stex b/project/.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.stex new file mode 100644 index 0000000..01ba6f2 Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.md5 b/project/.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.md5 new file mode 100644 index 0000000..8d89416 --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.md5 @@ -0,0 +1,3 @@ +source_md5="ea6908260c098e8a6346ec918ca6157f" +dest_md5="23d8f3199248757bfaccc6253884912f" + diff --git a/project/.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.stex b/project/.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.stex new file mode 100644 index 0000000..14133af Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.md5 b/project/.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.md5 new file mode 100644 index 0000000..2c70fcf --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.md5 @@ -0,0 +1,3 @@ +source_md5="a8a8ed4cd7200586a5ec9f64534f1390" +dest_md5="e8338947d25897563279f9dcd486f6a8" + diff --git a/project/.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.stex b/project/.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.stex new file mode 100644 index 0000000..706d87b Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.md5 b/project/.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.md5 new file mode 100644 index 0000000..b6142ed --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.md5 @@ -0,0 +1,3 @@ +source_md5="03314ea6a5ed0e01b0260c16b061bd2b" +dest_md5="dbdf9c5a94d4f6345dede2757afaed55" + diff --git a/project/.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.stex b/project/.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.stex new file mode 100644 index 0000000..9c5a92c Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.md5 b/project/.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.md5 new file mode 100644 index 0000000..03259d2 --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.md5 @@ -0,0 +1,3 @@ +source_md5="8a03a8dba58e250abfc720e423deab16" +dest_md5="b3fbbf1388019854fdc23d3fed6f06e9" + diff --git a/project/.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.stex b/project/.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.stex new file mode 100644 index 0000000..b535ea9 Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.md5 b/project/.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.md5 new file mode 100644 index 0000000..ac4c3cc --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.md5 @@ -0,0 +1,3 @@ +source_md5="094a40814e7cb25377530a53c1360b0b" +dest_md5="95d91a47dab3ed4999924b5d92ec83ae" + diff --git a/project/.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.stex b/project/.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.stex new file mode 100644 index 0000000..e12f8a8 Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.stex differ diff --git a/project/.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.md5 b/project/.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.md5 new file mode 100644 index 0000000..e732af5 --- /dev/null +++ b/project/.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.md5 @@ -0,0 +1,3 @@ +source_md5="88087a55e226ff426644ecad7414d3f7" +dest_md5="fa0f7f4d6f3cc9fb5de264316f69b7ad" + diff --git a/project/.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.stex b/project/.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.stex new file mode 100644 index 0000000..2b134e8 Binary files /dev/null and b/project/.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.md5 b/project/.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.md5 new file mode 100644 index 0000000..2a47ea8 --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.md5 @@ -0,0 +1,3 @@ +source_md5="f184b86d7aed4123c2bbfae034ed045a" +dest_md5="5860d3bf95e1f090db571c11a8832f29" + diff --git a/project/.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.stex b/project/.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.stex new file mode 100644 index 0000000..0647ca9 Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.md5 b/project/.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.md5 new file mode 100644 index 0000000..72fb35f --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.md5 @@ -0,0 +1,3 @@ +source_md5="81a8e792fcbcce2d818a4b7febc65ff0" +dest_md5="f18d7f39418637b4fe82b0a284113e3f" + diff --git a/project/.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.stex b/project/.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.stex new file mode 100644 index 0000000..bd21475 Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.md5 b/project/.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.md5 new file mode 100644 index 0000000..72bf401 --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.md5 @@ -0,0 +1,3 @@ +source_md5="4ba34d0805ee0a919041bd914bd9b3be" +dest_md5="8d4e4c7dff259b2e882662cc8e0f0b6f" + diff --git a/project/.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.stex b/project/.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.stex new file mode 100644 index 0000000..658c04c Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.md5 b/project/.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.md5 new file mode 100644 index 0000000..a9cc363 --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.md5 @@ -0,0 +1,3 @@ +source_md5="7a5e70b95115d05366f18b6cdd839409" +dest_md5="31cbe917143825f517f816b45eaa162c" + diff --git a/project/.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.stex b/project/.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.stex new file mode 100644 index 0000000..28e7182 Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.md5 b/project/.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.md5 new file mode 100644 index 0000000..0c9ca03 --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.md5 @@ -0,0 +1,3 @@ +source_md5="42c474a03b48315b6c63ff41fce18d9e" +dest_md5="b9615c21d555cebe8701d90527da1d5b" + diff --git a/project/.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.stex b/project/.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.stex new file mode 100644 index 0000000..c6685bf Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.md5 b/project/.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.md5 new file mode 100644 index 0000000..048bd5e --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.md5 @@ -0,0 +1,3 @@ +source_md5="b338d8ba15cd0abb651bc4c003885c2b" +dest_md5="48b7db6ed10323ebf746be8974e38afc" + diff --git a/project/.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.stex b/project/.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.stex new file mode 100644 index 0000000..0c35112 Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.stex differ diff --git a/project/.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.md5 b/project/.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.md5 new file mode 100644 index 0000000..8bbd019 --- /dev/null +++ b/project/.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.md5 @@ -0,0 +1,3 @@ +source_md5="1b58305e651ca229ed91e96eac1a0483" +dest_md5="94b7a5898ddad5789abf3231c9957d5d" + diff --git a/project/.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.stex b/project/.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.stex new file mode 100644 index 0000000..bf3ce2f Binary files /dev/null and b/project/.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.stex differ diff --git a/project/.import/question.svg-e8715956b6df35b64adef0a9d414d62b.md5 b/project/.import/question.svg-e8715956b6df35b64adef0a9d414d62b.md5 new file mode 100644 index 0000000..142692a --- /dev/null +++ b/project/.import/question.svg-e8715956b6df35b64adef0a9d414d62b.md5 @@ -0,0 +1,3 @@ +source_md5="9a170014c1483b88da333108c15b1b82" +dest_md5="baf1d5e813de71b103a60aeeaf29ec81" + diff --git a/project/.import/question.svg-e8715956b6df35b64adef0a9d414d62b.stex b/project/.import/question.svg-e8715956b6df35b64adef0a9d414d62b.stex new file mode 100644 index 0000000..bb4608a Binary files /dev/null and b/project/.import/question.svg-e8715956b6df35b64adef0a9d414d62b.stex differ diff --git a/project/.import/saigyou_badend1.png-58508b2619dc9a4c5b027bd37f1bfc03.md5 b/project/.import/saigyou_badend1.png-58508b2619dc9a4c5b027bd37f1bfc03.md5 new file mode 100644 index 0000000..84abc48 --- /dev/null +++ b/project/.import/saigyou_badend1.png-58508b2619dc9a4c5b027bd37f1bfc03.md5 @@ -0,0 +1,3 @@ +source_md5="0617db30a7394b602e41e1cbfe15dc15" +dest_md5="c92b3b57cc0444172792181f89a4cdca" + diff --git a/project/.import/saigyou_badend1.png-58508b2619dc9a4c5b027bd37f1bfc03.stex b/project/.import/saigyou_badend1.png-58508b2619dc9a4c5b027bd37f1bfc03.stex new file mode 100644 index 0000000..1051bb4 Binary files /dev/null and b/project/.import/saigyou_badend1.png-58508b2619dc9a4c5b027bd37f1bfc03.stex differ diff --git a/project/.import/saigyou_badend2.png-209159c62becd887f4906516230b1857.md5 b/project/.import/saigyou_badend2.png-209159c62becd887f4906516230b1857.md5 new file mode 100644 index 0000000..2a39604 --- /dev/null +++ b/project/.import/saigyou_badend2.png-209159c62becd887f4906516230b1857.md5 @@ -0,0 +1,3 @@ +source_md5="cf3e7b97bf5897ff2940c217314cb6d6" +dest_md5="fc3dee6704b2a6e4e5d8a9767543f648" + diff --git a/project/.import/saigyou_badend2.png-209159c62becd887f4906516230b1857.stex b/project/.import/saigyou_badend2.png-209159c62becd887f4906516230b1857.stex new file mode 100644 index 0000000..d3cee9c Binary files /dev/null and b/project/.import/saigyou_badend2.png-209159c62becd887f4906516230b1857.stex differ diff --git a/project/.import/saigyou_badend3.png-b4d125c1e30d1eaa68308e898dd5c3c6.md5 b/project/.import/saigyou_badend3.png-b4d125c1e30d1eaa68308e898dd5c3c6.md5 new file mode 100644 index 0000000..dbffc27 --- /dev/null +++ b/project/.import/saigyou_badend3.png-b4d125c1e30d1eaa68308e898dd5c3c6.md5 @@ -0,0 +1,3 @@ +source_md5="c565d1e0dfd4c25540299267b836073c" +dest_md5="dbeae805c25cc7b89cccb28d5ca75a5d" + diff --git a/project/.import/saigyou_badend3.png-b4d125c1e30d1eaa68308e898dd5c3c6.stex b/project/.import/saigyou_badend3.png-b4d125c1e30d1eaa68308e898dd5c3c6.stex new file mode 100644 index 0000000..0666ce9 Binary files /dev/null and b/project/.import/saigyou_badend3.png-b4d125c1e30d1eaa68308e898dd5c3c6.stex differ diff --git a/project/.import/saigyou_fakemem.png-527cdb7fbb1c4c83efc93a2addd391fd.md5 b/project/.import/saigyou_fakemem.png-527cdb7fbb1c4c83efc93a2addd391fd.md5 new file mode 100644 index 0000000..911c1c3 --- /dev/null +++ b/project/.import/saigyou_fakemem.png-527cdb7fbb1c4c83efc93a2addd391fd.md5 @@ -0,0 +1,3 @@ +source_md5="2e9ba6867beae730fa49dd90838c8bc9" +dest_md5="e99dd5e75c30d004cec08fcc000b23be" + diff --git a/project/.import/saigyou_fakemem.png-527cdb7fbb1c4c83efc93a2addd391fd.stex b/project/.import/saigyou_fakemem.png-527cdb7fbb1c4c83efc93a2addd391fd.stex new file mode 100644 index 0000000..7e80dbd Binary files /dev/null and b/project/.import/saigyou_fakemem.png-527cdb7fbb1c4c83efc93a2addd391fd.stex differ diff --git a/project/.import/saigyou_fb.png-e0b6e208fa16c25dd6dce0c077af6b1e.md5 b/project/.import/saigyou_fb.png-e0b6e208fa16c25dd6dce0c077af6b1e.md5 new file mode 100644 index 0000000..31d2ec9 --- /dev/null +++ b/project/.import/saigyou_fb.png-e0b6e208fa16c25dd6dce0c077af6b1e.md5 @@ -0,0 +1,3 @@ +source_md5="baae1eb54079f627d3f3068a31050b44" +dest_md5="04a25f1b8d94e1fa2b7f04db9047fa45" + diff --git a/project/.import/saigyou_fb.png-e0b6e208fa16c25dd6dce0c077af6b1e.stex b/project/.import/saigyou_fb.png-e0b6e208fa16c25dd6dce0c077af6b1e.stex new file mode 100644 index 0000000..981caf2 Binary files /dev/null and b/project/.import/saigyou_fb.png-e0b6e208fa16c25dd6dce0c077af6b1e.stex differ diff --git a/project/.import/saigyou_irl.png-0bda2b426c1164a912b6ee9673738fba.md5 b/project/.import/saigyou_irl.png-0bda2b426c1164a912b6ee9673738fba.md5 new file mode 100644 index 0000000..deccc40 --- /dev/null +++ b/project/.import/saigyou_irl.png-0bda2b426c1164a912b6ee9673738fba.md5 @@ -0,0 +1,3 @@ +source_md5="423fea84768237d98020d51a1904542c" +dest_md5="36d1d5169bc112e5b08fd9dfceb997b4" + diff --git a/project/.import/saigyou_irl.png-0bda2b426c1164a912b6ee9673738fba.stex b/project/.import/saigyou_irl.png-0bda2b426c1164a912b6ee9673738fba.stex new file mode 100644 index 0000000..2cadff7 Binary files /dev/null and b/project/.import/saigyou_irl.png-0bda2b426c1164a912b6ee9673738fba.stex differ diff --git a/project/.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.md5 b/project/.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.md5 new file mode 100644 index 0000000..b174b31 --- /dev/null +++ b/project/.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.md5 @@ -0,0 +1,3 @@ +source_md5="69e05be0b2e8152493eacc137be4e87e" +dest_md5="9c26882f0fcc2ae7d5f63938a2507511" + diff --git a/project/.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.stex b/project/.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.stex new file mode 100644 index 0000000..99415db Binary files /dev/null and b/project/.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.stex differ diff --git a/project/.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.md5 b/project/.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.md5 new file mode 100644 index 0000000..45d338f --- /dev/null +++ b/project/.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.md5 @@ -0,0 +1,3 @@ +source_md5="25c31e9bb8afe198824befa890acb2d6" +dest_md5="b469fe230566fa6d7b5cf1c0c7c86de5" + diff --git a/project/.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.stex b/project/.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.stex new file mode 100644 index 0000000..c4fc049 Binary files /dev/null and b/project/.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.stex differ diff --git a/project/.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.md5 b/project/.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.md5 new file mode 100644 index 0000000..e7ee460 --- /dev/null +++ b/project/.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.md5 @@ -0,0 +1,3 @@ +source_md5="cf216848275880a1178ff46b087ca51d" +dest_md5="ced77fe40c9da0b323ece7caab3baab4" + diff --git a/project/.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.stex b/project/.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.stex new file mode 100644 index 0000000..79e2b8b Binary files /dev/null and b/project/.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.stex differ diff --git a/project/.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.md5 b/project/.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.md5 new file mode 100644 index 0000000..ae58b14 --- /dev/null +++ b/project/.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.md5 @@ -0,0 +1,3 @@ +source_md5="5bb806d2b81bee08af33148f7b5946d8" +dest_md5="b9f4003ebf45d75289d4127358267145" + diff --git a/project/.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.stex b/project/.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.stex new file mode 100644 index 0000000..d6f822e Binary files /dev/null and b/project/.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.stex differ diff --git a/project/.import/shat_progress_0.png-530eec0a1525c08173accbf09062f2a6.md5 b/project/.import/shat_progress_0.png-530eec0a1525c08173accbf09062f2a6.md5 new file mode 100644 index 0000000..63d60fc --- /dev/null +++ b/project/.import/shat_progress_0.png-530eec0a1525c08173accbf09062f2a6.md5 @@ -0,0 +1,3 @@ +source_md5="5a3d8483681701ad1afc80b266050c36" +dest_md5="3b9aaa2ee43be81cb89e21515710e3fb" + diff --git a/project/.import/shat_progress_0.png-530eec0a1525c08173accbf09062f2a6.stex b/project/.import/shat_progress_0.png-530eec0a1525c08173accbf09062f2a6.stex new file mode 100644 index 0000000..9694916 Binary files /dev/null and b/project/.import/shat_progress_0.png-530eec0a1525c08173accbf09062f2a6.stex differ diff --git a/project/.import/shat_progress_0_l.png-2b14d8ba8292de3a0d6f4a519fd3dc3b.md5 b/project/.import/shat_progress_0_l.png-2b14d8ba8292de3a0d6f4a519fd3dc3b.md5 new file mode 100644 index 0000000..6fb0e81 --- /dev/null +++ b/project/.import/shat_progress_0_l.png-2b14d8ba8292de3a0d6f4a519fd3dc3b.md5 @@ -0,0 +1,3 @@ +source_md5="53ee6e715f110b2c6bf54d61dd2e228d" +dest_md5="1b76a7c3343013ae0da4cab165d69b72" + diff --git a/project/.import/shat_progress_0_l.png-2b14d8ba8292de3a0d6f4a519fd3dc3b.stex b/project/.import/shat_progress_0_l.png-2b14d8ba8292de3a0d6f4a519fd3dc3b.stex new file mode 100644 index 0000000..9f6c1cc Binary files /dev/null and b/project/.import/shat_progress_0_l.png-2b14d8ba8292de3a0d6f4a519fd3dc3b.stex differ diff --git a/project/.import/shat_progress_1.png-4faf937d5a277584cad77d6bc7312cbc.md5 b/project/.import/shat_progress_1.png-4faf937d5a277584cad77d6bc7312cbc.md5 new file mode 100644 index 0000000..0d578e7 --- /dev/null +++ b/project/.import/shat_progress_1.png-4faf937d5a277584cad77d6bc7312cbc.md5 @@ -0,0 +1,3 @@ +source_md5="c5eddbc3158c354537dabce20622e56b" +dest_md5="3b8dffeaeffffd1f38c0a19989d154c9" + diff --git a/project/.import/shat_progress_1.png-4faf937d5a277584cad77d6bc7312cbc.stex b/project/.import/shat_progress_1.png-4faf937d5a277584cad77d6bc7312cbc.stex new file mode 100644 index 0000000..124bc22 Binary files /dev/null and b/project/.import/shat_progress_1.png-4faf937d5a277584cad77d6bc7312cbc.stex differ diff --git a/project/.import/shat_progress_2.png-4f8c13ff6fb94ba8f2701f8968ea6345.md5 b/project/.import/shat_progress_2.png-4f8c13ff6fb94ba8f2701f8968ea6345.md5 new file mode 100644 index 0000000..dfb41f3 --- /dev/null +++ b/project/.import/shat_progress_2.png-4f8c13ff6fb94ba8f2701f8968ea6345.md5 @@ -0,0 +1,3 @@ +source_md5="279d4f746172eb35642537a1ff3fc8c1" +dest_md5="f5e0aead91ec8edc865db35778b09a5f" + diff --git a/project/.import/shat_progress_2.png-4f8c13ff6fb94ba8f2701f8968ea6345.stex b/project/.import/shat_progress_2.png-4f8c13ff6fb94ba8f2701f8968ea6345.stex new file mode 100644 index 0000000..ae8e58f Binary files /dev/null and b/project/.import/shat_progress_2.png-4f8c13ff6fb94ba8f2701f8968ea6345.stex differ diff --git a/project/.import/shat_progress_3.png-365951fa58bc77c7c3f95779e113e792.md5 b/project/.import/shat_progress_3.png-365951fa58bc77c7c3f95779e113e792.md5 new file mode 100644 index 0000000..f002bb7 --- /dev/null +++ b/project/.import/shat_progress_3.png-365951fa58bc77c7c3f95779e113e792.md5 @@ -0,0 +1,3 @@ +source_md5="f74f2d1dd65deba2b9fe460c5f64d22c" +dest_md5="fd74677aff8875081ba71cef0148f54b" + diff --git a/project/.import/shat_progress_3.png-365951fa58bc77c7c3f95779e113e792.stex b/project/.import/shat_progress_3.png-365951fa58bc77c7c3f95779e113e792.stex new file mode 100644 index 0000000..613e37f Binary files /dev/null and b/project/.import/shat_progress_3.png-365951fa58bc77c7c3f95779e113e792.stex differ diff --git a/project/.import/shat_progress_4.png-cbad39a7e288c05555e03fef4eb37d24.md5 b/project/.import/shat_progress_4.png-cbad39a7e288c05555e03fef4eb37d24.md5 new file mode 100644 index 0000000..666dfd1 --- /dev/null +++ b/project/.import/shat_progress_4.png-cbad39a7e288c05555e03fef4eb37d24.md5 @@ -0,0 +1,3 @@ +source_md5="9167c5e99c2defd002ce27e981eb9803" +dest_md5="9d75eeb2ff578b9425318db697a3fdcd" + diff --git a/project/.import/shat_progress_4.png-cbad39a7e288c05555e03fef4eb37d24.stex b/project/.import/shat_progress_4.png-cbad39a7e288c05555e03fef4eb37d24.stex new file mode 100644 index 0000000..8ceb89c Binary files /dev/null and b/project/.import/shat_progress_4.png-cbad39a7e288c05555e03fef4eb37d24.stex differ diff --git a/project/.import/shattered1.png-c3845572d0e2ab328c7bbf2470c0b127.md5 b/project/.import/shattered1.png-c3845572d0e2ab328c7bbf2470c0b127.md5 new file mode 100644 index 0000000..1d86800 --- /dev/null +++ b/project/.import/shattered1.png-c3845572d0e2ab328c7bbf2470c0b127.md5 @@ -0,0 +1,3 @@ +source_md5="a023aa8870470291e2248bfa1219185c" +dest_md5="16ebc56ff20696979316f0eecb9bb829" + diff --git a/project/.import/shattered1.png-c3845572d0e2ab328c7bbf2470c0b127.stex b/project/.import/shattered1.png-c3845572d0e2ab328c7bbf2470c0b127.stex new file mode 100644 index 0000000..1720b06 Binary files /dev/null and b/project/.import/shattered1.png-c3845572d0e2ab328c7bbf2470c0b127.stex differ diff --git a/project/.import/splash.png-929ed8a00b89ba36c51789452f874c77.md5 b/project/.import/splash.png-929ed8a00b89ba36c51789452f874c77.md5 new file mode 100644 index 0000000..a0d6789 --- /dev/null +++ b/project/.import/splash.png-929ed8a00b89ba36c51789452f874c77.md5 @@ -0,0 +1,3 @@ +source_md5="c92c0a8ed5345198108031dc317b4c64" +dest_md5="3291e6a7cf0093176b222c73bfb894e5" + diff --git a/project/.import/splash.png-929ed8a00b89ba36c51789452f874c77.stex b/project/.import/splash.png-929ed8a00b89ba36c51789452f874c77.stex new file mode 100644 index 0000000..c059a79 Binary files /dev/null and b/project/.import/splash.png-929ed8a00b89ba36c51789452f874c77.stex differ diff --git a/project/.import/staff.png-30e0eebe86cdbb2029764bc3894da87d.md5 b/project/.import/staff.png-30e0eebe86cdbb2029764bc3894da87d.md5 new file mode 100644 index 0000000..62fddf6 --- /dev/null +++ b/project/.import/staff.png-30e0eebe86cdbb2029764bc3894da87d.md5 @@ -0,0 +1,3 @@ +source_md5="ba263dadb7f32f00e26ed328a7a7d4ca" +dest_md5="8d02639dc70063d8823965fd87c259f5" + diff --git a/project/.import/staff.png-30e0eebe86cdbb2029764bc3894da87d.stex b/project/.import/staff.png-30e0eebe86cdbb2029764bc3894da87d.stex new file mode 100644 index 0000000..c55dd0b Binary files /dev/null and b/project/.import/staff.png-30e0eebe86cdbb2029764bc3894da87d.stex differ diff --git a/project/.import/suika_dance.wav-a2589f25c0bbea603f68025f28a6ccd3.md5 b/project/.import/suika_dance.wav-a2589f25c0bbea603f68025f28a6ccd3.md5 new file mode 100644 index 0000000..e4c70fd --- /dev/null +++ b/project/.import/suika_dance.wav-a2589f25c0bbea603f68025f28a6ccd3.md5 @@ -0,0 +1,3 @@ +source_md5="41a5da5e862875aed75e65f27b435dea" +dest_md5="00c6a5b4798763660b3a5a2d6cb4d5a0" + diff --git a/project/.import/suika_dance.wav-a2589f25c0bbea603f68025f28a6ccd3.sample b/project/.import/suika_dance.wav-a2589f25c0bbea603f68025f28a6ccd3.sample new file mode 100644 index 0000000..e8d69f8 Binary files /dev/null and b/project/.import/suika_dance.wav-a2589f25c0bbea603f68025f28a6ccd3.sample differ diff --git a/project/.import/suika_shot.wav-9d1b19619702e06125e0087433a16ec0.md5 b/project/.import/suika_shot.wav-9d1b19619702e06125e0087433a16ec0.md5 new file mode 100644 index 0000000..94d3cad --- /dev/null +++ b/project/.import/suika_shot.wav-9d1b19619702e06125e0087433a16ec0.md5 @@ -0,0 +1,3 @@ +source_md5="82cd0c4e613b626e9fa6198f2f70896c" +dest_md5="a320d388e14dc20fd782aba8078bdae9" + diff --git a/project/.import/suika_shot.wav-9d1b19619702e06125e0087433a16ec0.sample b/project/.import/suika_shot.wav-9d1b19619702e06125e0087433a16ec0.sample new file mode 100644 index 0000000..a5c5442 Binary files /dev/null and b/project/.import/suika_shot.wav-9d1b19619702e06125e0087433a16ec0.sample differ diff --git a/project/.import/suika_story.png-dc10fa0b6cbd8e502eec1d5bfff55a55.md5 b/project/.import/suika_story.png-dc10fa0b6cbd8e502eec1d5bfff55a55.md5 new file mode 100644 index 0000000..0ecb447 --- /dev/null +++ b/project/.import/suika_story.png-dc10fa0b6cbd8e502eec1d5bfff55a55.md5 @@ -0,0 +1,3 @@ +source_md5="a7bad66c3e253118feaebabdaf12c7b0" +dest_md5="3851c4730d00c347a528e8c718f7a768" + diff --git a/project/.import/suika_story.png-dc10fa0b6cbd8e502eec1d5bfff55a55.stex b/project/.import/suika_story.png-dc10fa0b6cbd8e502eec1d5bfff55a55.stex new file mode 100644 index 0000000..21e09cd Binary files /dev/null and b/project/.import/suika_story.png-dc10fa0b6cbd8e502eec1d5bfff55a55.stex differ diff --git a/project/.import/suika_story1.png-a433e87b93469fa7d3990f59c0c48441.md5 b/project/.import/suika_story1.png-a433e87b93469fa7d3990f59c0c48441.md5 new file mode 100644 index 0000000..3c77f59 --- /dev/null +++ b/project/.import/suika_story1.png-a433e87b93469fa7d3990f59c0c48441.md5 @@ -0,0 +1,3 @@ +source_md5="0c582aae28acb31239c75fc9aaad61a5" +dest_md5="592b10d9dbd48aebb1425cc2a6a258bd" + diff --git a/project/.import/suika_story1.png-a433e87b93469fa7d3990f59c0c48441.stex b/project/.import/suika_story1.png-a433e87b93469fa7d3990f59c0c48441.stex new file mode 100644 index 0000000..0e65679 Binary files /dev/null and b/project/.import/suika_story1.png-a433e87b93469fa7d3990f59c0c48441.stex differ diff --git a/project/.import/suika_story2.png-77e4d2500475f0ac9ce72c49f70dbaaf.md5 b/project/.import/suika_story2.png-77e4d2500475f0ac9ce72c49f70dbaaf.md5 new file mode 100644 index 0000000..7195224 --- /dev/null +++ b/project/.import/suika_story2.png-77e4d2500475f0ac9ce72c49f70dbaaf.md5 @@ -0,0 +1,3 @@ +source_md5="8b0312c172b7ac51271242708c3bf973" +dest_md5="984280c0653e9da21b734f7581e6081b" + diff --git a/project/.import/suika_story2.png-77e4d2500475f0ac9ce72c49f70dbaaf.stex b/project/.import/suika_story2.png-77e4d2500475f0ac9ce72c49f70dbaaf.stex new file mode 100644 index 0000000..66fc60f Binary files /dev/null and b/project/.import/suika_story2.png-77e4d2500475f0ac9ce72c49f70dbaaf.stex differ diff --git a/project/.import/suika_story3.png-e42f45bc9ea57c63d7691bd03b2f47be.md5 b/project/.import/suika_story3.png-e42f45bc9ea57c63d7691bd03b2f47be.md5 new file mode 100644 index 0000000..b7d05d9 --- /dev/null +++ b/project/.import/suika_story3.png-e42f45bc9ea57c63d7691bd03b2f47be.md5 @@ -0,0 +1,3 @@ +source_md5="26e862c07c3343eb999d1e67e169c84f" +dest_md5="02db9560e2713f3da3936fca07513ce3" + diff --git a/project/.import/suika_story3.png-e42f45bc9ea57c63d7691bd03b2f47be.stex b/project/.import/suika_story3.png-e42f45bc9ea57c63d7691bd03b2f47be.stex new file mode 100644 index 0000000..d12d604 Binary files /dev/null and b/project/.import/suika_story3.png-e42f45bc9ea57c63d7691bd03b2f47be.stex differ diff --git a/project/.import/suika_story4.png-134221f2082831d21bbf6c1fa0e41f5b.md5 b/project/.import/suika_story4.png-134221f2082831d21bbf6c1fa0e41f5b.md5 new file mode 100644 index 0000000..13d384f --- /dev/null +++ b/project/.import/suika_story4.png-134221f2082831d21bbf6c1fa0e41f5b.md5 @@ -0,0 +1,3 @@ +source_md5="fda62b0c4da0fcc2eccf4308a184ae68" +dest_md5="4162ad32e548578cc680775d42812bc7" + diff --git a/project/.import/suika_story4.png-134221f2082831d21bbf6c1fa0e41f5b.stex b/project/.import/suika_story4.png-134221f2082831d21bbf6c1fa0e41f5b.stex new file mode 100644 index 0000000..df92bd4 Binary files /dev/null and b/project/.import/suika_story4.png-134221f2082831d21bbf6c1fa0e41f5b.stex differ diff --git a/project/.import/suika_story5.png-169395622f4f0469a5cf25547485fb1e.md5 b/project/.import/suika_story5.png-169395622f4f0469a5cf25547485fb1e.md5 new file mode 100644 index 0000000..a8fd2bc --- /dev/null +++ b/project/.import/suika_story5.png-169395622f4f0469a5cf25547485fb1e.md5 @@ -0,0 +1,3 @@ +source_md5="495fce2f0e020e3ee2f30cbf0a5ec5be" +dest_md5="f3920fce20f8728bc9402cba94ed601d" + diff --git a/project/.import/suika_story5.png-169395622f4f0469a5cf25547485fb1e.stex b/project/.import/suika_story5.png-169395622f4f0469a5cf25547485fb1e.stex new file mode 100644 index 0000000..5074675 Binary files /dev/null and b/project/.import/suika_story5.png-169395622f4f0469a5cf25547485fb1e.stex differ diff --git a/project/.import/suika_story6.png-ec6fc63a30a3f247500d2d4de64ec4eb.md5 b/project/.import/suika_story6.png-ec6fc63a30a3f247500d2d4de64ec4eb.md5 new file mode 100644 index 0000000..ddeae95 --- /dev/null +++ b/project/.import/suika_story6.png-ec6fc63a30a3f247500d2d4de64ec4eb.md5 @@ -0,0 +1,3 @@ +source_md5="9ceb04f5cfd140b8c24f3734157afe34" +dest_md5="c63ae92632dd377125fddab659dd47e1" + diff --git a/project/.import/suika_story6.png-ec6fc63a30a3f247500d2d4de64ec4eb.stex b/project/.import/suika_story6.png-ec6fc63a30a3f247500d2d4de64ec4eb.stex new file mode 100644 index 0000000..c9d2c69 Binary files /dev/null and b/project/.import/suika_story6.png-ec6fc63a30a3f247500d2d4de64ec4eb.stex differ diff --git a/project/.import/suikashot.png-c3eb73265d580a26d6e3e1096f188af5.md5 b/project/.import/suikashot.png-c3eb73265d580a26d6e3e1096f188af5.md5 new file mode 100644 index 0000000..0fe452a --- /dev/null +++ b/project/.import/suikashot.png-c3eb73265d580a26d6e3e1096f188af5.md5 @@ -0,0 +1,3 @@ +source_md5="480a114d1cc89497a1333a8d168eb83e" +dest_md5="a728b9750b51da2320f60d13b87f1597" + diff --git a/project/.import/suikashot.png-c3eb73265d580a26d6e3e1096f188af5.stex b/project/.import/suikashot.png-c3eb73265d580a26d6e3e1096f188af5.stex new file mode 100644 index 0000000..4ed98f6 Binary files /dev/null and b/project/.import/suikashot.png-c3eb73265d580a26d6e3e1096f188af5.stex differ diff --git a/project/.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.md5 b/project/.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.md5 new file mode 100644 index 0000000..9c06fe9 --- /dev/null +++ b/project/.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.md5 @@ -0,0 +1,3 @@ +source_md5="69dc0cf3f0e68fcaf3ab2c2f2ba18986" +dest_md5="6ee5dfe589b0bd5da0a7731a37f9f2b5" + diff --git a/project/.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.stex b/project/.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.stex new file mode 100644 index 0000000..228067d Binary files /dev/null and b/project/.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.stex differ diff --git a/project/.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.md5 b/project/.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.md5 new file mode 100644 index 0000000..88f5f59 --- /dev/null +++ b/project/.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.md5 @@ -0,0 +1,3 @@ +source_md5="888e3ecfc02acf701603dcde37ca11da" +dest_md5="fe966c3d979fc14d41ff0ad35b9d4eec" + diff --git a/project/.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.stex b/project/.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.stex new file mode 100644 index 0000000..b2aa296 Binary files /dev/null and b/project/.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.stex differ diff --git a/project/.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.md5 b/project/.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.md5 new file mode 100644 index 0000000..d6c8149 --- /dev/null +++ b/project/.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.md5 @@ -0,0 +1,3 @@ +source_md5="aa066c0a1a36ee790c1a0e9c6877cfd7" +dest_md5="ba94717afca44974b70801bd174373cf" + diff --git a/project/.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.stex b/project/.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.stex new file mode 100644 index 0000000..1ded6e4 Binary files /dev/null and b/project/.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.stex differ diff --git a/project/.import/textbox.png-348d67b429a5e2e7d9e59c880794e6e9.md5 b/project/.import/textbox.png-348d67b429a5e2e7d9e59c880794e6e9.md5 new file mode 100644 index 0000000..9b5e064 --- /dev/null +++ b/project/.import/textbox.png-348d67b429a5e2e7d9e59c880794e6e9.md5 @@ -0,0 +1,3 @@ +source_md5="52744708cf0dbfdd1e92fd4b6b0949cb" +dest_md5="e2598af06d87bd110f4ec61bf57cdeb8" + diff --git a/project/.import/textbox.png-348d67b429a5e2e7d9e59c880794e6e9.stex b/project/.import/textbox.png-348d67b429a5e2e7d9e59c880794e6e9.stex new file mode 100644 index 0000000..68b55f5 Binary files /dev/null and b/project/.import/textbox.png-348d67b429a5e2e7d9e59c880794e6e9.stex differ diff --git a/project/.import/textbox_sad.png-ea8cbeac87c8f2612a91ed9c8b7653ac.md5 b/project/.import/textbox_sad.png-ea8cbeac87c8f2612a91ed9c8b7653ac.md5 new file mode 100644 index 0000000..4ba8349 --- /dev/null +++ b/project/.import/textbox_sad.png-ea8cbeac87c8f2612a91ed9c8b7653ac.md5 @@ -0,0 +1,3 @@ +source_md5="1acc1566729f3ffb0efd1f842bfbd582" +dest_md5="4517387b683ff90760cf67b094080689" + diff --git a/project/.import/textbox_sad.png-ea8cbeac87c8f2612a91ed9c8b7653ac.stex b/project/.import/textbox_sad.png-ea8cbeac87c8f2612a91ed9c8b7653ac.stex new file mode 100644 index 0000000..cd5edad Binary files /dev/null and b/project/.import/textbox_sad.png-ea8cbeac87c8f2612a91ed9c8b7653ac.stex differ diff --git a/project/.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.md5 b/project/.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.md5 new file mode 100644 index 0000000..60e2d44 --- /dev/null +++ b/project/.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.md5 @@ -0,0 +1,3 @@ +source_md5="6e274151d2df86b99bf51bd5ee784a79" +dest_md5="fca3c430e6948da00791498e4bb0edf2" + diff --git a/project/.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.stex b/project/.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.stex new file mode 100644 index 0000000..aa703fc Binary files /dev/null and b/project/.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.stex differ diff --git a/project/.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.md5 b/project/.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.md5 new file mode 100644 index 0000000..5860cf9 --- /dev/null +++ b/project/.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.md5 @@ -0,0 +1,3 @@ +source_md5="7fc5aca043cd1984f1b93fee00b5658b" +dest_md5="c9a5f9fc02a892bcc23c3d4bda7f43ee" + diff --git a/project/.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.stex b/project/.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.stex new file mode 100644 index 0000000..79b1ec8 Binary files /dev/null and b/project/.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.stex differ diff --git a/project/.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.md5 b/project/.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.md5 new file mode 100644 index 0000000..45118bc --- /dev/null +++ b/project/.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.md5 @@ -0,0 +1,3 @@ +source_md5="cff0a93474ae3e6900730d0d0715043d" +dest_md5="37b5ef130d358a455d1633f39c3f3057" + diff --git a/project/.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.stex b/project/.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.stex new file mode 100644 index 0000000..096c173 Binary files /dev/null and b/project/.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.stex differ diff --git a/project/.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.md5 b/project/.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.md5 new file mode 100644 index 0000000..a1b47c1 --- /dev/null +++ b/project/.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.md5 @@ -0,0 +1,3 @@ +source_md5="46818e8fa995c4ba22af21645b85a9c7" +dest_md5="f642314e414acd298210be25fd5e3841" + diff --git a/project/.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.stex b/project/.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.stex new file mode 100644 index 0000000..b16f6b5 Binary files /dev/null and b/project/.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.stex differ diff --git a/project/.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.md5 b/project/.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.md5 new file mode 100644 index 0000000..dae80dc --- /dev/null +++ b/project/.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.md5 @@ -0,0 +1,3 @@ +source_md5="ae38ab73154e725b6c99efdc1f99f46b" +dest_md5="c5c1007c529608d30d0eeddb91316a8f" + diff --git a/project/.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.stex b/project/.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.stex new file mode 100644 index 0000000..1fad9c3 Binary files /dev/null and b/project/.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.stex differ diff --git a/project/.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.md5 b/project/.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.md5 new file mode 100644 index 0000000..9959de3 --- /dev/null +++ b/project/.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.md5 @@ -0,0 +1,3 @@ +source_md5="4492cf01b3f5280be99bae59a6b4d7ae" +dest_md5="057086d5f20419132a6c8c1894c3523f" + diff --git a/project/.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.stex b/project/.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.stex new file mode 100644 index 0000000..9f0cfa3 Binary files /dev/null and b/project/.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.stex differ diff --git a/project/.import/title.png-815acd504df53b4e1e2d1ca96e6e2235.md5 b/project/.import/title.png-815acd504df53b4e1e2d1ca96e6e2235.md5 new file mode 100644 index 0000000..e499151 --- /dev/null +++ b/project/.import/title.png-815acd504df53b4e1e2d1ca96e6e2235.md5 @@ -0,0 +1,3 @@ +source_md5="32ba4cb0621b9a02e259023ee9e637bc" +dest_md5="30f4a08506c09748f665b9faf8b72ee4" + diff --git a/project/.import/title.png-815acd504df53b4e1e2d1ca96e6e2235.stex b/project/.import/title.png-815acd504df53b4e1e2d1ca96e6e2235.stex new file mode 100644 index 0000000..308a7f1 Binary files /dev/null and b/project/.import/title.png-815acd504df53b4e1e2d1ca96e6e2235.stex differ diff --git a/project/.import/title_end.png-477e0490606f23a84eac355618738c45.md5 b/project/.import/title_end.png-477e0490606f23a84eac355618738c45.md5 new file mode 100644 index 0000000..92725d7 --- /dev/null +++ b/project/.import/title_end.png-477e0490606f23a84eac355618738c45.md5 @@ -0,0 +1,3 @@ +source_md5="1eb2b26db3d7f1d149fbd6d62a0970a5" +dest_md5="fa69011244026ffc5e0402f6c1bf719c" + diff --git a/project/.import/title_end.png-477e0490606f23a84eac355618738c45.stex b/project/.import/title_end.png-477e0490606f23a84eac355618738c45.stex new file mode 100644 index 0000000..a5d046e Binary files /dev/null and b/project/.import/title_end.png-477e0490606f23a84eac355618738c45.stex differ diff --git a/project/.import/title_itch.png-8e7b3d79efc2a5000de8f0a2bcd320c4.md5 b/project/.import/title_itch.png-8e7b3d79efc2a5000de8f0a2bcd320c4.md5 new file mode 100644 index 0000000..544e00c --- /dev/null +++ b/project/.import/title_itch.png-8e7b3d79efc2a5000de8f0a2bcd320c4.md5 @@ -0,0 +1,3 @@ +source_md5="3bb670e53d95137bbf077b4ce5d2ef9d" +dest_md5="9cd14f9de02c0cdda57db40163261449" + diff --git a/project/.import/title_itch.png-8e7b3d79efc2a5000de8f0a2bcd320c4.stex b/project/.import/title_itch.png-8e7b3d79efc2a5000de8f0a2bcd320c4.stex new file mode 100644 index 0000000..d76d711 Binary files /dev/null and b/project/.import/title_itch.png-8e7b3d79efc2a5000de8f0a2bcd320c4.stex differ diff --git a/project/.import/title_itch.png-d768407623c00c443c3c344c40c93d33.md5 b/project/.import/title_itch.png-d768407623c00c443c3c344c40c93d33.md5 new file mode 100644 index 0000000..544e00c --- /dev/null +++ b/project/.import/title_itch.png-d768407623c00c443c3c344c40c93d33.md5 @@ -0,0 +1,3 @@ +source_md5="3bb670e53d95137bbf077b4ce5d2ef9d" +dest_md5="9cd14f9de02c0cdda57db40163261449" + diff --git a/project/.import/title_itch.png-d768407623c00c443c3c344c40c93d33.stex b/project/.import/title_itch.png-d768407623c00c443c3c344c40c93d33.stex new file mode 100644 index 0000000..d76d711 Binary files /dev/null and b/project/.import/title_itch.png-d768407623c00c443c3c344c40c93d33.stex differ diff --git a/project/.import/titlescreen.ogg-0c5ceadc95c6d2c34da9811b12ba3b81.md5 b/project/.import/titlescreen.ogg-0c5ceadc95c6d2c34da9811b12ba3b81.md5 new file mode 100644 index 0000000..44bcb0c --- /dev/null +++ b/project/.import/titlescreen.ogg-0c5ceadc95c6d2c34da9811b12ba3b81.md5 @@ -0,0 +1,3 @@ +source_md5="a27d55b698778ab287c18a28eec788e6" +dest_md5="f65826c10b5b7b9804641e5b3fa509ae" + diff --git a/project/.import/titlescreen.ogg-0c5ceadc95c6d2c34da9811b12ba3b81.oggstr b/project/.import/titlescreen.ogg-0c5ceadc95c6d2c34da9811b12ba3b81.oggstr new file mode 100644 index 0000000..292fe5f Binary files /dev/null and b/project/.import/titlescreen.ogg-0c5ceadc95c6d2c34da9811b12ba3b81.oggstr differ diff --git a/project/.import/true_end1.png-6c546ddaafc7997d10a6a28645da2900.md5 b/project/.import/true_end1.png-6c546ddaafc7997d10a6a28645da2900.md5 new file mode 100644 index 0000000..ec2c893 --- /dev/null +++ b/project/.import/true_end1.png-6c546ddaafc7997d10a6a28645da2900.md5 @@ -0,0 +1,3 @@ +source_md5="e85e1ba78cdd8653fa8dc82a8972dcb5" +dest_md5="4fa5af848f1dd2d49198fc61d66d40da" + diff --git a/project/.import/true_end1.png-6c546ddaafc7997d10a6a28645da2900.stex b/project/.import/true_end1.png-6c546ddaafc7997d10a6a28645da2900.stex new file mode 100644 index 0000000..32413b5 Binary files /dev/null and b/project/.import/true_end1.png-6c546ddaafc7997d10a6a28645da2900.stex differ diff --git a/project/.import/true_end2.png-6bb656dcaa2a577e9858884bd36829ee.md5 b/project/.import/true_end2.png-6bb656dcaa2a577e9858884bd36829ee.md5 new file mode 100644 index 0000000..e0bd85d --- /dev/null +++ b/project/.import/true_end2.png-6bb656dcaa2a577e9858884bd36829ee.md5 @@ -0,0 +1,3 @@ +source_md5="29a45ab1510efa12ed8e9ff389ba3f27" +dest_md5="484dd7a0a96997fd0a84da43c7f1ecfc" + diff --git a/project/.import/true_end2.png-6bb656dcaa2a577e9858884bd36829ee.stex b/project/.import/true_end2.png-6bb656dcaa2a577e9858884bd36829ee.stex new file mode 100644 index 0000000..db7874d Binary files /dev/null and b/project/.import/true_end2.png-6bb656dcaa2a577e9858884bd36829ee.stex differ diff --git a/project/.import/true_end3.png-d1a2678d2237560b9ebec8555abd7220.md5 b/project/.import/true_end3.png-d1a2678d2237560b9ebec8555abd7220.md5 new file mode 100644 index 0000000..3431bd0 --- /dev/null +++ b/project/.import/true_end3.png-d1a2678d2237560b9ebec8555abd7220.md5 @@ -0,0 +1,3 @@ +source_md5="0109f06cf0909c012cb1beed7e130c6e" +dest_md5="35d05ad9f3d17e876557f2b331ca5964" + diff --git a/project/.import/true_end3.png-d1a2678d2237560b9ebec8555abd7220.stex b/project/.import/true_end3.png-d1a2678d2237560b9ebec8555abd7220.stex new file mode 100644 index 0000000..d3be49a Binary files /dev/null and b/project/.import/true_end3.png-d1a2678d2237560b9ebec8555abd7220.stex differ diff --git a/project/.import/true_end4.png-742e0042f7fd801c5f3ac1f5c41a4a5c.md5 b/project/.import/true_end4.png-742e0042f7fd801c5f3ac1f5c41a4a5c.md5 new file mode 100644 index 0000000..bfa3555 --- /dev/null +++ b/project/.import/true_end4.png-742e0042f7fd801c5f3ac1f5c41a4a5c.md5 @@ -0,0 +1,3 @@ +source_md5="77b8cb528b9cbb1850eb4384f0823d0e" +dest_md5="1167b965bf722d18c3a51b83b74440fd" + diff --git a/project/.import/true_end4.png-742e0042f7fd801c5f3ac1f5c41a4a5c.stex b/project/.import/true_end4.png-742e0042f7fd801c5f3ac1f5c41a4a5c.stex new file mode 100644 index 0000000..57d60e9 Binary files /dev/null and b/project/.import/true_end4.png-742e0042f7fd801c5f3ac1f5c41a4a5c.stex differ diff --git a/project/.import/true_end5.png-623e19abe9a337317016d7034c7f8ac4.md5 b/project/.import/true_end5.png-623e19abe9a337317016d7034c7f8ac4.md5 new file mode 100644 index 0000000..51ef889 --- /dev/null +++ b/project/.import/true_end5.png-623e19abe9a337317016d7034c7f8ac4.md5 @@ -0,0 +1,3 @@ +source_md5="8210a89ed9cd83c93e3614a4deade1b9" +dest_md5="2fc9fbde6fca37d042af7209fb97151b" + diff --git a/project/.import/true_end5.png-623e19abe9a337317016d7034c7f8ac4.stex b/project/.import/true_end5.png-623e19abe9a337317016d7034c7f8ac4.stex new file mode 100644 index 0000000..33a7973 Binary files /dev/null and b/project/.import/true_end5.png-623e19abe9a337317016d7034c7f8ac4.stex differ diff --git a/project/.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.md5 b/project/.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.md5 new file mode 100644 index 0000000..eeb6484 --- /dev/null +++ b/project/.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.md5 @@ -0,0 +1,3 @@ +source_md5="719a41301aa9e1e6033ff143934d423e" +dest_md5="77aaaa7045b8cfcec7a2f9c6bcacfda8" + diff --git a/project/.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.sample b/project/.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.sample new file mode 100644 index 0000000..bcbe59b Binary files /dev/null and b/project/.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.sample differ diff --git a/project/.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.md5 b/project/.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.md5 new file mode 100644 index 0000000..fb0a25a --- /dev/null +++ b/project/.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.md5 @@ -0,0 +1,3 @@ +source_md5="0a463a911244d75d3c16db02a45860bd" +dest_md5="cbedf8a0523dafa95d4cfa63db00d8ae" + diff --git a/project/.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.sample b/project/.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.sample new file mode 100644 index 0000000..636090b Binary files /dev/null and b/project/.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.sample differ diff --git a/project/.import/typing3.wav-c205224330b70994289dbb4ca48b4277.md5 b/project/.import/typing3.wav-c205224330b70994289dbb4ca48b4277.md5 new file mode 100644 index 0000000..cd33737 --- /dev/null +++ b/project/.import/typing3.wav-c205224330b70994289dbb4ca48b4277.md5 @@ -0,0 +1,3 @@ +source_md5="2687fbfff95b77b99cdd8b944a21fb19" +dest_md5="15c4f44a19fd585b65494374fcf55935" + diff --git a/project/.import/typing3.wav-c205224330b70994289dbb4ca48b4277.sample b/project/.import/typing3.wav-c205224330b70994289dbb4ca48b4277.sample new file mode 100644 index 0000000..c1ef5d3 Binary files /dev/null and b/project/.import/typing3.wav-c205224330b70994289dbb4ca48b4277.sample differ diff --git a/project/.import/typing4.wav-c0772ca318969a007c12c2d606458087.md5 b/project/.import/typing4.wav-c0772ca318969a007c12c2d606458087.md5 new file mode 100644 index 0000000..1de89cc --- /dev/null +++ b/project/.import/typing4.wav-c0772ca318969a007c12c2d606458087.md5 @@ -0,0 +1,3 @@ +source_md5="6c0e2ddca4f09eb5e81a3f3989dbea3c" +dest_md5="dc996d487b1e3d3664d3ee0d4b09b18b" + diff --git a/project/.import/typing4.wav-c0772ca318969a007c12c2d606458087.sample b/project/.import/typing4.wav-c0772ca318969a007c12c2d606458087.sample new file mode 100644 index 0000000..97c293a Binary files /dev/null and b/project/.import/typing4.wav-c0772ca318969a007c12c2d606458087.sample differ diff --git a/project/.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.md5 b/project/.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.md5 new file mode 100644 index 0000000..5778eb7 --- /dev/null +++ b/project/.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.md5 @@ -0,0 +1,3 @@ +source_md5="85f3dde13fb91bf8bfa177b3c36fe5c5" +dest_md5="4b90c96aee93ba01e272a5e1c87782d7" + diff --git a/project/.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.sample b/project/.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.sample new file mode 100644 index 0000000..822b930 Binary files /dev/null and b/project/.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.sample differ diff --git a/project/.import/ui_choose.wav-5f121220e00536a106a23a3295478978.md5 b/project/.import/ui_choose.wav-5f121220e00536a106a23a3295478978.md5 new file mode 100644 index 0000000..c9ac78b --- /dev/null +++ b/project/.import/ui_choose.wav-5f121220e00536a106a23a3295478978.md5 @@ -0,0 +1,3 @@ +source_md5="0e0456d5f6944d5b7f397cb347d53e67" +dest_md5="a32342edb4e414331348c880841e0c20" + diff --git a/project/.import/ui_choose.wav-5f121220e00536a106a23a3295478978.sample b/project/.import/ui_choose.wav-5f121220e00536a106a23a3295478978.sample new file mode 100644 index 0000000..6150996 Binary files /dev/null and b/project/.import/ui_choose.wav-5f121220e00536a106a23a3295478978.sample differ diff --git a/project/.import/unknown.png-0ee1b9ae8666f3c10d69fa6280107799.md5 b/project/.import/unknown.png-0ee1b9ae8666f3c10d69fa6280107799.md5 new file mode 100644 index 0000000..5ca6a4e --- /dev/null +++ b/project/.import/unknown.png-0ee1b9ae8666f3c10d69fa6280107799.md5 @@ -0,0 +1,3 @@ +source_md5="dd551ee391e8dd04ef1ae464cb8c04f5" +dest_md5="6a03fec90d27696def58b80b20934638" + diff --git a/project/.import/unknown.png-0ee1b9ae8666f3c10d69fa6280107799.stex b/project/.import/unknown.png-0ee1b9ae8666f3c10d69fa6280107799.stex new file mode 100644 index 0000000..27321f4 Binary files /dev/null and b/project/.import/unknown.png-0ee1b9ae8666f3c10d69fa6280107799.stex differ diff --git a/project/.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.md5 b/project/.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.md5 new file mode 100644 index 0000000..1471414 --- /dev/null +++ b/project/.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.md5 @@ -0,0 +1,3 @@ +source_md5="a075988c55dfa06cefa55bedd3024fa1" +dest_md5="784c35c8c362255b6f438afb5cfee020" + diff --git a/project/.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.stex b/project/.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.stex new file mode 100644 index 0000000..99c710c Binary files /dev/null and b/project/.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.stex differ diff --git a/project/.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.md5 b/project/.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.md5 new file mode 100644 index 0000000..d79ffd1 --- /dev/null +++ b/project/.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.md5 @@ -0,0 +1,3 @@ +source_md5="84ff184ed462aff07ec0e968459c3742" +dest_md5="dc771171edbe1cc7375ea1682c80465b" + diff --git a/project/.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.stex b/project/.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.stex new file mode 100644 index 0000000..90b73e4 Binary files /dev/null and b/project/.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.stex differ diff --git a/project/.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.md5 b/project/.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.md5 new file mode 100644 index 0000000..e63f04e --- /dev/null +++ b/project/.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.md5 @@ -0,0 +1,3 @@ +source_md5="fd8bde8465b29f1107e9406447d332d8" +dest_md5="b1a89108e61701a7f3fb1c5902f1622f" + diff --git a/project/.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.stex b/project/.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.stex new file mode 100644 index 0000000..bae6556 Binary files /dev/null and b/project/.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.stex differ diff --git a/project/.import/youmu.png-fe09bf18ff2c377d60f43c5f60bccebf.md5 b/project/.import/youmu.png-fe09bf18ff2c377d60f43c5f60bccebf.md5 new file mode 100644 index 0000000..815f389 --- /dev/null +++ b/project/.import/youmu.png-fe09bf18ff2c377d60f43c5f60bccebf.md5 @@ -0,0 +1,3 @@ +source_md5="1dd2f3710ce6819613f212b2d132d963" +dest_md5="d401afd50988469e285416e4534b1e89" + diff --git a/project/.import/youmu.png-fe09bf18ff2c377d60f43c5f60bccebf.stex b/project/.import/youmu.png-fe09bf18ff2c377d60f43c5f60bccebf.stex new file mode 100644 index 0000000..01ae3f5 Binary files /dev/null and b/project/.import/youmu.png-fe09bf18ff2c377d60f43c5f60bccebf.stex differ diff --git a/project/.import/youmu_end1.png-bdfd454eb13eb2b57ec66519eae8f86a.md5 b/project/.import/youmu_end1.png-bdfd454eb13eb2b57ec66519eae8f86a.md5 new file mode 100644 index 0000000..d9a8049 --- /dev/null +++ b/project/.import/youmu_end1.png-bdfd454eb13eb2b57ec66519eae8f86a.md5 @@ -0,0 +1,3 @@ +source_md5="7ced9790533f275394f9d2efc062b34c" +dest_md5="1dab810366ea304d7792f3614a4d9db5" + diff --git a/project/.import/youmu_end1.png-bdfd454eb13eb2b57ec66519eae8f86a.stex b/project/.import/youmu_end1.png-bdfd454eb13eb2b57ec66519eae8f86a.stex new file mode 100644 index 0000000..2acde55 Binary files /dev/null and b/project/.import/youmu_end1.png-bdfd454eb13eb2b57ec66519eae8f86a.stex differ diff --git a/project/.import/youmu_end2.png-5c99dd640978ec63b6b42eb366f8dda5.md5 b/project/.import/youmu_end2.png-5c99dd640978ec63b6b42eb366f8dda5.md5 new file mode 100644 index 0000000..80d713c --- /dev/null +++ b/project/.import/youmu_end2.png-5c99dd640978ec63b6b42eb366f8dda5.md5 @@ -0,0 +1,3 @@ +source_md5="cef9471334de8777feb23ee1dd503bbe" +dest_md5="d6fe063f22e2e040b9a2f148f3cb2753" + diff --git a/project/.import/youmu_end2.png-5c99dd640978ec63b6b42eb366f8dda5.stex b/project/.import/youmu_end2.png-5c99dd640978ec63b6b42eb366f8dda5.stex new file mode 100644 index 0000000..1697afe Binary files /dev/null and b/project/.import/youmu_end2.png-5c99dd640978ec63b6b42eb366f8dda5.stex differ diff --git a/project/.import/youmu_end3.png-2e062dbd14cefd1a8c4de5ec8b74859f.md5 b/project/.import/youmu_end3.png-2e062dbd14cefd1a8c4de5ec8b74859f.md5 new file mode 100644 index 0000000..5268132 --- /dev/null +++ b/project/.import/youmu_end3.png-2e062dbd14cefd1a8c4de5ec8b74859f.md5 @@ -0,0 +1,3 @@ +source_md5="b21515920bc74c88dc631fc12203d190" +dest_md5="850c5bc8f80224023dfb7cc0bee0fe47" + diff --git a/project/.import/youmu_end3.png-2e062dbd14cefd1a8c4de5ec8b74859f.stex b/project/.import/youmu_end3.png-2e062dbd14cefd1a8c4de5ec8b74859f.stex new file mode 100644 index 0000000..f940583 Binary files /dev/null and b/project/.import/youmu_end3.png-2e062dbd14cefd1a8c4de5ec8b74859f.stex differ diff --git a/project/.import/youmu_end4.png-a701850876cd687888b9c119c3cf5052.md5 b/project/.import/youmu_end4.png-a701850876cd687888b9c119c3cf5052.md5 new file mode 100644 index 0000000..793c53d --- /dev/null +++ b/project/.import/youmu_end4.png-a701850876cd687888b9c119c3cf5052.md5 @@ -0,0 +1,3 @@ +source_md5="e3cc263eeda94f1c70ca881d5bd61ff7" +dest_md5="820bdd70839dd28783307c7bffcb9ffb" + diff --git a/project/.import/youmu_end4.png-a701850876cd687888b9c119c3cf5052.stex b/project/.import/youmu_end4.png-a701850876cd687888b9c119c3cf5052.stex new file mode 100644 index 0000000..77c20e5 Binary files /dev/null and b/project/.import/youmu_end4.png-a701850876cd687888b9c119c3cf5052.stex differ diff --git a/project/.import/youmu_end5.png-85eb519544c37a9bed42d8ead4775d95.md5 b/project/.import/youmu_end5.png-85eb519544c37a9bed42d8ead4775d95.md5 new file mode 100644 index 0000000..3de1c28 --- /dev/null +++ b/project/.import/youmu_end5.png-85eb519544c37a9bed42d8ead4775d95.md5 @@ -0,0 +1,3 @@ +source_md5="d320cfc66a6f2786861b21f4d3cdfbca" +dest_md5="eceb7e68dd1528f9c48a0f22f035407b" + diff --git a/project/.import/youmu_end5.png-85eb519544c37a9bed42d8ead4775d95.stex b/project/.import/youmu_end5.png-85eb519544c37a9bed42d8ead4775d95.stex new file mode 100644 index 0000000..3d64967 Binary files /dev/null and b/project/.import/youmu_end5.png-85eb519544c37a9bed42d8ead4775d95.stex differ diff --git a/project/.import/youmu_first.ogg-73e85a19b034f5cb65a6387d4591fd8e.md5 b/project/.import/youmu_first.ogg-73e85a19b034f5cb65a6387d4591fd8e.md5 new file mode 100644 index 0000000..3486443 --- /dev/null +++ b/project/.import/youmu_first.ogg-73e85a19b034f5cb65a6387d4591fd8e.md5 @@ -0,0 +1,3 @@ +source_md5="87396ee913760b56fe8c97ce08bacee0" +dest_md5="fcaf041be40a602aa2982a720b71ad54" + diff --git a/project/.import/youmu_first.ogg-73e85a19b034f5cb65a6387d4591fd8e.oggstr b/project/.import/youmu_first.ogg-73e85a19b034f5cb65a6387d4591fd8e.oggstr new file mode 100644 index 0000000..7706021 Binary files /dev/null and b/project/.import/youmu_first.ogg-73e85a19b034f5cb65a6387d4591fd8e.oggstr differ diff --git a/project/.import/youmu_loop.ogg-e9efb03c475e88d1516ef2d03a1dfd06.md5 b/project/.import/youmu_loop.ogg-e9efb03c475e88d1516ef2d03a1dfd06.md5 new file mode 100644 index 0000000..59c750c --- /dev/null +++ b/project/.import/youmu_loop.ogg-e9efb03c475e88d1516ef2d03a1dfd06.md5 @@ -0,0 +1,3 @@ +source_md5="0389ffacf2e9b5254e43cc094064f6fd" +dest_md5="79bdce8766e74f4b24412789ad54e0f8" + diff --git a/project/.import/youmu_loop.ogg-e9efb03c475e88d1516ef2d03a1dfd06.oggstr b/project/.import/youmu_loop.ogg-e9efb03c475e88d1516ef2d03a1dfd06.oggstr new file mode 100644 index 0000000..c168fe4 Binary files /dev/null and b/project/.import/youmu_loop.ogg-e9efb03c475e88d1516ef2d03a1dfd06.oggstr differ diff --git a/project/.import/youmu_story1.png-41269cf2e3b3e9cd4b17427118816c2c.md5 b/project/.import/youmu_story1.png-41269cf2e3b3e9cd4b17427118816c2c.md5 new file mode 100644 index 0000000..549265d --- /dev/null +++ b/project/.import/youmu_story1.png-41269cf2e3b3e9cd4b17427118816c2c.md5 @@ -0,0 +1,3 @@ +source_md5="9f3fbe9bd46558ca1b15e8a3e4aaa88c" +dest_md5="be602440c195922e79712d6402493a1c" + diff --git a/project/.import/youmu_story1.png-41269cf2e3b3e9cd4b17427118816c2c.stex b/project/.import/youmu_story1.png-41269cf2e3b3e9cd4b17427118816c2c.stex new file mode 100644 index 0000000..72994a6 Binary files /dev/null and b/project/.import/youmu_story1.png-41269cf2e3b3e9cd4b17427118816c2c.stex differ diff --git a/project/.import/youmu_story2.png-1fc093d5653d14a4a6ff1e7a7a0129d5.md5 b/project/.import/youmu_story2.png-1fc093d5653d14a4a6ff1e7a7a0129d5.md5 new file mode 100644 index 0000000..4653679 --- /dev/null +++ b/project/.import/youmu_story2.png-1fc093d5653d14a4a6ff1e7a7a0129d5.md5 @@ -0,0 +1,3 @@ +source_md5="30f770b967fd2cfb7415c6fcfd5122bd" +dest_md5="16b36d60cf79118a2d17fbeaef4593a3" + diff --git a/project/.import/youmu_story2.png-1fc093d5653d14a4a6ff1e7a7a0129d5.stex b/project/.import/youmu_story2.png-1fc093d5653d14a4a6ff1e7a7a0129d5.stex new file mode 100644 index 0000000..c05be1c Binary files /dev/null and b/project/.import/youmu_story2.png-1fc093d5653d14a4a6ff1e7a7a0129d5.stex differ diff --git a/project/.import/youmu_story3.png-5706b85df603951c7718ae83e84ce04c.md5 b/project/.import/youmu_story3.png-5706b85df603951c7718ae83e84ce04c.md5 new file mode 100644 index 0000000..280da84 --- /dev/null +++ b/project/.import/youmu_story3.png-5706b85df603951c7718ae83e84ce04c.md5 @@ -0,0 +1,3 @@ +source_md5="27a3a22c27123589ccba6e86c130eb11" +dest_md5="b43675e8fafacfda09b1190f65439171" + diff --git a/project/.import/youmu_story3.png-5706b85df603951c7718ae83e84ce04c.stex b/project/.import/youmu_story3.png-5706b85df603951c7718ae83e84ce04c.stex new file mode 100644 index 0000000..23ffd95 Binary files /dev/null and b/project/.import/youmu_story3.png-5706b85df603951c7718ae83e84ce04c.stex differ diff --git a/project/.import/youmu_story4.png-c47b8416e09c267115a18ca80be682a8.md5 b/project/.import/youmu_story4.png-c47b8416e09c267115a18ca80be682a8.md5 new file mode 100644 index 0000000..75a527f --- /dev/null +++ b/project/.import/youmu_story4.png-c47b8416e09c267115a18ca80be682a8.md5 @@ -0,0 +1,3 @@ +source_md5="a37239783a529fb8ec170bd792b98f33" +dest_md5="ad7f544bfe636e1103dcb49422b8f192" + diff --git a/project/.import/youmu_story4.png-c47b8416e09c267115a18ca80be682a8.stex b/project/.import/youmu_story4.png-c47b8416e09c267115a18ca80be682a8.stex new file mode 100644 index 0000000..b40e439 Binary files /dev/null and b/project/.import/youmu_story4.png-c47b8416e09c267115a18ca80be682a8.stex differ diff --git a/project/.import/youmu_story5.png-211d81645e586a257ca0ff5c5c8d5039.md5 b/project/.import/youmu_story5.png-211d81645e586a257ca0ff5c5c8d5039.md5 new file mode 100644 index 0000000..0b3b5f6 --- /dev/null +++ b/project/.import/youmu_story5.png-211d81645e586a257ca0ff5c5c8d5039.md5 @@ -0,0 +1,3 @@ +source_md5="156ded61cb30b31a199876575e900cd9" +dest_md5="cceaab7e1910ec405b247f67a9848655" + diff --git a/project/.import/youmu_story5.png-211d81645e586a257ca0ff5c5c8d5039.stex b/project/.import/youmu_story5.png-211d81645e586a257ca0ff5c5c8d5039.stex new file mode 100644 index 0000000..8c6e53d Binary files /dev/null and b/project/.import/youmu_story5.png-211d81645e586a257ca0ff5c5c8d5039.stex differ diff --git a/project/.import/yukari.png-37253bbf503b7e6be5af05899bcb7994.md5 b/project/.import/yukari.png-37253bbf503b7e6be5af05899bcb7994.md5 new file mode 100644 index 0000000..5a07d37 --- /dev/null +++ b/project/.import/yukari.png-37253bbf503b7e6be5af05899bcb7994.md5 @@ -0,0 +1,3 @@ +source_md5="fb30a0ffdbed213e4a8d915e6a19f0a9" +dest_md5="6ea09ae566ab01e2ce1a2d383df9c497" + diff --git a/project/.import/yukari.png-37253bbf503b7e6be5af05899bcb7994.stex b/project/.import/yukari.png-37253bbf503b7e6be5af05899bcb7994.stex new file mode 100644 index 0000000..c511650 Binary files /dev/null and b/project/.import/yukari.png-37253bbf503b7e6be5af05899bcb7994.stex differ diff --git a/project/.import/yukari_story1.png-50b07a28c5754380ce8a7505029bf285.md5 b/project/.import/yukari_story1.png-50b07a28c5754380ce8a7505029bf285.md5 new file mode 100644 index 0000000..9f7fbad --- /dev/null +++ b/project/.import/yukari_story1.png-50b07a28c5754380ce8a7505029bf285.md5 @@ -0,0 +1,3 @@ +source_md5="70ea03f2d8de8661fd81ab9a2b1202ab" +dest_md5="ce5c1f76ac83b016d3fd5c7fa98c9607" + diff --git a/project/.import/yukari_story1.png-50b07a28c5754380ce8a7505029bf285.stex b/project/.import/yukari_story1.png-50b07a28c5754380ce8a7505029bf285.stex new file mode 100644 index 0000000..5f7b871 Binary files /dev/null and b/project/.import/yukari_story1.png-50b07a28c5754380ce8a7505029bf285.stex differ diff --git a/project/.import/yukari_story2.png-8cfa4978f31aa982411c9716b0e5cb7a.md5 b/project/.import/yukari_story2.png-8cfa4978f31aa982411c9716b0e5cb7a.md5 new file mode 100644 index 0000000..c48f631 --- /dev/null +++ b/project/.import/yukari_story2.png-8cfa4978f31aa982411c9716b0e5cb7a.md5 @@ -0,0 +1,3 @@ +source_md5="dfbaa7114ba3ebf76f3f7eb5b5c5666d" +dest_md5="6ae0eae2f0ad9be78855e2846d00bc73" + diff --git a/project/.import/yukari_story2.png-8cfa4978f31aa982411c9716b0e5cb7a.stex b/project/.import/yukari_story2.png-8cfa4978f31aa982411c9716b0e5cb7a.stex new file mode 100644 index 0000000..1dc3e2e Binary files /dev/null and b/project/.import/yukari_story2.png-8cfa4978f31aa982411c9716b0e5cb7a.stex differ diff --git a/project/.import/yukari_story3.png-68fe8c92b3e17207fc0ae9563abb4237.md5 b/project/.import/yukari_story3.png-68fe8c92b3e17207fc0ae9563abb4237.md5 new file mode 100644 index 0000000..ca3bedd --- /dev/null +++ b/project/.import/yukari_story3.png-68fe8c92b3e17207fc0ae9563abb4237.md5 @@ -0,0 +1,3 @@ +source_md5="0656f5f76d66819c8b5db119ee5b5ba4" +dest_md5="4430684d4a0445196c3da76d4004d122" + diff --git a/project/.import/yukari_story3.png-68fe8c92b3e17207fc0ae9563abb4237.stex b/project/.import/yukari_story3.png-68fe8c92b3e17207fc0ae9563abb4237.stex new file mode 100644 index 0000000..bdbf990 Binary files /dev/null and b/project/.import/yukari_story3.png-68fe8c92b3e17207fc0ae9563abb4237.stex differ diff --git a/project/.import/yukari_story4.png-1affb8c4a434f3811e2f4d18c81ad648.md5 b/project/.import/yukari_story4.png-1affb8c4a434f3811e2f4d18c81ad648.md5 new file mode 100644 index 0000000..57ae96a --- /dev/null +++ b/project/.import/yukari_story4.png-1affb8c4a434f3811e2f4d18c81ad648.md5 @@ -0,0 +1,3 @@ +source_md5="9139c4791a8f98a469d278cb0bade09e" +dest_md5="43556be1da9b1428e3fdaf4e132f452c" + diff --git a/project/.import/yukari_story4.png-1affb8c4a434f3811e2f4d18c81ad648.stex b/project/.import/yukari_story4.png-1affb8c4a434f3811e2f4d18c81ad648.stex new file mode 100644 index 0000000..cd33d61 Binary files /dev/null and b/project/.import/yukari_story4.png-1affb8c4a434f3811e2f4d18c81ad648.stex differ diff --git a/project/.import/yukari_story5.png-ead3199c3d54d58c262d093ad147bb1a.md5 b/project/.import/yukari_story5.png-ead3199c3d54d58c262d093ad147bb1a.md5 new file mode 100644 index 0000000..fdf54d2 --- /dev/null +++ b/project/.import/yukari_story5.png-ead3199c3d54d58c262d093ad147bb1a.md5 @@ -0,0 +1,3 @@ +source_md5="38ebfc63cd977f01a45dc1ab852a7500" +dest_md5="457202f74237fa65d27978c07abfd694" + diff --git a/project/.import/yukari_story5.png-ead3199c3d54d58c262d093ad147bb1a.stex b/project/.import/yukari_story5.png-ead3199c3d54d58c262d093ad147bb1a.stex new file mode 100644 index 0000000..de7f088 Binary files /dev/null and b/project/.import/yukari_story5.png-ead3199c3d54d58c262d093ad147bb1a.stex differ diff --git a/project/.import/yukari_story6.png-59969a75cffeebd9090a36adf835a1ad.md5 b/project/.import/yukari_story6.png-59969a75cffeebd9090a36adf835a1ad.md5 new file mode 100644 index 0000000..44a5cc3 --- /dev/null +++ b/project/.import/yukari_story6.png-59969a75cffeebd9090a36adf835a1ad.md5 @@ -0,0 +1,3 @@ +source_md5="32047318084072f457bd5985e09dc28f" +dest_md5="85056e72cd78803293b7149742f60cf7" + diff --git a/project/.import/yukari_story6.png-59969a75cffeebd9090a36adf835a1ad.stex b/project/.import/yukari_story6.png-59969a75cffeebd9090a36adf835a1ad.stex new file mode 100644 index 0000000..e04e32c Binary files /dev/null and b/project/.import/yukari_story6.png-59969a75cffeebd9090a36adf835a1ad.stex differ diff --git a/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.md5 b/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.md5 new file mode 100644 index 0000000..df37a5e --- /dev/null +++ b/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.md5 @@ -0,0 +1,3 @@ +source_md5="18f0c36e91f8ee3f6dcca342543f41c5" +dest_md5="b21209601b1dedd5080cdc0ef7f92fe4" + diff --git a/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.stex b/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.stex new file mode 100644 index 0000000..cba4799 Binary files /dev/null and b/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.stex differ diff --git a/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.tex b/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.tex new file mode 100644 index 0000000..d309537 Binary files /dev/null and b/project/.import/yuyuko.png-2c0fb0391be4067522f0058677bdc770.tex differ diff --git a/project/.import/yuyuko_story.png-f06491f5dd0f7888a152f7fb33dfc208.md5 b/project/.import/yuyuko_story.png-f06491f5dd0f7888a152f7fb33dfc208.md5 new file mode 100644 index 0000000..05757cf --- /dev/null +++ b/project/.import/yuyuko_story.png-f06491f5dd0f7888a152f7fb33dfc208.md5 @@ -0,0 +1,3 @@ +source_md5="4bbd9846be4ccd1eca2290b962e63a17" +dest_md5="49385c5f0c49cefa20e62f19dc437e7a" + diff --git a/project/.import/yuyuko_story.png-f06491f5dd0f7888a152f7fb33dfc208.stex b/project/.import/yuyuko_story.png-f06491f5dd0f7888a152f7fb33dfc208.stex new file mode 100644 index 0000000..46890f3 Binary files /dev/null and b/project/.import/yuyuko_story.png-f06491f5dd0f7888a152f7fb33dfc208.stex differ diff --git a/project/.import/yuyuko_story1.png-55bdc1dbff8ba01c0db90aed67d8f6b7.md5 b/project/.import/yuyuko_story1.png-55bdc1dbff8ba01c0db90aed67d8f6b7.md5 new file mode 100644 index 0000000..df26931 --- /dev/null +++ b/project/.import/yuyuko_story1.png-55bdc1dbff8ba01c0db90aed67d8f6b7.md5 @@ -0,0 +1,3 @@ +source_md5="c07931a8c8f8c55fe1613e551a2b7997" +dest_md5="07f70ca8b7c1decd3530c7c5e0988180" + diff --git a/project/.import/yuyuko_story1.png-55bdc1dbff8ba01c0db90aed67d8f6b7.stex b/project/.import/yuyuko_story1.png-55bdc1dbff8ba01c0db90aed67d8f6b7.stex new file mode 100644 index 0000000..cb4b0b9 Binary files /dev/null and b/project/.import/yuyuko_story1.png-55bdc1dbff8ba01c0db90aed67d8f6b7.stex differ diff --git a/project/.import/yuyuko_story2.png-8e3a09004d0a9a45aef3ba7ecb2382fd.md5 b/project/.import/yuyuko_story2.png-8e3a09004d0a9a45aef3ba7ecb2382fd.md5 new file mode 100644 index 0000000..29bca05 --- /dev/null +++ b/project/.import/yuyuko_story2.png-8e3a09004d0a9a45aef3ba7ecb2382fd.md5 @@ -0,0 +1,3 @@ +source_md5="1f3b276449a9576d04d4e99c1ed0e3b7" +dest_md5="0709a28c4d0b8897d817d31da316240c" + diff --git a/project/.import/yuyuko_story2.png-8e3a09004d0a9a45aef3ba7ecb2382fd.stex b/project/.import/yuyuko_story2.png-8e3a09004d0a9a45aef3ba7ecb2382fd.stex new file mode 100644 index 0000000..eb2ab87 Binary files /dev/null and b/project/.import/yuyuko_story2.png-8e3a09004d0a9a45aef3ba7ecb2382fd.stex differ diff --git a/project/.import/yuyuko_story3.png-b703957d5a085c0634c8b8b2ca18a591.md5 b/project/.import/yuyuko_story3.png-b703957d5a085c0634c8b8b2ca18a591.md5 new file mode 100644 index 0000000..1e773ce --- /dev/null +++ b/project/.import/yuyuko_story3.png-b703957d5a085c0634c8b8b2ca18a591.md5 @@ -0,0 +1,3 @@ +source_md5="f073efc807eed2bd269b3ca2281e9723" +dest_md5="b0e2674ff2648b889ac852239284d321" + diff --git a/project/.import/yuyuko_story3.png-b703957d5a085c0634c8b8b2ca18a591.stex b/project/.import/yuyuko_story3.png-b703957d5a085c0634c8b8b2ca18a591.stex new file mode 100644 index 0000000..583173a Binary files /dev/null and b/project/.import/yuyuko_story3.png-b703957d5a085c0634c8b8b2ca18a591.stex differ diff --git a/project/.import/yuyuko_story4.png-5da549440f31391351ac16861e801b55.md5 b/project/.import/yuyuko_story4.png-5da549440f31391351ac16861e801b55.md5 new file mode 100644 index 0000000..01ccf12 --- /dev/null +++ b/project/.import/yuyuko_story4.png-5da549440f31391351ac16861e801b55.md5 @@ -0,0 +1,3 @@ +source_md5="79b54333fd13f2dc38b67431b6b3e8fd" +dest_md5="65561ed4bd0ecc541f0020146e1000a2" + diff --git a/project/.import/yuyuko_story4.png-5da549440f31391351ac16861e801b55.stex b/project/.import/yuyuko_story4.png-5da549440f31391351ac16861e801b55.stex new file mode 100644 index 0000000..cbdd63f Binary files /dev/null and b/project/.import/yuyuko_story4.png-5da549440f31391351ac16861e801b55.stex differ diff --git a/project/.import/yuyuko_story5.png-cc00c90f8b39ca05b7b8a41baec4a213.md5 b/project/.import/yuyuko_story5.png-cc00c90f8b39ca05b7b8a41baec4a213.md5 new file mode 100644 index 0000000..b684200 --- /dev/null +++ b/project/.import/yuyuko_story5.png-cc00c90f8b39ca05b7b8a41baec4a213.md5 @@ -0,0 +1,3 @@ +source_md5="91c7da1570dac4236ec9136b244ef1bf" +dest_md5="ef9c4ae18a6bb1e6a97393ba02756001" + diff --git a/project/.import/yuyuko_story5.png-cc00c90f8b39ca05b7b8a41baec4a213.stex b/project/.import/yuyuko_story5.png-cc00c90f8b39ca05b7b8a41baec4a213.stex new file mode 100644 index 0000000..0e16739 Binary files /dev/null and b/project/.import/yuyuko_story5.png-cc00c90f8b39ca05b7b8a41baec4a213.stex differ diff --git a/project/.import/yuyuko_story6.png-682e6df5cc382a45fed6a6869e59b46c.md5 b/project/.import/yuyuko_story6.png-682e6df5cc382a45fed6a6869e59b46c.md5 new file mode 100644 index 0000000..d0cc1f3 --- /dev/null +++ b/project/.import/yuyuko_story6.png-682e6df5cc382a45fed6a6869e59b46c.md5 @@ -0,0 +1,3 @@ +source_md5="2c0b31108cf5dae3ce7253f249de5330" +dest_md5="df45e7133ea977d45f25982f6c1be6a5" + diff --git a/project/.import/yuyuko_story6.png-682e6df5cc382a45fed6a6869e59b46c.stex b/project/.import/yuyuko_story6.png-682e6df5cc382a45fed6a6869e59b46c.stex new file mode 100644 index 0000000..c5e4ef1 Binary files /dev/null and b/project/.import/yuyuko_story6.png-682e6df5cc382a45fed6a6869e59b46c.stex differ diff --git a/project/.import/yuyuko_story7.png-83cf2c4b69769c09ae515f82394dc71f.md5 b/project/.import/yuyuko_story7.png-83cf2c4b69769c09ae515f82394dc71f.md5 new file mode 100644 index 0000000..8e6eb1c --- /dev/null +++ b/project/.import/yuyuko_story7.png-83cf2c4b69769c09ae515f82394dc71f.md5 @@ -0,0 +1,3 @@ +source_md5="ad81817ec46420044686240a91c7b6d6" +dest_md5="e964e0d1cea2c9b641e42e4b3048d382" + diff --git a/project/.import/yuyuko_story7.png-83cf2c4b69769c09ae515f82394dc71f.stex b/project/.import/yuyuko_story7.png-83cf2c4b69769c09ae515f82394dc71f.stex new file mode 100644 index 0000000..7eefae2 Binary files /dev/null and b/project/.import/yuyuko_story7.png-83cf2c4b69769c09ae515f82394dc71f.stex differ diff --git a/project/.import/yuyuko_story8.png-8ce5bf06945bc77b4e7e520bf1374623.md5 b/project/.import/yuyuko_story8.png-8ce5bf06945bc77b4e7e520bf1374623.md5 new file mode 100644 index 0000000..ee04fe1 --- /dev/null +++ b/project/.import/yuyuko_story8.png-8ce5bf06945bc77b4e7e520bf1374623.md5 @@ -0,0 +1,3 @@ +source_md5="90c993ee1b0a6394b098bc286d93e271" +dest_md5="da09a8901fc7a94c9a2b711025ff5fe8" + diff --git a/project/.import/yuyuko_story8.png-8ce5bf06945bc77b4e7e520bf1374623.stex b/project/.import/yuyuko_story8.png-8ce5bf06945bc77b4e7e520bf1374623.stex new file mode 100644 index 0000000..95e9db2 Binary files /dev/null and b/project/.import/yuyuko_story8.png-8ce5bf06945bc77b4e7e520bf1374623.stex differ diff --git a/project/Disclaimer.gd b/project/Disclaimer.gd new file mode 100644 index 0000000..37a773e --- /dev/null +++ b/project/Disclaimer.gd @@ -0,0 +1,17 @@ +extends Node2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + var dial = Dialogic.start('disclaimer') + add_child(dial) + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/project/Disclaimer.tscn b/project/Disclaimer.tscn new file mode 100644 index 0000000..85a30db --- /dev/null +++ b/project/Disclaimer.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Disclaimer.gd" type="Script" id=1] + +[node name="Disclaimer" type="Node2D"] +script = ExtResource( 1 ) diff --git a/project/Fairy.gd b/project/Fairy.gd new file mode 100644 index 0000000..1a496e9 --- /dev/null +++ b/project/Fairy.gd @@ -0,0 +1,50 @@ +extends KinematicBody2D + +signal shoot(bullet, direction, location) +signal dead() + +# Declare member variables here. Examples: +# var a = 2 +onready var type = "Fairy" +var velocity = Vector2() +var direction = Vector2() +var speed = 80 +var shot_speed = 150 +var fairy_shot = preload("res://FairyShot.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _physics_process(delta): + move_and_slide(velocity) + + +func _on_Timer_timeout(): + emit_signal('shoot', fairy_shot, deg2rad(rand_range(0, 359)), position) + + +func _on_PlayerIndicator_body_entered(body): + if body.get('type') == "Player": + $Timer.start(0.3) + + +func _on_PlayerIndicator_body_exited(body): + if body.get('type') == "Player": + $Timer.stop() + + +func _on_DangerIndicator_body_entered(body): + if body.get('type') == "Player": + velocity = -to_local(body.position).normalized() * speed + + +func _on_DangerIndicator_body_exited(body): + if body.get('type') == "Player": + velocity = Vector2.ZERO + + +func _on_Fairy1_tree_exiting(): + emit_signal('dead') diff --git a/project/Fairy1.tscn b/project/Fairy1.tscn new file mode 100644 index 0000000..815bd9d --- /dev/null +++ b/project/Fairy1.tscn @@ -0,0 +1,59 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://sprites/fairy1.png" type="Texture" id=1] +[ext_resource path="res://Fairy.gd" type="Script" id=2] + +[sub_resource type="AtlasTexture" id=1] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 20, 26 ) + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 1 ) +region = Rect2( 20, 0, 20, 26 ) + +[sub_resource type="SpriteFrames" id=3] +animations = [ { +"frames": [ SubResource( 1 ), SubResource( 2 ) ], +"loop": true, +"name": "default", +"speed": 4.0 +} ] + +[sub_resource type="RectangleShape2D" id=4] +extents = Vector2( 6, 10.5 ) + +[sub_resource type="RectangleShape2D" id=5] +extents = Vector2( 125, 119 ) + +[sub_resource type="RectangleShape2D" id=6] +extents = Vector2( 61, 62 ) + +[node name="Fairy1" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 3 ) +playing = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 3, -0.5 ) +shape = SubResource( 4 ) + +[node name="PlayerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerIndicator"] +shape = SubResource( 5 ) + +[node name="DangerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DangerIndicator"] +shape = SubResource( 6 ) + +[node name="Timer" type="Timer" parent="."] + +[connection signal="tree_exiting" from="." to="." method="_on_Fairy1_tree_exiting"] +[connection signal="body_entered" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_entered"] +[connection signal="body_exited" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_exited"] +[connection signal="body_entered" from="DangerIndicator" to="." method="_on_DangerIndicator_body_entered"] +[connection signal="body_exited" from="DangerIndicator" to="." method="_on_DangerIndicator_body_exited"] +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/project/Fairy2.tscn b/project/Fairy2.tscn new file mode 100644 index 0000000..a55551e --- /dev/null +++ b/project/Fairy2.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://sprites/fairy2.png" type="Texture" id=1] +[ext_resource path="res://Fairy.gd" type="Script" id=2] + +[sub_resource type="AtlasTexture" id=5] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 20, 26 ) + +[sub_resource type="AtlasTexture" id=6] +atlas = ExtResource( 1 ) +region = Rect2( 20, 0, 20, 26 ) + +[sub_resource type="SpriteFrames" id=7] +animations = [ { +"frames": [ SubResource( 5 ), SubResource( 6 ) ], +"loop": true, +"name": "default", +"speed": 4.0 +} ] + +[sub_resource type="RectangleShape2D" id=4] +extents = Vector2( 6, 10.5 ) + +[sub_resource type="RectangleShape2D" id=8] +extents = Vector2( 125, 119 ) + +[sub_resource type="RectangleShape2D" id=9] +extents = Vector2( 61, 62 ) + +[node name="Fairy2" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 7 ) +frame = 1 +playing = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 3, -0.5 ) +shape = SubResource( 4 ) + +[node name="PlayerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerIndicator"] +shape = SubResource( 8 ) + +[node name="DangerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DangerIndicator"] +shape = SubResource( 9 ) + +[node name="Timer" type="Timer" parent="."] + +[connection signal="tree_exiting" from="." to="." method="_on_Fairy1_tree_exiting"] +[connection signal="body_entered" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_entered"] +[connection signal="body_exited" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_exited"] +[connection signal="body_entered" from="DangerIndicator" to="." method="_on_DangerIndicator_body_entered"] +[connection signal="body_exited" from="DangerIndicator" to="." method="_on_DangerIndicator_body_exited"] +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/project/FairyShot.gd b/project/FairyShot.gd new file mode 100644 index 0000000..5a151fb --- /dev/null +++ b/project/FairyShot.gd @@ -0,0 +1,29 @@ +extends Area2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +onready var type = "Bullet" +var velocity = Vector2.RIGHT +var speed = 50 + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AudioStreamPlayer2D.play() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + velocity = velocity.normalized() * speed * delta + position += velocity + + +func _on_FairyShot_body_entered(body): + if body.get('type') == "Player": + body.get_hit() + queue_free() + + +func _on_VisibilityNotifier2D_screen_exited(): + queue_free() diff --git a/project/FairyShot.tscn b/project/FairyShot.tscn new file mode 100644 index 0000000..f8284ee --- /dev/null +++ b/project/FairyShot.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://sprites/fairyshot.png" type="Texture" id=1] +[ext_resource path="res://FairyShot.gd" type="Script" id=2] +[ext_resource path="res://sfx/fairyshot.wav" type="AudioStream" id=3] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 3, 2 ) + +[node name="FairyShot" type="Area2D"] +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) + +[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."] +scale = Vector2( 0.4, 0.3 ) + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource( 3 ) +volume_db = 1.564 +max_distance = 700.0 +attenuation = 4.14106 + +[connection signal="body_entered" from="." to="." method="_on_FairyShot_body_entered"] +[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"] diff --git a/project/Fullscreen.gd b/project/Fullscreen.gd new file mode 100644 index 0000000..e8f17a8 --- /dev/null +++ b/project/Fullscreen.gd @@ -0,0 +1,17 @@ +extends Node + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Input.is_action_just_pressed("toogle_fullscreen"): + OS.window_fullscreen = !OS.window_fullscreen diff --git a/project/Fullscreen.tscn b/project/Fullscreen.tscn new file mode 100644 index 0000000..87751a9 --- /dev/null +++ b/project/Fullscreen.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Fullscreen.gd" type="Script" id=1] + +[node name="Fullscreen" type="Node"] +pause_mode = 2 +script = ExtResource( 1 ) diff --git a/project/LICENSE b/project/LICENSE new file mode 100644 index 0000000..f974111 --- /dev/null +++ b/project/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 - 2022 Emilio Coppola + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/project/Level.gd b/project/Level.gd new file mode 100644 index 0000000..e977dc6 --- /dev/null +++ b/project/Level.gd @@ -0,0 +1,46 @@ +extends Node2D + + +# Declare member variables here. Examples: +const FAIRY_COUNT = 3 +var fairies_dead = 0 +onready var pause = preload("res://PauseMenu.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AudioStreamPlayer.play() + var level1_start = Dialogic.start('Level1_start') + add_child(level1_start) + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Input.is_action_just_pressed("ui_pause"): + var pause_inst = pause.instance() + add_child(pause_inst) + get_tree().paused = true + + if fairies_dead >= FAIRY_COUNT: + fairies_dead = -1 + var dialogue = Dialogic.start('Level1_end') + add_child(dialogue) + + +func _on_Fairy_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Player_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Fairy_dead(): + fairies_dead += 1 diff --git a/project/Level1.tscn b/project/Level1.tscn new file mode 100644 index 0000000..b94ab34 --- /dev/null +++ b/project/Level1.tscn @@ -0,0 +1,108 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://sprites/level1.png" type="Texture" id=1] +[ext_resource path="res://Player.tscn" type="PackedScene" id=2] +[ext_resource path="res://Shattered1.tscn" type="PackedScene" id=3] +[ext_resource path="res://Fairy2.tscn" type="PackedScene" id=4] +[ext_resource path="res://Fairy1.tscn" type="PackedScene" id=5] +[ext_resource path="res://Level.gd" type="Script" id=6] +[ext_resource path="res://bgm/level1.ogg" type="AudioStream" id=7] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 35.5, 37 ) + +[sub_resource type="SegmentShape2D" id=2] +a = Vector2( 640, 360 ) +b = Vector2( 639, 0 ) + +[sub_resource type="SegmentShape2D" id=3] +a = Vector2( 66, 339 ) +b = Vector2( 711, 339 ) + +[node name="Level1" type="Node2D"] +script = ExtResource( 6 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +centered = false + +[node name="DonationStall" type="StaticBody2D" parent="."] +position = Vector2( 532, 177 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DonationStall"] +position = Vector2( -0.5, -6 ) +shape = SubResource( 1 ) + +[node name="Torii" type="Node2D" parent="."] +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="ToriiLeft" type="StaticBody2D" parent="Torii"] +position = Vector2( 132, 56 ) +__meta__ = { +"_edit_group_": true +} + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Torii/ToriiLeft"] +polygon = PoolVector2Array( -7, 36, -5, 18, 4, -56, 26, -56, 16, 25, 10, 40 ) + +[node name="ToriiRight" type="StaticBody2D" parent="Torii"] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Torii/ToriiRight"] +position = Vector2( 252, 56 ) +polygon = PoolVector2Array( 13, 32, 6, -7, 4, -56, 25, -56, 24, -12, 38, 45, 23, 52 ) + +[node name="Shattered1" parent="." instance=ExtResource( 3 )] +position = Vector2( 555, 336 ) + +[node name="Fairy2" parent="." instance=ExtResource( 4 )] +position = Vector2( 114, 296 ) + +[node name="Fairy3" parent="." instance=ExtResource( 4 )] +position = Vector2( 179, 296 ) + +[node name="Fairy1" parent="." instance=ExtResource( 5 )] +position = Vector2( 462, 186 ) + +[node name="Player" parent="." instance=ExtResource( 2 )] +position = Vector2( 203, 58 ) +__meta__ = { +"_edit_group_": true +} + +[node name="Border" type="StaticBody2D" parent="."] +__meta__ = { +"_edit_lock_": true +} + +[node name="Right" type="CollisionShape2D" parent="Border"] +shape = SubResource( 2 ) + +[node name="Down" type="CollisionShape2D" parent="Border"] +position = Vector2( -69, 21 ) +shape = SubResource( 3 ) + +[node name="Up" type="CollisionShape2D" parent="Border"] +position = Vector2( -70, -338 ) +shape = SubResource( 3 ) + +[node name="Left" type="CollisionShape2D" parent="Border"] +position = Vector2( -640, -1 ) +shape = SubResource( 2 ) + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 7 ) + +[connection signal="dead" from="Fairy2" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy2" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy3" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy3" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy1" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy1" to="." method="_on_Fairy_shoot"] +[connection signal="shoot" from="Player" to="." method="_on_Player_shoot"] diff --git a/project/Level2.gd b/project/Level2.gd new file mode 100644 index 0000000..341f4b8 --- /dev/null +++ b/project/Level2.gd @@ -0,0 +1,48 @@ +extends Node2D + + +# Declare member variables here. Examples: +const FAIRY_COUNT = 4 +var fairies_dead = 0 +onready var pause = preload("res://PauseMenu.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + if get_tree().get_root().get_node_or_null('Level1') != null: + get_tree().get_root().get_node('Level1').queue_free() + $AudioStreamPlayer.play() + var dial = Dialogic.start('Level2_start') + add_child(dial) + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Input.is_action_just_pressed("ui_pause"): + var pause_inst = pause.instance() + add_child(pause_inst) + get_tree().paused = true + + if fairies_dead >= FAIRY_COUNT: + fairies_dead = -1 + var dialogue = Dialogic.start('Level2_end') + add_child(dialogue) + + +func _on_Fairy_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Player_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Fairy_dead(): + fairies_dead += 1 diff --git a/project/Level2.tscn b/project/Level2.tscn new file mode 100644 index 0000000..12c3208 --- /dev/null +++ b/project/Level2.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://sprites/level2.png" type="Texture" id=1] +[ext_resource path="res://Player.tscn" type="PackedScene" id=2] +[ext_resource path="res://Shattered2.tscn" type="PackedScene" id=3] +[ext_resource path="res://Fairy2.tscn" type="PackedScene" id=4] +[ext_resource path="res://Fairy1.tscn" type="PackedScene" id=5] +[ext_resource path="res://Level2.gd" type="Script" id=6] +[ext_resource path="res://bgm/level2.ogg" type="AudioStream" id=7] + +[sub_resource type="SegmentShape2D" id=2] +a = Vector2( 641, 360 ) +b = Vector2( 639, 0 ) + +[sub_resource type="SegmentShape2D" id=4] +a = Vector2( 66, 339 ) +b = Vector2( 302, 339 ) + +[sub_resource type="SegmentShape2D" id=5] +a = Vector2( 66, 339 ) +b = Vector2( 471, 166 ) + +[sub_resource type="SegmentShape2D" id=3] +a = Vector2( 66, 339 ) +b = Vector2( 711, 339 ) + +[node name="Level2" type="Node2D"] +script = ExtResource( 6 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +centered = false + +[node name="Fairy2" parent="." instance=ExtResource( 4 )] +position = Vector2( 595, 36 ) + +[node name="Fairy3" parent="." instance=ExtResource( 4 )] +position = Vector2( 556, 117 ) + +[node name="Fairy1" parent="." instance=ExtResource( 5 )] +position = Vector2( 422, 95 ) + +[node name="Fairy4" parent="." instance=ExtResource( 5 )] +position = Vector2( 459, 201 ) + +[node name="Player" parent="." instance=ExtResource( 2 )] +position = Vector2( 219, 321 ) +__meta__ = { +"_edit_group_": true +} + +[node name="Shattered2" parent="." instance=ExtResource( 3 )] +position = Vector2( 113, 50 ) + +[node name="House" type="StaticBody2D" parent="."] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="House"] +polygon = PoolVector2Array( 0, 119, 38, 59, 38, -1, -2, 0 ) + +[node name="Border" type="StaticBody2D" parent="."] + +[node name="Right" type="CollisionShape2D" parent="Border"] +shape = SubResource( 2 ) + +[node name="Down" type="CollisionShape2D" parent="Border"] +position = Vector2( -67, 21 ) +shape = SubResource( 4 ) + +[node name="Down2" type="CollisionShape2D" parent="Border"] +position = Vector2( 169, 21 ) +shape = SubResource( 5 ) + +[node name="Up" type="CollisionShape2D" parent="Border"] +position = Vector2( -70, -338 ) +shape = SubResource( 3 ) + +[node name="Left" type="CollisionShape2D" parent="Border"] +position = Vector2( -640, -1 ) +shape = SubResource( 2 ) + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 7 ) + +[connection signal="dead" from="Fairy2" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy2" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy3" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy3" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy1" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy1" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy4" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy4" to="." method="_on_Fairy_shoot"] +[connection signal="shoot" from="Player" to="." method="_on_Player_shoot"] diff --git a/project/Level3.gd b/project/Level3.gd new file mode 100644 index 0000000..250c547 --- /dev/null +++ b/project/Level3.gd @@ -0,0 +1,48 @@ +extends Node2D + + +# Declare member variables here. Examples: +const FAIRY_COUNT = 5 +var fairies_dead = 0 +onready var pause = preload("res://PauseMenu.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + if get_tree().get_root().get_node_or_null('Level2') != null: + get_tree().get_root().get_node('Level2').queue_free() + $AudioStreamPlayer.play() + var dial = Dialogic.start('Level3_start') + add_child(dial) + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Input.is_action_just_pressed("ui_pause"): + var pause_inst = pause.instance() + add_child(pause_inst) + get_tree().paused = true + + if fairies_dead >= FAIRY_COUNT: + fairies_dead = -1 + var dialogue = Dialogic.start('Level3_end') + add_child(dialogue) + + +func _on_Fairy_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Player_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Fairy_dead(): + fairies_dead += 1 diff --git a/project/Level3.tscn b/project/Level3.tscn new file mode 100644 index 0000000..1248248 --- /dev/null +++ b/project/Level3.tscn @@ -0,0 +1,135 @@ +[gd_scene load_steps=17 format=2] + +[ext_resource path="res://sprites/level3.png" type="Texture" id=1] +[ext_resource path="res://Player.tscn" type="PackedScene" id=2] +[ext_resource path="res://Shattered3.tscn" type="PackedScene" id=3] +[ext_resource path="res://Fairy2.tscn" type="PackedScene" id=4] +[ext_resource path="res://Fairy1.tscn" type="PackedScene" id=5] +[ext_resource path="res://Level3.gd" type="Script" id=6] +[ext_resource path="res://bgm/level3.ogg" type="AudioStream" id=7] + +[sub_resource type="SegmentShape2D" id=6] +a = Vector2( 702, 141 ) +b = Vector2( 639, 0 ) + +[sub_resource type="SegmentShape2D" id=4] +a = Vector2( -110, 340 ) +b = Vector2( 302, 339 ) + +[sub_resource type="SegmentShape2D" id=5] +a = Vector2( 344, 293 ) +b = Vector2( 410, 191 ) + +[sub_resource type="SegmentShape2D" id=3] +a = Vector2( 166, 370 ) +b = Vector2( 583, 367 ) + +[sub_resource type="SegmentShape2D" id=2] +a = Vector2( 708, 157 ) +b = Vector2( 714, 98 ) + +[sub_resource type="SegmentShape2D" id=7] +a = Vector2( 708, 157 ) +b = Vector2( 622, -22 ) + +[sub_resource type="SegmentShape2D" id=8] +a = Vector2( 587, -6 ) +b = Vector2( 582, 26 ) + +[sub_resource type="SegmentShape2D" id=9] +a = Vector2( 557, -3 ) +b = Vector2( 595, -3 ) + +[sub_resource type="SegmentShape2D" id=10] +a = Vector2( 557, -3 ) +b = Vector2( 596, 26 ) + +[node name="Level3" type="Node2D"] +script = ExtResource( 6 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +centered = false + +[node name="Fairy2" parent="." instance=ExtResource( 4 )] +position = Vector2( 477, 183 ) + +[node name="Fairy3" parent="." instance=ExtResource( 4 )] +position = Vector2( 281, 102 ) + +[node name="Fairy1" parent="." instance=ExtResource( 5 )] +position = Vector2( 356, 141 ) + +[node name="Fairy5" parent="." instance=ExtResource( 5 )] +position = Vector2( 83, 131 ) + +[node name="Fairy4" parent="." instance=ExtResource( 5 )] +position = Vector2( 147, 126 ) + +[node name="Player" parent="." instance=ExtResource( 2 )] +position = Vector2( 311, 291 ) +__meta__ = { +"_edit_group_": true +} + +[node name="House" type="StaticBody2D" parent="."] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="House"] +position = Vector2( 445, 77 ) +polygon = PoolVector2Array( -55, 68, -20, 79, 62, 38, 7, 1, -9, 4 ) + +[node name="Border" type="StaticBody2D" parent="."] + +[node name="Right" type="CollisionShape2D" parent="Border"] +position = Vector2( -123, 72 ) +shape = SubResource( 6 ) + +[node name="Down" type="CollisionShape2D" parent="Border"] +position = Vector2( 211, -26 ) +shape = SubResource( 4 ) + +[node name="Down2" type="CollisionShape2D" parent="Border"] +position = Vector2( 169, 21 ) +shape = SubResource( 5 ) + +[node name="Up" type="CollisionShape2D" parent="Border"] +position = Vector2( -66, -294 ) +shape = SubResource( 3 ) + +[node name="Left" type="CollisionShape2D" parent="Border"] +position = Vector2( -606, 157 ) +shape = SubResource( 2 ) + +[node name="Left2" type="CollisionShape2D" parent="Border"] +position = Vector2( -600, 100 ) +shape = SubResource( 7 ) + +[node name="Left3" type="CollisionShape2D" parent="Border"] +position = Vector2( -560, 53 ) +shape = SubResource( 8 ) + +[node name="Left4" type="CollisionShape2D" parent="Border"] +position = Vector2( -530, 50 ) +shape = SubResource( 9 ) + +[node name="Left5" type="CollisionShape2D" parent="Border"] +position = Vector2( -494, 50 ) +shape = SubResource( 10 ) + +[node name="Shattered3" parent="." instance=ExtResource( 3 )] +position = Vector2( 50, 29 ) + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 7 ) + +[connection signal="dead" from="Fairy2" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy2" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy3" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy3" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy1" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy1" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy5" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy5" to="." method="_on_Fairy_shoot"] +[connection signal="dead" from="Fairy4" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Fairy4" to="." method="_on_Fairy_shoot"] +[connection signal="shoot" from="Player" to="." method="_on_Player_shoot"] diff --git a/project/LevelExtra.gd b/project/LevelExtra.gd new file mode 100644 index 0000000..9445ab2 --- /dev/null +++ b/project/LevelExtra.gd @@ -0,0 +1,47 @@ +extends Node2D + + +# Declare member variables here. Examples: +const FAIRY_COUNT = 1 +var fairies_dead = 0 +onready var pause = preload("res://PauseMenu.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + var dial = Dialogic.start('LevelExtra_start') + add_child(dial) + $Player/Camera2D.zoom = Vector2(0.4, 0.4) + $Player.boss_battle = true + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Input.is_action_just_pressed("ui_pause"): + var pause_inst = pause.instance() + add_child(pause_inst) + get_tree().paused = true + + if fairies_dead >= FAIRY_COUNT: + fairies_dead = -1 + var dialogue = Dialogic.start('LevelExtra_end') + add_child(dialogue) + + +func _on_Fairy_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Player_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Fairy_dead(): + fairies_dead += 1 diff --git a/project/LevelExtra.tscn b/project/LevelExtra.tscn new file mode 100644 index 0000000..8118e3b --- /dev/null +++ b/project/LevelExtra.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://sprites/CG/darkness.png" type="Texture" id=1] +[ext_resource path="res://Player.tscn" type="PackedScene" id=2] +[ext_resource path="res://Yukari.tscn" type="PackedScene" id=3] +[ext_resource path="res://LevelExtra.gd" type="Script" id=4] +[ext_resource path="res://bgm/youmu_loop.ogg" type="AudioStream" id=5] + +[sub_resource type="SegmentShape2D" id=2] +a = Vector2( 641, 360 ) +b = Vector2( 639, 0 ) + +[sub_resource type="SegmentShape2D" id=4] +a = Vector2( 66, 339 ) +b = Vector2( 709, 339 ) + +[sub_resource type="SegmentShape2D" id=3] +a = Vector2( 80, 339 ) +b = Vector2( 723, 339 ) + +[node name="LevelExtra" type="Node2D"] +script = ExtResource( 4 ) + +[node name="Sprite" type="Sprite" parent="."] +scale = Vector2( 0.508594, 0.515278 ) +texture = ExtResource( 1 ) +centered = false + +[node name="Yukari" parent="." instance=ExtResource( 3 )] +position = Vector2( 304, 176 ) + +[node name="Player" parent="." instance=ExtResource( 2 )] +position = Vector2( 287, 326 ) +__meta__ = { +"_edit_group_": true +} + +[node name="Border" type="StaticBody2D" parent="."] + +[node name="Right" type="CollisionShape2D" parent="Border"] +shape = SubResource( 2 ) + +[node name="Down" type="CollisionShape2D" parent="Border"] +position = Vector2( -67, 21 ) +shape = SubResource( 4 ) + +[node name="Up" type="CollisionShape2D" parent="Border"] +position = Vector2( -82, -316 ) +shape = SubResource( 3 ) + +[node name="Left" type="CollisionShape2D" parent="Border"] +position = Vector2( -617, 0 ) +shape = SubResource( 2 ) + +[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 5 ) +volume_db = -2.0 + +[connection signal="dead" from="Yukari" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Yukari" to="." method="_on_Fairy_shoot"] +[connection signal="shoot" from="Player" to="." method="_on_Player_shoot"] diff --git a/project/LevelFinal.gd b/project/LevelFinal.gd new file mode 100644 index 0000000..13e2c27 --- /dev/null +++ b/project/LevelFinal.gd @@ -0,0 +1,61 @@ +extends Node2D + + +# Declare member variables here. Examples: +const FAIRY_COUNT = 1 +var fairies_dead = 0 +onready var pause = preload("res://PauseMenu.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + if get_tree().get_root().get_node_or_null('Level3') != null: + get_tree().get_root().get_node('Level3').queue_free() + if Dialogic.get_variable('shattered1') == 'true' and Dialogic.get_variable('shattered2') == 'true' and Dialogic.get_variable('shattered3') == 'true': + var dial = Dialogic.start('LevelFinal_good_start') + add_child(dial) + else: + var dial = Dialogic.start('LevelFinal_start') + add_child(dial) + $Player/Camera2D.zoom = Vector2(0.4, 0.4) + $Player.boss_battle = true + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Input.is_action_just_pressed("ui_pause"): + var pause_inst = pause.instance() + add_child(pause_inst) + get_tree().paused = true + + if fairies_dead >= FAIRY_COUNT: + fairies_dead = -1 + if Dialogic.get_variable('shattered1') == 'true' and Dialogic.get_variable('shattered2') == 'true' and Dialogic.get_variable('shattered3') == 'true': + if Dialogic.get_variable('yukari') == 'true': + var dialogue = Dialogic.start('end_true') + add_child(dialogue) + else: + var dialogue = Dialogic.start('end_good') + add_child(dialogue) + else: + var dial = Dialogic.start('end_bad') + add_child(dial) + + +func _on_Fairy_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Player_shoot(bullet, direction, location): + var b = bullet.instance() + add_child(b) + b.rotation = direction + b.position = location + b.velocity = b.velocity.rotated(direction) + + +func _on_Fairy_dead(): + fairies_dead += 1 diff --git a/project/LevelFinal.tscn b/project/LevelFinal.tscn new file mode 100644 index 0000000..c02aa7c --- /dev/null +++ b/project/LevelFinal.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://sprites/levelfinal.png" type="Texture" id=1] +[ext_resource path="res://Player.tscn" type="PackedScene" id=2] +[ext_resource path="res://Youmu.tscn" type="PackedScene" id=3] +[ext_resource path="res://bgm/youmu_loop.ogg" type="AudioStream" id=5] +[ext_resource path="res://LevelFinal.gd" type="Script" id=6] + +[sub_resource type="SegmentShape2D" id=2] +a = Vector2( 615, 359 ) +b = Vector2( 639, 0 ) + +[sub_resource type="SegmentShape2D" id=4] +a = Vector2( 66, 339 ) +b = Vector2( 709, 339 ) + +[sub_resource type="SegmentShape2D" id=3] +a = Vector2( 311, 340 ) +b = Vector2( 551, 339 ) + +[sub_resource type="SegmentShape2D" id=5] +a = Vector2( 67, 381 ) +b = Vector2( 312, 340 ) + +[sub_resource type="SegmentShape2D" id=6] +a = Vector2( 298, 339 ) +b = Vector2( 456, 378 ) + +[sub_resource type="SegmentShape2D" id=7] +a = Vector2( 663, 361 ) +b = Vector2( 639, 0 ) + +[node name="LevelFinal" type="Node2D"] +script = ExtResource( 6 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) +centered = false + +[node name="Player" parent="." instance=ExtResource( 2 )] +position = Vector2( 287, 326 ) +__meta__ = { +"_edit_group_": true +} + +[node name="Youmu" parent="." instance=ExtResource( 3 )] +position = Vector2( 322, 183 ) + +[node name="House" type="StaticBody2D" parent="."] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="House"] +position = Vector2( 249, 47 ) +polygon = PoolVector2Array( 0, 119, 39, 126, 108, 119, 93, 12, 29, 6 ) + +[node name="Border" type="StaticBody2D" parent="."] + +[node name="Right" type="CollisionShape2D" parent="Border"] +shape = SubResource( 2 ) + +[node name="Down" type="CollisionShape2D" parent="Border"] +position = Vector2( -67, 21 ) +shape = SubResource( 4 ) + +[node name="Up" type="CollisionShape2D" parent="Border"] +position = Vector2( -67, -184 ) +shape = SubResource( 3 ) + +[node name="Up2" type="CollisionShape2D" parent="Border"] +position = Vector2( -67, -184 ) +shape = SubResource( 5 ) + +[node name="Up3" type="CollisionShape2D" parent="Border"] +position = Vector2( 184, -184 ) +shape = SubResource( 6 ) + +[node name="Left" type="CollisionShape2D" parent="Border"] +position = Vector2( -640, -1 ) +shape = SubResource( 7 ) + +[node name="AudioStreamPlayer2" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 5 ) +volume_db = -2.0 + +[connection signal="shoot" from="Player" to="." method="_on_Player_shoot"] +[connection signal="dead" from="Youmu" to="." method="_on_Fairy_dead"] +[connection signal="shoot" from="Youmu" to="." method="_on_Fairy_shoot"] diff --git a/project/Main.gd b/project/Main.gd new file mode 100644 index 0000000..c43b56e --- /dev/null +++ b/project/Main.gd @@ -0,0 +1,19 @@ +extends Node2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +onready var disclaimer = preload("res://Disclaimer.tscn") +onready var fs = preload("res://Fullscreen.tscn") + +# Called when the node enters the scene tree for the first time. +func _ready(): + var fs_inst = fs.instance() + get_tree().get_root().call_deferred('add_child', fs_inst) + var dc_inst = disclaimer.instance() + add_child(dc_inst) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/project/Main.tscn b/project/Main.tscn new file mode 100644 index 0000000..1cfc0fe --- /dev/null +++ b/project/Main.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://Main.gd" type="Script" id=2] + +[node name="Main" type="Node2D"] +script = ExtResource( 2 ) diff --git a/project/MainMenu.gd b/project/MainMenu.gd new file mode 100644 index 0000000..b7ecf68 --- /dev/null +++ b/project/MainMenu.gd @@ -0,0 +1,90 @@ +extends Node2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +onready var level1 = preload("res://Level1.tscn") +onready var final = preload("res://LevelFinal.tscn") +onready var extra = preload("res://LevelExtra.tscn") + + +# Called when the node enters the scene tree for the first time. +func _ready(): + if get_tree().get_root().get_node_or_null('Level1') != null: + get_tree().get_root().get_node('Level1').queue_free() + if get_tree().get_root().get_node_or_null('Level2') != null: + get_tree().get_root().get_node('Level2').queue_free() + if get_tree().get_root().get_node_or_null('Level3') != null: + get_tree().get_root().get_node('Level3').queue_free() + if get_tree().get_root().get_node_or_null('LevelFinal') != null: + get_tree().get_root().get_node('LevelFinal').queue_free() + if get_tree().get_root().get_node_or_null('LevelExtra') != null: + get_tree().get_root().get_node('LevelExtra').queue_free() + + if Dialogic.get_variable('good_end') == 'true': + $CanvasLayer/Control/TextureRect/Button_Extra.set('disabled', false) + if Dialogic.get_variable('final_reached') == 'true': + $CanvasLayer/Control/TextureRect/Button_Final.set('disabled', false) + + if Dialogic.get_variable('bad_end') == 'true': + $CanvasLayer/Control/TextureRect/End1/EImg1.set('visible', true) + if Dialogic.get_variable('good_end') == 'true': + $CanvasLayer/Control/TextureRect/End2/EImg2.set('visible', true) + if Dialogic.get_variable('true_end') == 'true': + $CanvasLayer/Control/TextureRect/TitleEnd.set('visible', true) + $CanvasLayer/Control/TextureRect/End3/EImg3.set('visible', true) + + $CanvasLayer/Control/TextureRect/Button_Start.grab_focus() + $AudioStreamPlayer.play() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + if Dialogic.get_variable('shattered1') == 'true': + $CanvasLayer/Control/TextureRect/Shattered1/SImg1.set('visible', true) + else: + $CanvasLayer/Control/TextureRect/Shattered1/SImg1.set('visible', false) + if Dialogic.get_variable('shattered2') == 'true': + $CanvasLayer/Control/TextureRect/Shattered2/SImg2.set('visible', true) + else: + $CanvasLayer/Control/TextureRect/Shattered2/SImg2.set('visible', false) + if Dialogic.get_variable('shattered3') == 'true': + $CanvasLayer/Control/TextureRect/Shattered3/SImg3.set('visible', true) + else: + $CanvasLayer/Control/TextureRect/Shattered3/SImg3.set('visible', false) + if Dialogic.get_variable('yukari') == 'true': + $CanvasLayer/Control/TextureRect/ExtraDone.set('visible', true) + else: + $CanvasLayer/Control/TextureRect/ExtraDone.set('visible', false) + + +func _on_Button_Start_pressed(): + $AudioGUI.play() + var lvl1_inst = level1.instance() + get_tree().get_root().add_child(lvl1_inst) + queue_free() + + +func _on_Button_Extra_pressed(): + $AudioGUI.play() + var xtr_inst = extra.instance() + get_tree().get_root().add_child(xtr_inst) + queue_free() + + +func _on_Button_focus_entered(): + $AudioGUI.play() + + +func _on_Button_Final_pressed(): + $AudioGUI.play() + var fnl_inst = final.instance() + get_tree().get_root().add_child(fnl_inst) + queue_free() + + +func _on_Button_Forget_pressed(): + $AudioGUI.play() + var dial = Dialogic.start('forget_data') + add_child(dial) diff --git a/project/MainMenu.tscn b/project/MainMenu.tscn new file mode 100644 index 0000000..9be5ab4 --- /dev/null +++ b/project/MainMenu.tscn @@ -0,0 +1,264 @@ +[gd_scene load_steps=17 format=2] + +[ext_resource path="res://new_theme_mm.tres" type="Theme" id=1] +[ext_resource path="res://sprites/title.png" type="Texture" id=2] +[ext_resource path="res://MainMenu.gd" type="Script" id=3] +[ext_resource path="res://sprites/shat_progress_0_l.png" type="Texture" id=4] +[ext_resource path="res://sprites/shat_progress_3.png" type="Texture" id=5] +[ext_resource path="res://sprites/shat_progress_1.png" type="Texture" id=6] +[ext_resource path="res://sprites/shat_progress_2.png" type="Texture" id=7] +[ext_resource path="res://bgm/titlescreen.ogg" type="AudioStream" id=8] +[ext_resource path="res://sfx/ui_choose.wav" type="AudioStream" id=9] +[ext_resource path="res://sprites/shat_progress_4.png" type="Texture" id=10] +[ext_resource path="res://sprites/end_progress_0.png" type="Texture" id=11] +[ext_resource path="res://sprites/end_progress_3.png" type="Texture" id=12] +[ext_resource path="res://sprites/end_progress_1.png" type="Texture" id=13] +[ext_resource path="res://sprites/end_progress_2.png" type="Texture" id=14] +[ext_resource path="res://sprites/title_end.png" type="Texture" id=15] + +[sub_resource type="StyleBoxEmpty" id=1] + +[node name="MainMenu" type="Node2D"] +script = ExtResource( 3 ) + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="Control" type="Control" parent="CanvasLayer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) + +[node name="TextureRect" type="TextureRect" parent="CanvasLayer/Control"] +margin_right = 40.0 +margin_bottom = 40.0 +texture = ExtResource( 2 ) +stretch_mode = 5 + +[node name="TitleEnd" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 15 ) + +[node name="Button_Start" type="Button" parent="CanvasLayer/Control/TextureRect"] +margin_left = 137.0 +margin_top = 300.0 +margin_right = 346.0 +margin_bottom = 380.0 +focus_neighbour_right = NodePath("../Button_Final") +focus_neighbour_bottom = NodePath("../Button_Extra") +custom_styles/normal = SubResource( 1 ) +text = "Start" + +[node name="Button_Final" type="Button" parent="CanvasLayer/Control/TextureRect"] +margin_left = 448.0 +margin_top = 300.0 +margin_right = 660.0 +margin_bottom = 380.0 +focus_neighbour_left = NodePath("../Button_Start") +focus_neighbour_bottom = NodePath("../Button_Forget") +custom_styles/normal = SubResource( 1 ) +disabled = true +text = "Final" + +[node name="Button_Extra" type="Button" parent="CanvasLayer/Control/TextureRect"] +margin_left = 137.0 +margin_top = 400.0 +margin_right = 349.0 +margin_bottom = 480.0 +focus_neighbour_top = NodePath("../Button_Start") +focus_neighbour_right = NodePath("../Button_Forget") +disabled = true +text = "Extra" + +[node name="Button_Forget" type="Button" parent="CanvasLayer/Control/TextureRect"] +margin_left = 422.0 +margin_top = 400.0 +margin_right = 677.0 +margin_bottom = 480.0 +focus_neighbour_left = NodePath("../Button_Extra") +focus_neighbour_top = NodePath("../Button_Final") +text = "Forget" + +[node name="Shattered1" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -604.0 +margin_top = 544.0 +margin_right = -456.0 +margin_bottom = 692.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="SImg1" type="TextureRect" parent="CanvasLayer/Control/TextureRect/Shattered1"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 6 ) +stretch_mode = 5 + +[node name="End1" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = 282.0 +margin_top = 80.0 +margin_right = 372.0 +margin_bottom = 170.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 11 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="EImg1" type="TextureRect" parent="CanvasLayer/Control/TextureRect/End1"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 13 ) +stretch_mode = 5 + +[node name="End2" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = 402.0 +margin_top = 80.0 +margin_right = 492.0 +margin_bottom = 170.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 11 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="EImg2" type="TextureRect" parent="CanvasLayer/Control/TextureRect/End2"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 14 ) +stretch_mode = 5 + +[node name="End3" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = 522.0 +margin_top = 80.0 +margin_right = 612.0 +margin_bottom = 170.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 11 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="EImg3" type="TextureRect" parent="CanvasLayer/Control/TextureRect/End3"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 12 ) +stretch_mode = 5 + +[node name="Shattered2" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -420.0 +margin_top = 544.0 +margin_right = -272.0 +margin_bottom = 692.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="SImg2" type="TextureRect" parent="CanvasLayer/Control/TextureRect/Shattered2"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 7 ) +stretch_mode = 5 + +[node name="ExtraDone" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +visible = false +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -49.0 +margin_top = 516.0 +margin_right = 127.0 +margin_bottom = 692.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="EImg" type="TextureRect" parent="CanvasLayer/Control/TextureRect/ExtraDone"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 10 ) +stretch_mode = 5 + +[node name="Shattered3" type="TextureRect" parent="CanvasLayer/Control/TextureRect"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -240.0 +margin_top = 544.0 +margin_right = -92.0 +margin_bottom = 692.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 +__meta__ = { +"_edit_group_": true +} + +[node name="SImg3" type="TextureRect" parent="CanvasLayer/Control/TextureRect/Shattered3"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 5 ) +stretch_mode = 5 + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 8 ) + +[node name="AudioGUI" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 9 ) + +[connection signal="focus_entered" from="CanvasLayer/Control/TextureRect/Button_Start" to="." method="_on_Button_focus_entered"] +[connection signal="pressed" from="CanvasLayer/Control/TextureRect/Button_Start" to="." method="_on_Button_Start_pressed"] +[connection signal="focus_entered" from="CanvasLayer/Control/TextureRect/Button_Final" to="." method="_on_Button_focus_entered"] +[connection signal="pressed" from="CanvasLayer/Control/TextureRect/Button_Final" to="." method="_on_Button_Final_pressed"] +[connection signal="focus_entered" from="CanvasLayer/Control/TextureRect/Button_Extra" to="." method="_on_Button_focus_entered"] +[connection signal="pressed" from="CanvasLayer/Control/TextureRect/Button_Extra" to="." method="_on_Button_Extra_pressed"] +[connection signal="focus_entered" from="CanvasLayer/Control/TextureRect/Button_Forget" to="." method="_on_Button_focus_entered"] +[connection signal="pressed" from="CanvasLayer/Control/TextureRect/Button_Forget" to="." method="_on_Button_Forget_pressed"] diff --git a/project/PauseMenu.gd b/project/PauseMenu.gd new file mode 100644 index 0000000..c23954d --- /dev/null +++ b/project/PauseMenu.gd @@ -0,0 +1,44 @@ +extends CanvasLayer + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + if Dialogic.get_variable('shattered1') == 'true': + $PauseMenu/Background/Shattered1/SImg1.set('visible', true) + if Dialogic.get_variable('shattered2') == 'true': + $PauseMenu/Background/Shattered2/SImg2.set('visible', true) + if Dialogic.get_variable('shattered3') == 'true': + $PauseMenu/Background/Shattered3/SImg3.set('visible', true) + if Dialogic.get_variable('yukari') == 'true': + $PauseMenu/Background/ExtraDone.set('visible', true) + + $PauseMenu/Background/Continue_Button.grab_focus() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + + +func _on_Continue_Button_pressed(): + $PauseMenu/AudioGUI.play() + get_tree().paused = false + queue_free() + + +func _on_Exit_Button_pressed(): + $PauseMenu/AudioGUI.play() + var mm = load("res://MainMenu.tscn") + var mm_inst = mm.instance() + get_tree().paused = false + get_tree().get_root().add_child(mm_inst) + queue_free() + + +func _on_Button_focus_entered(): + $PauseMenu/AudioGUI.play() diff --git a/project/PauseMenu.tscn b/project/PauseMenu.tscn new file mode 100644 index 0000000..6ba9178 --- /dev/null +++ b/project/PauseMenu.tscn @@ -0,0 +1,141 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://new_theme_mm.tres" type="Theme" id=1] +[ext_resource path="res://PauseMenu.gd" type="Script" id=2] +[ext_resource path="res://sfx/ui_choose.wav" type="AudioStream" id=3] +[ext_resource path="res://sprites/shat_progress_0_l.png" type="Texture" id=4] +[ext_resource path="res://sprites/shat_progress_3.png" type="Texture" id=5] +[ext_resource path="res://sprites/shat_progress_1.png" type="Texture" id=6] +[ext_resource path="res://sprites/shat_progress_2.png" type="Texture" id=7] +[ext_resource path="res://sprites/shat_progress_4.png" type="Texture" id=8] + +[node name="PauseMenu_Canvas" type="CanvasLayer"] +pause_mode = 2 +layer = 3 +script = ExtResource( 2 ) + +[node name="PauseMenu" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) + +[node name="Background" type="ColorRect" parent="PauseMenu"] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0, 0, 0, 0.501961 ) + +[node name="Continue_Button" type="Button" parent="PauseMenu/Background"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -169.0 +margin_top = -107.0 +margin_right = 169.0 +margin_bottom = -42.0 +focus_neighbour_bottom = NodePath("../Exit_Button") +text = "Continue" + +[node name="Exit_Button" type="Button" parent="PauseMenu/Background"] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -83.0 +margin_top = 45.0 +margin_right = 83.0 +margin_bottom = 110.0 +focus_neighbour_top = NodePath("../Continue_Button") +text = "Exit" + +[node name="Shattered1" type="TextureRect" parent="PauseMenu/Background"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -176.0 +margin_top = 94.0 +margin_right = -80.0 +margin_bottom = 190.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 + +[node name="SImg1" type="TextureRect" parent="PauseMenu/Background/Shattered1"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 6 ) +stretch_mode = 5 + +[node name="Shattered2" type="TextureRect" parent="PauseMenu/Background"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -48.0 +margin_top = 94.0 +margin_right = 48.0 +margin_bottom = 190.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 + +[node name="SImg2" type="TextureRect" parent="PauseMenu/Background/Shattered2"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 7 ) +stretch_mode = 5 + +[node name="ExtraDone" type="TextureRect" parent="PauseMenu/Background"] +visible = false +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = -48.0 +margin_top = 538.0 +margin_right = 48.0 +margin_bottom = 634.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 + +[node name="EImg" type="TextureRect" parent="PauseMenu/Background/ExtraDone"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 8 ) +stretch_mode = 5 + +[node name="Shattered3" type="TextureRect" parent="PauseMenu/Background"] +anchor_left = 0.5 +anchor_right = 0.5 +margin_left = 80.0 +margin_top = 94.0 +margin_right = 176.0 +margin_bottom = 190.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +stretch_mode = 5 + +[node name="SImg3" type="TextureRect" parent="PauseMenu/Background/Shattered3"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 5 ) +stretch_mode = 5 + +[node name="AudioGUI" type="AudioStreamPlayer" parent="PauseMenu"] +stream = ExtResource( 3 ) + +[connection signal="focus_entered" from="PauseMenu/Background/Continue_Button" to="." method="_on_Button_focus_entered"] +[connection signal="pressed" from="PauseMenu/Background/Continue_Button" to="." method="_on_Continue_Button_pressed"] +[connection signal="focus_entered" from="PauseMenu/Background/Exit_Button" to="." method="_on_Button_focus_entered"] +[connection signal="pressed" from="PauseMenu/Background/Exit_Button" to="." method="_on_Exit_Button_pressed"] diff --git a/project/Player.gd b/project/Player.gd new file mode 100644 index 0000000..3d76aed --- /dev/null +++ b/project/Player.gd @@ -0,0 +1,162 @@ +extends KinematicBody2D + +signal shoot(bullet, direction, location) +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +onready var _animation = $AnimatedSprite +onready var type = "Player" +var hp = 5 +var suikas = 1 +var speed = 120 +var velocity = Vector2() +var direction = Vector2(1, 0) +var melee = preload("res://PlayerAttack.tscn") +var suika = preload("res://SuikaShot.tscn") +var invincible = false +var cutscene_mode = false +var boss_battle = false +var tired = false + +var canuse_melee = true + +func invincible_on(): + invincible = true + +func invincible_off(): + invincible = false + +func cutscene_on(): + invincible = true + cutscene_mode = true + +func cutscene_off(): + invincible = false + cutscene_mode = false + +func tire(): + tired = true + invincible = true + $AnimatedSprite.flip_v = true + $AnimatedSprite.scale.y = 0.7 + $AnimationPlayer.play("invincible") + $HPRegen.start(0.5) + +func untire(): + $AnimatedSprite.flip_v = false + $AnimatedSprite.scale.y = 1 + $AnimationPlayer.stop() + $HPRegen.start(5) + invincible = false + tired = false + +func get_hit(): + if !invincible: + $AudioHurt.play() + hp -= 1 + invincible = true + $AnimationPlayer.play("invincible") + $InvTimer.start() + if hp <= 0: + tire() + + +# Called when the node enters the scene tree for the first time. +func _ready(): + _animation.play("default") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _physics_process(delta): + if !cutscene_mode and !tired: + $HPcount.text = String(hp) + $Suikacount.text = String(suikas) + if Input.is_action_pressed("ui_left"): + velocity.x = -speed + elif Input.is_action_pressed("ui_right"): + velocity.x = speed + else: + velocity.x = 0 + + if Input.is_action_pressed("ui_up"): + velocity.y = -speed + elif Input.is_action_pressed("ui_down"): + velocity.y = speed + else: + velocity.y = 0 + + if velocity.length() > 0: + velocity = velocity.normalized() * speed + direction = velocity.normalized() + _animation.play("walk") + else: + _animation.play("default") + + if velocity.x != 0: + _animation.flip_h = velocity.x < 0 + + move_and_slide(velocity) + + if Input.is_action_just_pressed("player_attack"): + if canuse_melee: + canuse_melee = false + $MeleeCooldown.start() + var melee_instance = melee.instance() + add_child(melee_instance) + melee_instance.position = direction * 20 + melee_instance.look_at(to_global(direction)) + + if !boss_battle: + if Input.is_action_just_pressed("ui_cancel"): + if suikas > 0: + suikas -= 1 + emit_signal('shoot', suika, get_angle_to(to_global(direction)), position) + else: + $Suikacount.text = '' + elif cutscene_mode: + $HPcount.text = '' + $Suikacount.text = '' + else: + $HPcount.text = String(hp) + if !boss_battle: + $Suikacount.text = String(suikas) + else: + $Suikacount.text = '' + + +func _on_InvTimer_timeout(): + invincible = false + $AnimationPlayer.stop() + $AnimatedSprite.modulate.a = 1 + + +func _on_HPRegen_timeout(): + if hp < 5: + hp += 1 + + if hp >= 5 and tired: + untire() + + +func _on_SuikaRegen_timeout(): + if suikas < 3: + suikas += 1 + + +func _on_InteractArea_body_entered(body): + if body.get('type') == "Shattered1": + body.queue_free() + var dialogue = Dialogic.start('Shattered1') + add_child(dialogue) + elif body.get('type') == "Shattered2": + body.queue_free() + var dialogue = Dialogic.start('Shattered2') + add_child(dialogue) + elif body.get('type') == "Shattered3": + body.queue_free() + var dialogue = Dialogic.start('Shattered3') + add_child(dialogue) + + +func _on_MeleeCooldown_timeout(): + canuse_melee = true diff --git a/project/Player.tscn b/project/Player.tscn new file mode 100644 index 0000000..87ff82b --- /dev/null +++ b/project/Player.tscn @@ -0,0 +1,105 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://sprites/yuyuko.tres" type="SpriteFrames" id=1] +[ext_resource path="res://Player.gd" type="Script" id=2] +[ext_resource path="res://new_theme.tres" type="Theme" id=3] +[ext_resource path="res://sfx/get_hit.wav" type="AudioStream" id=4] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 5.5, 4 ) + +[sub_resource type="CircleShape2D" id=2] +radius = 17.0294 + +[sub_resource type="Animation" id=3] +resource_name = "invincible" +length = 0.2 +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("AnimatedSprite:modulate") +tracks/0/interp = 0 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.1 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0.501961 ) ] +} + +[node name="Player" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0.5, 7 ) +shape = SubResource( 1 ) + +[node name="Camera2D" type="Camera2D" parent="."] +current = true +zoom = Vector2( 0.2, 0.2 ) +limit_left = 0 +limit_top = 0 +limit_right = 640 +limit_bottom = 360 +smoothing_enabled = true + +[node name="HPcount" type="Label" parent="."] +margin_left = -26.0 +margin_top = -32.0 +margin_right = -4.0 +margin_bottom = -14.0 +theme = ExtResource( 3 ) +custom_colors/font_color = Color( 0.470588, 0.415686, 0.901961, 1 ) +custom_colors/font_color_shadow = Color( 0, 0, 0, 1 ) +text = "H" + +[node name="Suikacount" type="Label" parent="."] +margin_left = -26.0 +margin_top = -17.0 +margin_right = -4.0 +margin_bottom = 0.999998 +rect_scale = Vector2( 0.7, 0.7 ) +theme = ExtResource( 3 ) +custom_colors/font_color = Color( 0.901961, 0.690196, 0.415686, 1 ) +custom_colors/font_color_shadow = Color( 0, 0, 0, 1 ) +text = "H" + +[node name="InvTimer" type="Timer" parent="."] +wait_time = 1.3 +one_shot = true + +[node name="HPRegen" type="Timer" parent="."] +wait_time = 5.0 +autostart = true + +[node name="SuikaRegen" type="Timer" parent="."] +wait_time = 3.0 +autostart = true + +[node name="MeleeCooldown" type="Timer" parent="."] +wait_time = 0.4 +one_shot = true + +[node name="InteractArea" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="InteractArea"] +shape = SubResource( 2 ) + +[node name="Listener2D" type="Listener2D" parent="."] +current = true + +[node name="AudioHurt" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 4 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +anims/invincible = SubResource( 3 ) + +[connection signal="timeout" from="InvTimer" to="." method="_on_InvTimer_timeout"] +[connection signal="timeout" from="HPRegen" to="." method="_on_HPRegen_timeout"] +[connection signal="timeout" from="SuikaRegen" to="." method="_on_SuikaRegen_timeout"] +[connection signal="timeout" from="MeleeCooldown" to="." method="_on_MeleeCooldown_timeout"] +[connection signal="body_entered" from="InteractArea" to="." method="_on_InteractArea_body_entered"] diff --git a/project/PlayerAttack.gd b/project/PlayerAttack.gd new file mode 100644 index 0000000..a04203d --- /dev/null +++ b/project/PlayerAttack.gd @@ -0,0 +1,30 @@ +extends Area2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + $CollisionShape2D.set_deferred('disabled', false) + $AnimatedSprite.play("default") + $AudioStreamPlayer.play() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass + + +func _on_AnimatedSprite_animation_finished(): + queue_free() + + +func _on_PlayerAttack_body_entered(body): + if body.get('type') == "Fairy": + body.queue_free() + elif body.get('type') == "Boss": + body.get_hit() + $CollisionShape2D.set_deferred('disabled', true) diff --git a/project/PlayerAttack.tscn b/project/PlayerAttack.tscn new file mode 100644 index 0000000..4857855 --- /dev/null +++ b/project/PlayerAttack.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://sprites/playermelee.png" type="Texture" id=1] +[ext_resource path="res://PlayerAttack.gd" type="Script" id=2] +[ext_resource path="res://sfx/melee_atk.ogg" type="AudioStream" id=3] + +[sub_resource type="AtlasTexture" id=1] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 9, 28 ) + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 1 ) +region = Rect2( 9, 0, 9, 28 ) + +[sub_resource type="AtlasTexture" id=3] +atlas = ExtResource( 1 ) +region = Rect2( 18, 0, 9, 28 ) + +[sub_resource type="AtlasTexture" id=4] +atlas = ExtResource( 1 ) +region = Rect2( 27, 0, 9, 28 ) + +[sub_resource type="AtlasTexture" id=5] +atlas = ExtResource( 1 ) +region = Rect2( 36, 0, 9, 28 ) + +[sub_resource type="SpriteFrames" id=6] +animations = [ { +"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ) ], +"loop": true, +"name": "default", +"speed": 20.0 +} ] + +[sub_resource type="RectangleShape2D" id=7] +extents = Vector2( 5.5, 15 ) + +[node name="PlayerAttack" type="Area2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 6 ) +flip_h = true +flip_v = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0.5, 0 ) +shape = SubResource( 7 ) + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="."] +stream = ExtResource( 3 ) +volume_db = -1.564 + +[connection signal="body_entered" from="." to="." method="_on_PlayerAttack_body_entered"] +[connection signal="animation_finished" from="AnimatedSprite" to="." method="_on_AnimatedSprite_animation_finished"] diff --git a/project/README.md b/project/README.md new file mode 100644 index 0000000..76e8464 --- /dev/null +++ b/project/README.md @@ -0,0 +1,94 @@ +![dialogic-cover](https://user-images.githubusercontent.com/2206700/156223574-5052c607-408e-4143-80b5-c4aed1cf29a2.png) + +Create dialogs, characters and scenes to display conversations in your Godot games. + +[Changelog](https://github.com/coppolaemilio/dialogic/blob/main/addons/dialogic/Documentation/Content/Changelog.md) — +[Installation](#installation) — +[Documentation](https://github.com/coppolaemilio/dialogic/blob/main/addons/dialogic/Documentation/Content/Welcome.md) — +[Credits](#credits) + + +# Version 1.4.5 - Afterlife ![Godot v3.4](https://img.shields.io/badge/Godot-v3.4-%23478cbf) ![Godot v3.5](https://img.shields.io/badge/Godot-v3.5-%23478cbf) + +### ⚠️ + +# We are working on the new 2.0 version. +- If you are interested in contributing [feel free to visit the main branch](https://github.com/coppolaemilio/dialogic). +- Only bug fixes are going to be merged to this branch + + +----- +## Getting started + +You can read a step by step guide on how to use [Dialogic here](https://github.com/coppolaemilio/dialogic/blob/main/addons/dialogic/Documentation/Content/Tutorials/BeginnersGuideStepByStep.md) + +## 📚 Documentation +You can check the documentation from inside the plugin or [here](https://github.com/coppolaemilio/dialogic/blob/main/addons/dialogic/Documentation/Content/Welcome.md) + +## Installation + +To install a Dialogic, download it as a ZIP archive. All releases are listed here: [releases](https://github.com/coppolaemilio/dialogic/releases). Then extract the ZIP archive and move the `addons/` folder it contains into your project folder. Then, enable the plugin in project settings. + +If you want to know more about installing plugins you can read the [Godot docs page](https://docs.godotengine.org/en/stable/tutorials/plugins/editor/installing_plugins.html). + +You can also install Dialogic using the **AssetLib** tab in the editor, but the version here will not be the latest one available since it takes some time for it to be approved. + +## ⚠ IMPORTANT +There has been some people having issues exporting their games. If you are having issues you can try to add `*.cgh` and `*.json` to your export settings [(image)](https://coppolaemilio.com/images/dialogic/exporting-2.png). If it is not that, try having at least 1 theme in your project. If you still have issues, please [open an issue](https://github.com/coppolaemilio/dialogic/issues). + + +--- + +## 📃 Credits +Made by [Emilio Coppola](https://github.com/coppolaemilio). + +Contributors: [Jowan-Spooner](https://github.com/Jowan-Spooner), [zaknafean](https://github.com/zaknafean), [Arnaud](https://github.com/arnaudvergnet), [ellogwen](https://github.com/ellogwen), [Tim Krief](https://github.com/timkrief), [and more!](https://github.com/coppolaemilio/dialogic/graphs/contributors). Special thanks: [Toen](https://twitter.com/ToenAndreMC), Òscar, [Francisco Presencia](https://francisco.io/). Placeholder images are from [Toen's](https://toen.world/) [YouTube DF series](https://www.youtube.com/watch?v=B1ggwiat7PM) + +### Thank you to all my [Patreons](https://www.patreon.com/coppolaemilio) for making this possible! + +Mike King, +Allyson Ota, +Gemma M. Rull, +newyear Studios, +Joe Constant, +kycho , +Luke Peters, +Wapiti ., +Garrett Guillotte, +Karl Anderson, +Alex (Well Done Games), +GodofGrunts , +Tim Krief, +Daniel Cheney, +Carlo Cabanilla, +Flaming Potato, +Joseph Catrambone, +AzulCrescent , +Hector Na Em, +BasicIncomePlz, +p sis, +Sukh Atwal, +Patrick Hogan, +Jesse Priest, +Ceah Sharp, +Mark Charnock, +soliare, +Anthony Wilson, +KvaGram , +Steven Shearer, +Carter Lilley, +CorbineCaleb, +Thick Biscuit, +Rodemarck Júnior, +Jim Hewell, +White Vulture, +Brianna Allen, +teesloane, +RagingRoosevelt, +Jacquelinett + + + +Support me on [Patreon https://www.patreon.com/coppolaemilio](https://www.patreon.com/coppolaemilio) + +[MIT License](https://github.com/coppolaemilio/dialogic/blob/main/LICENSE) diff --git a/project/Shattered1.gd b/project/Shattered1.gd new file mode 100644 index 0000000..c5a23d1 --- /dev/null +++ b/project/Shattered1.gd @@ -0,0 +1,16 @@ +extends StaticBody2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +var type = 'Shattered1' + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AnimatedSprite.play("default") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/project/Shattered1.tscn b/project/Shattered1.tscn new file mode 100644 index 0000000..c73ecd3 --- /dev/null +++ b/project/Shattered1.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://sprites/shattered1.png" type="Texture" id=1] +[ext_resource path="res://Shattered1.gd" type="Script" id=2] + +[sub_resource type="AtlasTexture" id=1] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 9, 10 ) + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 1 ) +region = Rect2( 9, 0, 9, 10 ) + +[sub_resource type="AtlasTexture" id=3] +atlas = ExtResource( 1 ) +region = Rect2( 18, 0, 9, 10 ) + +[sub_resource type="AtlasTexture" id=4] +atlas = ExtResource( 1 ) +region = Rect2( 27, 0, 9, 10 ) + +[sub_resource type="SpriteFrames" id=5] +animations = [ { +"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ) ], +"loop": true, +"name": "default", +"speed": 5.0 +} ] + +[sub_resource type="RectangleShape2D" id=6] +extents = Vector2( 4, 4 ) + +[node name="Shattered1" type="StaticBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 5 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 6 ) diff --git a/project/Shattered2.gd b/project/Shattered2.gd new file mode 100644 index 0000000..560298d --- /dev/null +++ b/project/Shattered2.gd @@ -0,0 +1,16 @@ +extends StaticBody2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +var type = 'Shattered2' + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AnimatedSprite.play("default") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/project/Shattered2.tscn b/project/Shattered2.tscn new file mode 100644 index 0000000..1fc032c --- /dev/null +++ b/project/Shattered2.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://sprites/car.png" type="Texture" id=1] +[ext_resource path="res://Shattered2.gd" type="Script" id=2] + +[sub_resource type="AtlasTexture" id=7] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 124, 91 ) + +[sub_resource type="AtlasTexture" id=8] +atlas = ExtResource( 1 ) +region = Rect2( 124, 0, 124, 91 ) + +[sub_resource type="AtlasTexture" id=9] +atlas = ExtResource( 1 ) +region = Rect2( 248, 0, 124, 91 ) + +[sub_resource type="AtlasTexture" id=10] +atlas = ExtResource( 1 ) +region = Rect2( 372, 0, 124, 91 ) + +[sub_resource type="SpriteFrames" id=5] +animations = [ { +"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 10 ) ], +"loop": true, +"name": "default", +"speed": 5.0 +} ] + +[sub_resource type="RectangleShape2D" id=6] +extents = Vector2( 62, 46 ) + +[node name="Shattered2" type="StaticBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 5 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 6 ) diff --git a/project/Shattered3.gd b/project/Shattered3.gd new file mode 100644 index 0000000..6cb3dfe --- /dev/null +++ b/project/Shattered3.gd @@ -0,0 +1,16 @@ +extends StaticBody2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +var type = 'Shattered3' + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AnimatedSprite.play("default") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/project/Shattered3.tscn b/project/Shattered3.tscn new file mode 100644 index 0000000..f6cc455 --- /dev/null +++ b/project/Shattered3.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://Shattered3.gd" type="Script" id=1] +[ext_resource path="res://sprites/petals.png" type="Texture" id=2] + +[sub_resource type="AtlasTexture" id=7] +atlas = ExtResource( 2 ) +region = Rect2( 0, 0, 26, 43 ) + +[sub_resource type="AtlasTexture" id=8] +atlas = ExtResource( 2 ) +region = Rect2( 26, 0, 26, 43 ) + +[sub_resource type="AtlasTexture" id=9] +atlas = ExtResource( 2 ) +region = Rect2( 52, 0, 26, 43 ) + +[sub_resource type="SpriteFrames" id=5] +animations = [ { +"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ) ], +"loop": true, +"name": "default", +"speed": 5.0 +} ] + +[sub_resource type="RectangleShape2D" id=6] +extents = Vector2( 13, 23 ) + +[node name="Shattered3" type="StaticBody2D"] +script = ExtResource( 1 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 5 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 0, 1 ) +shape = SubResource( 6 ) diff --git a/project/SuikaShot.gd b/project/SuikaShot.gd new file mode 100644 index 0000000..ff0175c --- /dev/null +++ b/project/SuikaShot.gd @@ -0,0 +1,38 @@ +extends Area2D + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +onready var type = "Special" +var velocity = Vector2.RIGHT +var speed = 70 + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AnimatedSprite.play("default") + $AudioStreamPlayer2D.play() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + velocity = velocity.normalized() * speed * delta + position += velocity + + +func _on_FairyShot_body_entered(body): + if body.get('type') == "Fairy": + body.queue_free() + + +func _on_VisibilityNotifier2D_screen_exited(): + queue_free() + + +func _on_Timer_timeout(): + queue_free() + + +func _on_SuikaShot_area_entered(area): + if area.get('type') == "Bullet": + area.queue_free() diff --git a/project/SuikaShot.tscn b/project/SuikaShot.tscn new file mode 100644 index 0000000..51d35eb --- /dev/null +++ b/project/SuikaShot.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=14 format=2] + +[ext_resource path="res://sprites/suikashot.png" type="Texture" id=1] +[ext_resource path="res://SuikaShot.gd" type="Script" id=2] +[ext_resource path="res://sfx/suika_shot.wav" type="AudioStream" id=3] + +[sub_resource type="AtlasTexture" id=2] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=3] +atlas = ExtResource( 1 ) +region = Rect2( 31, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=4] +atlas = ExtResource( 1 ) +region = Rect2( 62, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=5] +atlas = ExtResource( 1 ) +region = Rect2( 93, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=6] +atlas = ExtResource( 1 ) +region = Rect2( 124, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=7] +atlas = ExtResource( 1 ) +region = Rect2( 155, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=8] +atlas = ExtResource( 1 ) +region = Rect2( 186, 0, 31, 24 ) + +[sub_resource type="AtlasTexture" id=9] +atlas = ExtResource( 1 ) +region = Rect2( 217, 0, 31, 24 ) + +[sub_resource type="SpriteFrames" id=10] +animations = [ { +"frames": [ SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 6 ), SubResource( 7 ), SubResource( 8 ), SubResource( 9 ) ], +"loop": true, +"name": "default", +"speed": 8.0 +} ] + +[sub_resource type="RectangleShape2D" id=1] +extents = Vector2( 15, 14 ) + +[node name="SuikaShot" type="Area2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 10 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) + +[node name="VisibilityNotifier2D" type="VisibilityNotifier2D" parent="."] +scale = Vector2( 1.7, 1.4 ) + +[node name="Timer" type="Timer" parent="."] +wait_time = 3.0 +one_shot = true +autostart = true + +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource( 3 ) + +[connection signal="area_entered" from="." to="." method="_on_SuikaShot_area_entered"] +[connection signal="body_entered" from="." to="." method="_on_FairyShot_body_entered"] +[connection signal="screen_exited" from="VisibilityNotifier2D" to="." method="_on_VisibilityNotifier2D_screen_exited"] +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/project/Youmu.gd b/project/Youmu.gd new file mode 100644 index 0000000..9623cce --- /dev/null +++ b/project/Youmu.gd @@ -0,0 +1,71 @@ +extends KinematicBody2D + +signal shoot(bullet, direction, location) +signal dead() + +# Declare member variables here. Examples: +# var a = 2 +onready var type = "Boss" +var velocity = Vector2() +var direction = Vector2() +var hp = 10 +var speed = 90 +var shot_speed = 150 +var fairy_shot = preload("res://FairyShot.tscn") +var cutscene_mode = false + +func cutscene_on(): + cutscene_mode = true + +func cutscene_off(): + cutscene_mode = false + +func get_hit(): + $AudioHurt.play() + hp -= 1 + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AnimatedSprite.play("default") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _physics_process(delta): + if !cutscene_mode: + $HPcount.text = String(hp) + else: + $HPcount.text = '' + + if velocity.x != 0: + $AnimatedSprite.flip_h = velocity.x < 0 + move_and_slide(velocity) + if hp <= 0: + queue_free() + + +func _on_Timer_timeout(): + emit_signal('shoot', fairy_shot, deg2rad(rand_range(0, 359)), position) + + +func _on_PlayerIndicator_body_entered(body): + if body.get('type') == "Player": + $Timer.start(0.1) + + +func _on_PlayerIndicator_body_exited(body): + if body.get('type') == "Player": + $Timer.stop() + + +func _on_DangerIndicator_body_entered(body): + if body.get('type') == "Player": + velocity = -to_local(body.position).normalized() * speed + + +func _on_DangerIndicator_body_exited(body): + if body.get('type') == "Player": + velocity = Vector2.ZERO + + +func _on_Fairy1_tree_exiting(): + emit_signal('dead') diff --git a/project/Youmu.tscn b/project/Youmu.tscn new file mode 100644 index 0000000..d951905 --- /dev/null +++ b/project/Youmu.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=13 format=2] + +[ext_resource path="res://sprites/youmu.png" type="Texture" id=1] +[ext_resource path="res://Youmu.gd" type="Script" id=2] +[ext_resource path="res://new_theme.tres" type="Theme" id=3] +[ext_resource path="res://sfx/get_hit.wav" type="AudioStream" id=4] + +[sub_resource type="AtlasTexture" id=7] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 16, 29 ) + +[sub_resource type="AtlasTexture" id=8] +atlas = ExtResource( 1 ) +region = Rect2( 16, 0, 16, 29 ) + +[sub_resource type="AtlasTexture" id=9] +atlas = ExtResource( 1 ) +region = Rect2( 32, 0, 16, 29 ) + +[sub_resource type="AtlasTexture" id=10] +atlas = ExtResource( 1 ) +region = Rect2( 48, 0, 16, 29 ) + +[sub_resource type="SpriteFrames" id=3] +animations = [ { +"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 10 ) ], +"loop": true, +"name": "default", +"speed": 7.0 +} ] + +[sub_resource type="RectangleShape2D" id=4] +extents = Vector2( 6, 10.5 ) + +[sub_resource type="RectangleShape2D" id=5] +extents = Vector2( 125, 119 ) + +[sub_resource type="RectangleShape2D" id=6] +extents = Vector2( 85, 80 ) + +[node name="Youmu" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 3 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 3, -0.5 ) +shape = SubResource( 4 ) + +[node name="PlayerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerIndicator"] +shape = SubResource( 5 ) + +[node name="DangerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DangerIndicator"] +shape = SubResource( 6 ) + +[node name="Timer" type="Timer" parent="."] + +[node name="HPcount" type="Label" parent="."] +margin_left = -26.0 +margin_top = -32.0 +margin_right = -4.0 +margin_bottom = -14.0 +theme = ExtResource( 3 ) +custom_colors/font_color = Color( 0.886275, 0.290196, 0.290196, 1 ) +custom_colors/font_color_shadow = Color( 0, 0, 0, 1 ) +text = "H" + +[node name="AudioHurt" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource( 4 ) + +[connection signal="tree_exiting" from="." to="." method="_on_Fairy1_tree_exiting"] +[connection signal="body_entered" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_entered"] +[connection signal="body_exited" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_exited"] +[connection signal="body_entered" from="DangerIndicator" to="." method="_on_DangerIndicator_body_entered"] +[connection signal="body_exited" from="DangerIndicator" to="." method="_on_DangerIndicator_body_exited"] +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/project/Yukari.gd b/project/Yukari.gd new file mode 100644 index 0000000..2ac5201 --- /dev/null +++ b/project/Yukari.gd @@ -0,0 +1,74 @@ +extends KinematicBody2D + +signal shoot(bullet, direction, location) +signal dead() + +# Declare member variables here. Examples: +# var a = 2 +onready var type = "Boss" +var velocity = Vector2() +var direction = Vector2() +var hp = 5 +var speed = 90 +var shot_speed = 150 +var fairy_shot = preload("res://FairyShot.tscn") +var cutscene_mode = false + +func cutscene_on(): + cutscene_mode = true + +func cutscene_off(): + cutscene_mode = false + +func get_hit(): + $AudioHurt.play() + if hp > 1: + hp -= 1 + else: + hp -= 0.1 + +# Called when the node enters the scene tree for the first time. +func _ready(): + $AnimatedSprite.play("default") + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _physics_process(delta): + if !cutscene_mode: + $HPcount.text = String(hp) + else: + $HPcount.text = '' + + if velocity.x != 0: + $AnimatedSprite.flip_h = velocity.x < 0 + move_and_slide(velocity) + if hp <= 0: + queue_free() + + +func _on_Timer_timeout(): + emit_signal('shoot', fairy_shot, deg2rad(rand_range(0, 359)), position) + + +func _on_PlayerIndicator_body_entered(body): + if body.get('type') == "Player": + $Timer.start(0.1) + + +func _on_PlayerIndicator_body_exited(body): + if body.get('type') == "Player": + $Timer.stop() + + +func _on_DangerIndicator_body_entered(body): + if body.get('type') == "Player": + velocity = -to_local(body.position).normalized() * speed + + +func _on_DangerIndicator_body_exited(body): + if body.get('type') == "Player": + velocity = Vector2.ZERO + + +func _on_Fairy1_tree_exiting(): + emit_signal('dead') diff --git a/project/Yukari.tscn b/project/Yukari.tscn new file mode 100644 index 0000000..32de137 --- /dev/null +++ b/project/Yukari.tscn @@ -0,0 +1,81 @@ +[gd_scene load_steps=13 format=2] + +[ext_resource path="res://sprites/yukari.png" type="Texture" id=1] +[ext_resource path="res://Yukari.gd" type="Script" id=2] +[ext_resource path="res://new_theme.tres" type="Theme" id=3] +[ext_resource path="res://sfx/get_hit.wav" type="AudioStream" id=4] + +[sub_resource type="AtlasTexture" id=7] +atlas = ExtResource( 1 ) +region = Rect2( 0, 0, 26, 31 ) + +[sub_resource type="AtlasTexture" id=8] +atlas = ExtResource( 1 ) +region = Rect2( 26, 0, 26, 31 ) + +[sub_resource type="AtlasTexture" id=9] +atlas = ExtResource( 1 ) +region = Rect2( 52, 0, 26, 31 ) + +[sub_resource type="AtlasTexture" id=10] +atlas = ExtResource( 1 ) +region = Rect2( 78, 0, 26, 31 ) + +[sub_resource type="SpriteFrames" id=3] +animations = [ { +"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 10 ) ], +"loop": true, +"name": "default", +"speed": 7.0 +} ] + +[sub_resource type="RectangleShape2D" id=4] +extents = Vector2( 6, 10.5 ) + +[sub_resource type="RectangleShape2D" id=5] +extents = Vector2( 125, 119 ) + +[sub_resource type="RectangleShape2D" id=6] +extents = Vector2( 85, 80 ) + +[node name="Yukari" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="AnimatedSprite" type="AnimatedSprite" parent="."] +frames = SubResource( 3 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +position = Vector2( 3, -0.5 ) +shape = SubResource( 4 ) + +[node name="PlayerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerIndicator"] +shape = SubResource( 5 ) + +[node name="DangerIndicator" type="Area2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="DangerIndicator"] +shape = SubResource( 6 ) + +[node name="Timer" type="Timer" parent="."] + +[node name="HPcount" type="Label" parent="."] +margin_left = -26.0 +margin_top = -32.0 +margin_right = -4.0 +margin_bottom = -14.0 +theme = ExtResource( 3 ) +custom_colors/font_color = Color( 0.886275, 0.290196, 0.290196, 1 ) +custom_colors/font_color_shadow = Color( 0, 0, 0, 1 ) +text = "H" + +[node name="AudioHurt" type="AudioStreamPlayer2D" parent="."] +stream = ExtResource( 4 ) + +[connection signal="tree_exiting" from="." to="." method="_on_Fairy1_tree_exiting"] +[connection signal="body_entered" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_entered"] +[connection signal="body_exited" from="PlayerIndicator" to="." method="_on_PlayerIndicator_body_exited"] +[connection signal="body_entered" from="DangerIndicator" to="." method="_on_DangerIndicator_body_entered"] +[connection signal="body_exited" from="DangerIndicator" to="." method="_on_DangerIndicator_body_exited"] +[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] diff --git a/project/addons/dialogic/Dialog.tscn b/project/addons/dialogic/Dialog.tscn new file mode 100644 index 0000000..02720d5 --- /dev/null +++ b/project/addons/dialogic/Dialog.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Images/Plugin/placeholder.png" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Nodes/DialogProxy.gd" type="Script" id=2] + +[node name="Dialog" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 +texture = ExtResource( 1 ) diff --git a/project/addons/dialogic/Documentation/Content/Changelog.md b/project/addons/dialogic/Documentation/Content/Changelog.md new file mode 100644 index 0000000..727b297 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Changelog.md @@ -0,0 +1,546 @@ +# Changelog + +## v1.4.5 +* Added focus style options for themes [[CptFubar](https://github.com/CptFubar)] +* Fixed a broken font reference [[todd-koeck](https://github.com/todd-koeck)] +* Fix for Nameplate being unaligned [[meyaoigames](https://github.com/meyaoigames)] +* Fix crash if theme is missing on character file [[thebardsrc](https://github.com/thebardsrc)] + +## v1.4.4 +* Added no skip event [[zaknafean](https://github.com/zaknafean)] +* Added auto-advance mode [[zaknafean](https://github.com/zaknafean)] +* Translation Service Speed fixes by [[thebardsrc](https://github.com/thebardsrc)] in https://github.com/coppolaemilio/dialogic/pull/995 +* Fixed some Anima bugs [[zaknafean](https://github.com/zaknafean)] + +## v1.4.3 + +The biggest changes in this version are fixes to a bug when exporting the games. Thank you everyone! + +## What's Changed +* Update Chinese Translation by @magian1127 in https://github.com/coppolaemilio/dialogic/pull/920 +* 1.4: Added simple slide_in character entrance animations by @champbob in https://github.com/coppolaemilio/dialogic/pull/945 +* 1.4: Added simple slide_out character entrance animations by @champbob in https://github.com/coppolaemilio/dialogic/pull/946 +* Fix multi-line code by @lemon37564 in https://github.com/coppolaemilio/dialogic/pull/970 +* 1.4.3 - Fix for export error due to settings theme failure by @zaknafean in https://github.com/coppolaemilio/dialogic/pull/978 +* 1.4.3 - Fix for #904 by @zaknafean in https://github.com/coppolaemilio/dialogic/pull/979 + +## New Contributors +* @champbob made their first contribution in https://github.com/coppolaemilio/dialogic/pull/945 +* @lemon37564 made their first contribution in https://github.com/coppolaemilio/dialogic/pull/970 + +**Full Changelog**: https://github.com/coppolaemilio/dialogic/compare/1.4.2...1.4.3 + +## v1.4.2 - Afterlife +- Fixed an issue with MacOS and text events not adjusting their size properly +- Android exports should work again [[zaknafean](https://github.com/zaknafean)] +- Add setting to disable the mouse block of the dialog node [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Default settings adjustments [[zaknafean](https://github.com/zaknafean)] + - Fixed the 'default' setting not appearing after you set it for hotkey choices + - Fixed hotkey choice settings layout + - Changed the default status of autofocus from true to false +- A basic touch to advance implementation (#876) [[zaknafean](https://github.com/zaknafean)] +- Added support for 9-patch rectangles for Dialog Box textures (#286) [[zaknafean](https://github.com/zaknafean)] +- Added finer controls to Text and Box positions (#761) [[lamsorsen](https://github.com/lamsorsen)] + - **Box margin** replaced with **Margin** for the DialogBox settings + - **Box Padding** has been removed from the DialogBox settings, and replaced with **Margin** for the Dialog Text setting to clear up confusion + - The margin Top/Bottom and Left/Right are no longer linked, and can be individually adjusted + - **Please note this change may break some existing themes** +- Added option to recenter character portraits automatically [[thebardsrc](https://github.com/thebardsrc)] + + +## v1.4.1 - Animations hotfix +- Portrait-Animation fixes: + Because the animations should work both with Controls and Node2Ds, just using node.scale won't work. Now they all use DialogicAnimaPropertiesHelper.get_scale(node), which will automatically use the correct one. [[Jowan-Spooner](https://github.com/Jowan-Spooner)]. Thanks a lot to @[zaknafean](https://github.com/zaknafean) + + +## v1.4 - Curves Ahead +#### Events +- Wait seconds event can now be set to be skipped with the user's action [[SimonLammer](https://github.com/SimonLammer)] +- New events: `Label Event` and `Go to Event`. This will help you creating an anchor position to go back to.[[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Text event improvements: + - You can now make a list of words like this: `[word1,word2,word3]` and Dialogic will pick a random word from the list. If the word is a Dialogic variable name and it gets picked it will show the value of that variable. + - New commands [signal=argument], [pause=wait_time], [play=soundname], [nw=v] (for waiting until the audio finishes) added to the Text Event [[KvaGram](https://github.com/KvaGram)] +- The Character Join and Character Leave events have been removed in favor of the new `Character Event`. They will be converted automatically. The new events allows for more customization including animations. These use the anima system. Learn more about the [event](./Events/002.md) and the [animations](./Tutorials/AddNewAnimations.md) [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- The `Call Node Event` now sends arguments instead of a single array. If you were using it in one of your timelines you will need to update the functions you are calling to accommodate this. [[AnidemDex](https://github.com/AnidemDex)] + + +#### Settings/Themes +- Added: `Autofocus choices` in the settings [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Added: A panel with `History functionality` can be enabled and configured in the settings. For further information read the [reference](./Reference/History.md) [[zaknafean](https://github.com/zaknafean)] +- You can now set the character dim color from the theme settings [[Tim Krief](https://github.com/timkrief)] + - Removed the setting to dim character portraits from the global settings + - Added a setting to control the dim speed [[thebardsrc](https://github.com/thebardsrc)] +- You can now set a `custom theme per character` [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Added a setting for behavior to re-center the portrait each time it's changed from a text event. This fixes a number of portrait issues and is enabled by default, but is a BREAKING change, so please remember to disable this if you need the old behavior. [[thebardsrc](https://github.com/thebardsrc)] +- New setting to use "Keep Aspect Centered" instead of stretch for the Background event [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- You can now vertically align the text in the dialog box [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- You can now specify hotkeys for the choices or use default hot-keys (1-9) [[zaknafean](https://github.com/zaknafean)] +- A new `dialogic_default_action` has been added and is the new default. We encourage you not to mess with the ui_* input actions. [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- You can now make portraits appear in front of the dialog box with a setting in the themes [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- The name label can now be disabled [[nickfla1](https://github.com/nickfla1)] +- A new option will make it so the dialog doesn't get deleted after the last event allowing for it to be fully integrated into your design [[mechPenSketch](https://github.com/mechPenSketch)] + + +#### Editors +- Character Editor improvements [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- You can now connect signals to the DialogProxyNode (the one you drag and drop in) [[KvaGram](https://github.com/KvaGram)] +- The Timeline Editor has been greatly redesigned resulting in a cleaner view +- You can now preview a timeline by itself from the Timeline Editor [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Improvement of the translations and introduction of German translation [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + + +#### Script +- You can now change the timeline of the active node with the `Dialogic.change_timeline()` function. This will preserve the previous state (characters, background, music, theme) [[mechPenSketch](https://github.com/mechPenSketch)] +- You can now reference values with their full path in `Dialogic.set_variable()` and `Dialogic.get_variable()` [[thebardsrc](https://github.com/thebardsrc)] +- There is now a function to check if a timeline exists `Dialogic.timeline_exists(@timeline_path)` [[thebardsrc](https://github.com/thebardsrc)] +- For the History feature, the `Dialogic.toggle_history()` function has been added +- There is now a function to go to the next event `Dialogic.next_event()` [[mechPenSketch](https://github.com/mechPenSketch)] + +#### Other +- Updates on the documentation and proofreading/fixes made by [[Aurora-Eluvia](https://github.com/Aurora-Eluvia)] +- Improvements on the custom events handling [[idontkillcoyotes](https://github.com/idontkillcoyotes)] +- Markdown parser updated [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Added a state machine to handle Dialogic's current state +- You can now use regular hotkeys in Mac using the `Command` key [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Anima added to handle character animations [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Many minor and major bugs fixed +- Animation can be used on custom portrait scenes [[bitbrain](https://github.com/bitbrain)] + + +## v1.3 - Save me some time +#### General Editor Stuff +- **Builtin documentation** [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Added a button to open the documentation from the nav bar +- The plugin has now **Editor-translation support** and some labels are translated to Chinese [[magian1127](https://github.com/magian1127)] + - Added some initial Spanish translations +- Replaced the default `/addons/dialogic/Dialog.tscn` node with a proxy that creates a dialog using the `Dialogic.start` function instead of the raw node. This will make it easier to update from version to version since the instantiated node will not be changing a lot from version to version. This also moved and renamed the previous `/addons/dialogic/Dialog.tscn` to `/addons/dialogic/Nodes/DialogNode.tscn` and the `dialog_node.gd` is now called `DialogNode.gd` to be more in line with the rest of the project +- CanvasLayer Argument (Dialogic.start()) added to the CSharp Class +- Creating new resources will automatically start the renaming of it +- New plugin icon! It should now display at its proper scale depending on your rendering scale + +#### Timeline Editor: +- A modular **Custom events** implementation [[Jowan-Spooner](https://github.com/Jowan-Spooner)]. Learn about them [here](./Events/Custom Events/CreateCustomEvents.md). +- Added a **preview image on the portrait picker**, so it is easy to know what sprite or scene you are selecting. Thanks to [EmmaH](https://www.youtube.com/channel/UC4y59CMiLxWQQVqVFBYLa3Q) for the idea and [Jowan-Spooner](https://github.com/Jowan-Spooner) for the implementation +- Added **Voice Line support** for Text and Question Events [[RedXGames](https://github.com/RedXGames)]. Learn how to use it [here](./Tutorials/VoiceLines.md). + - Added option to use a certain region of the audio files [[KvaGram](https://github.com/KvaGram)] +- Partial support for **undo and redo** [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Better **light/custom theme support** for the timeline editor [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Changed the Selected Event Style to only have blue borders and not change event color [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Adding an extra space at the end of the timelines so it is easier to drag and drop new events +- After selecting a conditional, the input field of that event will be selected +- Updated UI of the AudioPickers [[Jowan-Spooner]](https://github.com/Jowan-Spooner) +- Automatically scrolling to newly created events when you click on a create event button [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- If no characters are present in the current project the character picker is hidden and a prompt was added in the Character join and Character leave events to create one [[zaknafean](https://github.com/zaknafean)] +- Copy Timeline Name will now return the full path to that timeline + +#### Theme Editor: +- **Updated Audio Settings** [[Tim Krief](https://github.com/timkrief)]: + - you can now select audio for typing, text completed, next event, button hover and button selecting + - Attention: Old typing audio will have to be redone! +- You can now set the **position of the buttons relative to the screen** (Top, Bottom, Center, Left, Right) +- You can now set the choice buttons to be **aligned horizontally or vertically** +- More range for dialog text speed [[zaknafean](https://github.com/zaknafean)] +- A default theme is created on new projects [[zaknafean](https://github.com/zaknafean)] + +#### Ingame Behaviour +- `ATTENTION`: Rework and improvement of the **saving system**. + This includes some breaking changes. Learn all about the new system and how to transition [here](./Tutorials/Saving.md). + - A **visual novel template** with a working menu is being made. You can find it [here](https://github.com/Dialogic-Godot/visual-novel-template). +- `Dialogic.start()` will now use paths for specific timelines. A fallback is in place, but specificity is preferred. For instance: `Dialogic.start('my-timeline')` will search any timeline with that name; `Dialogic.start('/chapter-1/my-timeline')` will open the timeline namde `my-timeline` inside the folder `chapter-1`. +- If the text is too big for your dialog and you see a scrolling bar, you can use the `up` and `down` keys to scroll [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Rework of the character name coloring (using Regex now) [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Regex name compiler now properly escapes special characters [[zaknafean](https://github.com/zaknafean)] + +#### Export +- Removing requirement to manually configure resource export (No need to add `.cfg`, `.json` to your export settings anymore) [[LuRomao](https://github.com/LuRomao)] + +#### Other Stuff: +- Renamed the plugin entry point script from `dialogic.gd` to `plugin.gd` so it better describes what that file does +- Removed the need to use a DialogicSingleton. This causes some slight changes to saving and loading. Learn all about the new system and how to transition [here](./Tutorials/Saving.md). +- Deleted some legacy documentation files +- Adding a warning if you are trying to set or get a variable that wasn't defined + +#### Bug-fixes +##### Editor +- Fixed the `DialogNode` Inspector Timeline Open button issue +- Fixed a reference bug that prevent the duplication of Themes +##### Game +- Changed the default cursor shape that was weird in MacOS +- Dialogs only start typing after the fade-in animation happened +- Fixed a bug that performed the fade-in animation before setting the proper theme +- Fixed a bug that prevented to use the global input setting when selecting option buttons + + + +## v1.2.5 - Possibly breaking eveything. We will never know. +- Loading timeline events on batches to speedup big timelines +- Reduced the amount of nodes inside events to improve loading times +- Fixing the "first time running" bug where you had to reboot dialogic after enabling it for the first time +- Fixing a bug where if you had a node selected in the editor you couldn't open any resource picker +- Fixed a bug when trying to add a new resource after removing one +- Fixed the issue that allowed you to keep loading messages after a dialog close event +- Enabling bbcode to glossary entries +- Simplified some internal code +- Adding new setting to the Set Background event to add fade-in time +- Fixed an issue that caused nested timelines to be deleted whem moving directories [[zaknafean]](https://github.com/zaknafean) +- Settings Editor + - Added a default action key selector so you don't have to set it per theme. The theme action key settings will overwrite the one set in settings. + - Added new setting to select Dialogic's Canvas Layer [[RedXGames]](https://github.com/RedXGames) + + +## v1.2.4 - Gotta go fast +- Fixed an issue with the default scale of the portraits +- Trying to simplify and remove legacy code: +- EditorView.gd: Unified the remove resource confirmation dialogs and removed pointless variable definitions + + +## v1.2.3 - Two releases in one day? +- Hopefully, final attempt to fix the weird event creation bug [[Jowan-Spooner](https://github.com/Jowan-Spooner)] Thanks [[Drawsi](https://github.com/Drawsi)] for the report and testing! + + +## v1.2.2 - Here we go again :') +- Set Value Event: There is now a dice symbol that (when toggled) will reveal to boxes for a minimum and a maximum random number to choose from [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Making a small delay on choices to prevent the people that spam "next" to accidentally select the first option +- Fixed some issues when creating new events in the timeline + + +## v1.2.1 - Get them while they're hot! +- You can now specify for how long to wait in `[nw]` events. `[nw=3]` or whatever number of seconds you want it to wait +- Fixed some issues with the CanvasLayer +- Fixed some issues when creating dialogs using GDScript +- Fixed an issue when changing the current timeline +- Improved the internals of `MasterTree.gd` [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Fixed some issues with the `[nw]` command [[Jowan-Spooner](https://github.com/Jowan-Spooner)] +- Improved the Timeline Editor performance when loading timelines +- Removed the `focus_mode` warning +- Added a new page to the docs about the [Text Events](https://github.com/coppolaemilio/dialogic/blob/main/docs/events/TextEvent.md) +- Fixed a bug when trying to skip fade-in dialog animations [[idontkillcoyotes](https://github.com/idontkillcoyotes)] +- Fixed an issue with typing sounds in exported projects +- Fixed an issue when selecting folders for typing sounds in exporting projects; Thank you [AnidemDex](https://github.com/AnidemDex)! + + +## v1.2 - Organize it! +- Functionality + - Added extra options to allow the user to disable/enable saving of definitions and current timeline [[Arnaud](https://github.com/arnaudvergnet)] + - `Dialogic.start()` will add a CanvasLayer by default to avoid the confusion of not seeing Dialogic when using a camera. [[AnidemDex](https://github.com/AnidemDex)] + - Fixed many issues with portraits fading in and out + - Fixed a bug that prevented the BackgroundMusic event to work correctly [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Experimental translation added! (This change simply adds a new setting to always treat text as a translation key, instead of displaying it directly. When on, text is sent through tr() before any additional checks are performed on it) [[bojjenclon]](https://github.com/bojjenclon) + +- Editor + - Added sub-folders to all the resources to better organize your project [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Improved resource picker aware of sub-folders [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + +- Dialog + - Adding `[nw]` commands to automatically skip the text after 2 seconds without user input (Will be improved in future versions) + - Choices can now print the definition values using the regular `[definition]` syntax + - Next indicator is no longer visible when there are options to select + - You can now use `[speed=3]` or any number to change the speed of an individual event text speed + +- Theme Editor + - Added new fonts selector for italics, bold, and names [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Added new Box Padding settings to the name label. + - Added a new option to make the dialog backgrounds full width + - You can now set a character for the preview message + - Three positions for the name label: Left, Center and Right + - You can set the vertical and horizontal offset of the name label + - Added a new option to enable single portrait mode. In this mode, once the characters join the dialog, only one of them will be visible without the need of making them join and leave every time + - Added a simple fade in animation for dialogs. You can change how long it takes in the `Dialog Box` tab + - New tab added: Audio + - In the audio tab, you can select a sound or set of sounds to play while the text is being typed in the dialog. [[Tim Krief](https://github.com/timkrief)] + +- Character Editor + - You can now add a scene as a portrait, so you can now use AnimatedSprite or whatever you might need + - You can set nicknames to characters [[zakary93](https://github.com/zakary93)] + - Fixed a bug when coloring the names of characters in text [[zakary93](https://github.com/zakary93)] + - Added the resolution of the selected portrait image on the preview box + - You can now import a folder to automatically add all the images inside as portraits + - Removed the legacy "Default Speaker" option. I might revisit something like this in the future + +- Timeline Editor + - You can now select multiple events (`CRTL` for adding/removing an event, `SHIFT` for range select) [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - You can now use `CRTL+C`, `CRTL+X` and `CRTL+V` to copy, cut and paste events [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - You can use `CRTL+D` to duplicate the selection [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - You can use `CRTL+A` and `CRTL+SHIFT+A` to select/deselect all events [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Some shortcuts where redone: Remove events with `DEL`, move selection up/down with the `UP` and `DOWN` arrow keys [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - A SetGlossary event was added that allows to change the info of a glossary item during the game [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - You can now set the portrait of a character based on a definition [[bojjenclon]](https://github.com/bojjenclon) + - New resource picker styles + - Modified the label on the emit signal event so it is easier to understand [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Updated the look of some events and added some useful event warnings + +- Other stuff + - Events have id's now. Nothing should change for the user, but it will be easier to manage the inclusion of new events or modifying existing ones [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Fixed a non-breaking bug that printed some errors on the terminal + +- And many more! (kinda hate not listing all the changes, but don't remember all of them) + + +## v1.1 - With a little help from my friends +- Improved event dragging and selection [[Arnaud Vergnet](https://github.com/arnaudvergnet)] +- Fixed a bug that prevented the deletion of Characters [[AnidemDex](https://github.com/AnidemDex)] +- Fixed a bug that allowed you to overwrite the event on the theme preview dialog +- Added a folder icon to each section of the resource tree +- Greatly improved how the plugin is displayed in different display scales +- You can now filter resources from the main view [[ellogwen](https://github.com/ellogwen)] +- You can now duplicate themes (from the context menu) [[ellogwen](https://github.com/ellogwen)] +- Organized the images and other assets into a tidier structure [[Jowan-Spooner](https://github.com/Jowan-Spooner)] _**Warning!** If you were using the example portrait assets you will have to load them again manually on the character editor_ +- You can now create resources by right clicking the section and selecting "+ New" [[Tim Krief](https://github.com/timkrief)] +- Remade all the PopupMenu items in gdscript and replaced the icons with native editor theme ones. +- Experimental: Added a static proxy for C# projects. _Testing wanted!_ [[mscharley](https://github.com/mscharley)] +- Timeline: + - New event `Call Node`: Call a Godot NodePath and a method name. In addition you can add arguments as well. The Timeline will execute those methods and wait for completion, if the method in question is async and/or yielding [[ellogwen](https://github.com/ellogwen)] + - You now can drag and drop events into the timeline! [[ellogwen](https://github.com/ellogwen)] + - You can un select a selected event by clicking it [[ellogwen](https://github.com/ellogwen)] + - The `Scene Event` can now take other Scenes (`.tscn`) files as backgrounds. [[ellogwen](https://github.com/ellogwen)] + - The `If Condition` event can now use definition variables as values to compare against [[ellogwen](https://github.com/ellogwen)] + - You can now hide `Choice events` if a definition doesn't meet some requirements [[Arnaud](https://github.com/arnaudvergnet)] + - You can now select a character to ask a question in the `Question Event` [[Tim Krief](https://github.com/timkrief)] + - Added very basic syntax highlighting to the `Text Event` editor + - Fixed an indenting bug when removing events + - The `Character Join` event now has a mirror option [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - The `Close Dialog` has a new setting for the duration of the fade-out animation. [[Tim Krief](https://github.com/timkrief)] + - `Scene Event` renamed to `Change Background` to better represent what it does. [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Both `Audio Event` and `Background Music` got more settings (audio Bus, volume, fade-length) [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + + - Shortcuts added! [[ellogwen](https://github.com/ellogwen)] + - Selecting previous and next event in the timeline with `CTRL + UP` and `CTRL + DOWN` + - Moving currently selected event up and down the timeline `ALT + UP` and `ALT + DOWN` + - Remove the currently selected event node and selects the next/last event node `CTRL DELETE` + - Create a new text event node below the currently selected and focus it's textbox to continue writing `CTRL T` +- Character Editor + - There is an option `mirror portraits` below the portrait preview now, that will mirror all portraits when they appear in the game [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Fixed a bug that prevented portrait previews to display if the extension was in capital letters. +- Theme Editor + - Refreshed the UI to make room for more properties for each section + - A reload of the preview dialog is performed when you change a property so you don't have to click the "preview changes" all the time + - Removed the limitation of only 100px for the padding of the dialog box + - Added a new option for changing the color modulation of the dialog background image + - Added new customization options (scale, and offset) to the next indicator image + - Added modulation settings to the name label background texture and the choices buttons background textures [[Jowan-Spooner](https://github.com/Jowan-Spooner)] + - Added an option to use native buttons styles for choices [[Tim Krief](https://github.com/timkrief)] + - Added an advanced option to use a custom scene as a button for choices [[Arnaud Vergnet](https://github.com/arnaudvergnet)] + - Added new settings to set a fixed size for choice buttons (This is used to prevent premade texture stretching) + - Fixed a bug where the text alignment wasn't being shown on the preview + - Fixed a bug with the name label shadow + - Fixed a bug with the "auto color" option in game +- Dialog node + - You can now use [br] to insert line breaks + - Questions now properly show the theme text alignment + - Options now show up when the question text finished displaying [[Arnaud Vergnet](https://github.com/arnaudvergnet)] + - The close dialog now performs a fade-out animation + - Fixed a bug where Glossary Definitions plain text was being added to the name label + - Fixed an issue when trying to display small sprites as characters portraits + - Fixed a bug where portraits didn't come to the front when being focused [[AnidemDex](https://github.com/AnidemDex)] + - Fixed a bug when the display stretch was set to `2D` + - Fixed a bug where empty text lines were not removed properly [[Arnaud Vergnet](https://github.com/arnaudvergnet)] +- Settings + - Added a new option to enable advanced theme settings [[Arnaud Vergnet](https://github.com/arnaudvergnet)] + - Added a new option to toggle the character "focus"/"dim" while speaking +- Added a button in timeline inspector plugin to open the selected timeline in the editor [[ellogwen](https://github.com/ellogwen)] +- Special thanks to [Jowan-Spooner](https://github.com/Jowan-Spooner) for the QA and the facelift on the theme editor + +To view previous changes [click here](https://github.com/coppolaemilio/dialogic/blob/main/CHANGELOG.md). + + +## v1.0 - We made it! 🎉 + - When upgrading from 0.9 to the current version things might not work as expected: + - ⚠ **PLEASE MAKE A BACKUP OF YOUR PROJECT BEFORE UPGRADING** ⚠ + - Glossary variables will be lost + - Glossary related events will not be loaded (`If condition Event` and `Set Value Event`) + - The theme you made in the 0.9 theme editor will be lost. You will have to remake it. + - Video [https://youtu.be/MeaS3zZxpbA](https://youtu.be/MeaS3zZxpbA) + - New layout: + - All editors in the same screen. Say goodbye to tabs! + - You can now rename resources by double clicking them + - New Settings panel for advanced properties + - Settings: + - Re-added the auto color for character names in text messages + - Removing empty Text Event from timelines + - New lines to create new Text Event messages + - Propagation of input to the rest of the Tree + - Character Editor: + - Set the scale of your character's portrait + - Add offset to the portrait + - Timeline Editor: + - New `Theme event` to change the theme in the middle of a timeline + - New `Background Music Event` to play music in your dialog. Music can crossfade when changing track and fade in/out when starting/stopping. + - Re-enabled the `Scene Event` + - Allow making basic calculations such as `+`, `-`, `*`, `/` in `Set value events`. + - Theme Editor: + - You can now add multiple themes. + - Moved the preview button to the left side so it is never hidden by default in small screens. + - New section to edit how the character names are displayed. + - New properties: + - `Box size` set the width and height of the dialogue box in pixels + - `Alignment` you can now align the text displayed (Left, Center, Right) + - `Bottom Gap` The distance between the bottom of the screen and the start of the dialog box. + - `Next animation` Set an animation for the "Next Dialog Indicator" + - Glossary was renamed to Definitions. I feel like the word `Definitions` cover both "variables" and "lore" a bit better. + - Definitions: + - Dynamic types! All variables are just dynamic, so they can be ints, floats or strings. + - The name of a character can be set to be a definition. + - You can display definition values in a Text Event by doing: `[definition name here]`. + - Fixed many resource issues with exported games + - New icons all around. + - Added some basic light theme support. This is not finished, but it is on a much better state than before. + - The events now emit signals. Thank you [Jesse Lieberg](https://github.com/GammaGames) for your first contribution! + - Special thanks to [Arnaud Vergnet](https://github.com/arnaudvergnet) for all your work in improving Definitions, conditional events and many more! 🙇‍♂️ + + +## v0.9 - House keeping + - Video: [https://youtu.be/pL0RWVmlM6g](https://youtu.be/pL0RWVmlM6g) + - Moved `Dialog.tscn` to the root of the addon so it is easier to find. + - Added a link to the documentation from the editor + - Refactored a lot of the code and continued splitting the main plugin code into smaller pieces. + - Rewrote most of the saving and branching systems. + - New tool: Glossary Editor + - You are now able to write extra lore for any word and Dialogic will create a hover card with that extra information. + - You can create `strings` and `number` variables. + - You can access to those variables from the `Dialogic` Class: `Dialogic.get_var('variable_name')` + - In game: + - Portraits changes are reflected in-game. + - Many small improvements. + - Theme Editor: + - New default asset: Glossary Font + - Added new options to customize the glossary popup + - Timeline Editor: + - Added categories for the events. + - Color coded some of the events in the same category to avoid having a distracting rainbow in the timelines. + - Conditional event working, but only with "equal to". More conditions coming later. + - Renamed the `End Branch` file names to match the name of the event. This will break the conditionals you have, but this is the time for making breaking changes. Sorry! + - New `Set Value` event. Change the current value of a glossary variable inside a timeline. This will reset when you close the game, so a saving system will have to be added on the next version. + - New `Emit Signal` event. This event will make the Dialog node emit a signal called `dialogic_signal`. You can connect this in a moment of your timeline with other scripts. + - New `Change Scene` event. You can change the current Scene to whatever `.tscn` you pick. This will happen instantly, but in the future I'll add some transition effects so it is not that abrupt. + - New `Wait Seconds` event. This will hide the dialog and wait X seconds until continuing with the rest of the timeline. + - Created independent Character and Portrait picker for reusing in event nodes. + - Portrait picker added to `Text Events` and `Character Join` events. + - `Text Events` text editor vertical size grows witch each line added. + - `Text Events` now properly create a new message for each line inside the text editor. + - `Text Events` Line count are now displayed next to the preview text when folded. + - Re-adding the `End Branch` event just in case you removed the end and you want to add it again in the timeline. + - Renamed the `Copy Timeline ID` right click menu option to `Copy Timeline Name` since you now have to use that to set the current timeline from code instead of the ID. + - Fixed several bugs that corrupted saved files + - Thanks to [mindtonix](https://github.com/mindtonix) and [Crystalwarrior](https://github.com/Crystalwarrior) for your first contribution on the choice buttons + - New `Dialogic` class. With this new class you can add dialogs from code easily: + ``` + var new_dialog = Dialogic.start('Your Timeline Name Here') + add_child(new_dialog) + ``` + To connect signals you can also do: + + ```swift + func _ready(): + var new_dialog = Dialogic.start('Your Timeline Name Here') + add_child(new_dialog) + new_dialog.connect("dialogic_signal", self, 'signal_from_dialogic') + + func signal_from_dialogic(value): + print(value) + ``` + + +## v0.8 - Dialog enters the game + - Video: [https://youtu.be/NfTyRrsdB1I](https://youtu.be/NfTyRrsdB1I) + - Moved the theme editor tool icon to the left + - Theme Editor: + - Added a color background as an option + - Reduced the vertical size needed to show all options + - Style your choice buttons! (Color, background, etc...) + - Better default support for unchanged styles + - Timeline Editor: + - Moved the event buttons to a new column + - When creating a `Question` two `Choice` events and a `End Branch` event will be added automatically + - Added a warning for `Choice` events on the root level of indentation + - Disabled unfinished events + - The Change Timeline event tells you your current timeline (this is for going back to the start) + - New `Close Dialog` event. This event closes the dialog whenever it is called. + - When renaming a dialog the popup's text field is already selected and focused. + - In game dialog: + - You can now select the current timeline from the inspector without manually copying the timeline id. + - Change timeline event is now working + - Audio event can play sounds + - Character join (left, center and right) working + - Focus in and out of portraits when speaking + - Character leave events working + - Basic question/answers support + - Better scene resizing and position + - Button styles + + +## v0.7 - Looking good + - Video: [https://youtu.be/wREIVj55eBM](https://youtu.be/wREIVj55eBM) + - New plugin tab icon + - Removed legacy files + - From the theme tab you can now: + - Pick the default text color + - Set the shadows and shadow offset + - Select your own fonts (.tres) + - Set background and next indicator images + - Choose an action to trigger the "next" event + - Preview changes in a dialog + - Change text speed + - Set text margins + - Characters tab + - Added context menu + - Moved the Remove Character button to a context menu + - You can open the working directory + - Timeline tab + - Added context menu + - You can remove timelines now + - Right click no longer renames timelines, to do so you have to use the new menu + - You can open the working directory + - You can copy the timeline ID + + +## v0.6 - Character portraits + - Video: [https://youtu.be/okWYt_yGKNI](https://youtu.be/okWYt_yGKNI) + - Splitting the main script into smaller pieces + - Characters + - Characters welcome screen when there are 0 + - Different display name + - Autosave enabled on characters + - Character portraits + - Added Default Speaker setting + - Events: + - Text block now has a portrait dropdown + + +## v0.5 - Indentation Magic + - Video: [https://youtu.be/mrTyWy2TJOM](https://youtu.be/mrTyWy2TJOM) + - Added new events: + - Choice + - End branch + - Change Timeline + - You can now drag and drop events in a timeline + - Made new icons for the editor tabs + - Added some tooltips + - Restructured the events node structure to add indentation + - Changed event default colors + + +## v0.4 - Dialogic + - Video: [https://youtu.be/Hf_gywa6vZE](https://youtu.be/Hf_gywa6vZE) + - Changed how the main editor works, instead of being a graphedit it is now an event timeline. + - Renamed the plugin to Dialogic. Thanks to Òscar for always knowing how to name things. + - Moved all data to .json files + - Broke the addon for working. Nice :) + + +## v0.3 - Using Resources + - Video: [https://youtu.be/PzzOE4LbGAo](https://youtu.be/PzzOE4LbGAo) + - Removed requirement for `global.gd` and `characters.gd` autoload scripts. + - Added `DialogResource` and `DialogCharacterResource` resources to create a cleaner way of specifying dialog content + - Added icon to the existing dialog node. + + +## v0.2 - Adding Characters: + - Changed text speed to fixed per character instead of total time span + - New character support + - Added portrait to characters + - Created the `fade-in` effect + - Curly brackets introduced for character names. + + +## v0.1 - Release + - You can watch the presentation video here [https://youtu.be/TXmf4FP8OCA](https://youtu.be/TXmf4FP8OCA) diff --git a/project/addons/dialogic/Documentation/Content/Events/001.md b/project/addons/dialogic/Documentation/Content/Events/001.md new file mode 100644 index 0000000..1fd9094 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/001.md @@ -0,0 +1,42 @@ +# Text Event +![image](./Images/text_event_1.png) + +The text event is one of the most important, since it contains most of your text. + +## The header +![image](./Images/text_event_2.png) + +There are three different types of options for Text Events: +- **Character** - This is who will be saying the text written inside the text editor. +- **Portrait** - If you picked a **Character**, the different portraits will show up here. If the **Character** doesn't have any special portraits, the default one will be used. If you pick the `(Don't change)` option, it will continue using the previous text event portrait set. If you pick the `[Definition]` option, a new picker will show up. +- **Definition** - You can select a **Definition**, and Dialogic will try to match that string with available portraits. This can be used to dynamically show different portraits depending on previous player input. + +## The Text Editor + +Inside the text editor, you have special features that might not be obvious: + +- Each line will create a new text message. This will help make longer monologues without having to add a new **Text Event** for each message. If you want to disable this, you can do so in the Dialogic settings panel: `Settings -> Dialog -> New lines will create extra messages`. + +- When writing a **Character** name, Dialogic will automatically color the text of that **Character** + +- `[br]` This will add a line break in the position of the tag + +- `[nw] / [nw=2] / [nw=v]` The *no wait* command will tell Dialogic to automatically continue with the next event without any user input. The default time for skipping to the next text is 2 seconds (after all characters are displayed), but you can change how many seconds by setting a number to it (like `[nw=5]` for 5 seconds). You can use [nw=v] to continue after the audio (if any is used) finished. + +- `[speed=X]` You can use the *speed* tag to change the speed during a text event. Placed at the beginning of the event, it will affect the whole text, but each following speed command will overwrite the previous one. Higher numbers result in slower speeds and lower ones in faster speeds. If you want the text to be instant for one message you can do `[speed=0]` and make it show up instantly. +After the event containing the *speed* tag is passed, it will go back to whatever default value you have set on the current theme. + +- `[definition]` If you have a **Definition**, and you want to display its value on inside your text you can use the `[` and `]` characters and the name of your **Definition** within them. Let's say we have a **Definition** called `Money` with the value of `5`. we can write: `You have [Money] left` and Dialogic will replace the `[Money]` tag with the value `You have 5 left`. + +- `[word1,word2,word3]` You can write a list of words like this: `[word1,word2,word3]` and the text event will pick a random word from the list. If the word is a Dialogic variable name and gets picked, it will show the value of that variable. + +- `[signal=argument]` will emit the dialogic signal with the given argument as a String when this place is reached. + +- `[pause=1]` will stop displaying new characters for 1 second before continuing. + +- `[play=click.wav]` will play an audio file with the given name. These files have to be located in `"res://dialogic/sounds/"`. + +- Besides these Dialogic specific options, you can also use the default `BBCode` options that every `RichTextLabel` has like [b]bold[/b] or [i]italic[/i] text, [color=red]colored text[/color] and [wave]using effects![/wave] More about that can be found [here](https://docs.godotengine.org/en/stable/tutorials/gui/bbcode_in_richtextlabel.html). + +## Voice Line Support +You can find a tutorial on how to use the voice line feature in the tutorials folder! \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/002.md b/project/addons/dialogic/Documentation/Content/Events/002.md new file mode 100644 index 0000000..29730bf --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/002.md @@ -0,0 +1,26 @@ +# Character Event +The character event allows you to make characters join and leave as well as animating them and changing their position. + +The first setting picks the mode of the event, `join`, `leave` or `update`. + +For all three you need to select a **character**. +Similarly in all modes you can `animation` and it's `length` in the event body. The [Default] option will use the default join/leave animation that can be set on the dialogic settings page. +The `Wait for animation` setting will make sure the dialog only continues after the animation has fully played. + +## Join Settings +![Event](./Images/Event_Character_Join.PNG) + +You can select a `portrait` (if the character has more then one) and one of the five `positions`. +If you pick the [Definition] option, a new picker will show up. The portrait will be set to the value of that value definition when the dialog reaches that event. This allows for some dynamic portrait picking. + +In the event body you can set the `z_index` and `mirror` the portrait. Note that the z_index only sorts the portraits and is not equivalent to the z_index on 2D nodes. + +## Leave Settings +![Event](./Images/Event_Character_Leave.PNG) +In this mode you can alternatively select the `All characters` option to make all characters leave the scene. + +## Update Settings +![Event](./Images/Event_Character_Update.PNG) +The update settings has all the options of the join mode, but you can enable (pen icon) and disable (reset icon) each of them. Also there are other animations and you can choose to `repeat` the animation a number of times. + +If you want to know more about animations you can [read about them here](https://github.com/coppolaemilio/dialogic/blob/main/addons/dialogic/Documentation/Content/Tutorials/AddingNewAnimations.md). \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/010.md b/project/addons/dialogic/Documentation/Content/Events/010.md new file mode 100644 index 0000000..58f022e --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/010.md @@ -0,0 +1,14 @@ +# Question Event +![image](./Images/Event_Question.PNG) + +The `Question Event` allows your story to branch and give the player options. +When you add a `Question Event`, two [Choice Events](./011.md) and an [End Event](./013.md) will be added automatically. + +## The text editor +The block itself works very similar to a [Text Event](./001.md) and has all the options of that event. + +## The choices +To add choices to your question you can add [Choice Events](./011.md). + +## Ending a question +After all your choices, there also needs to be an [End Event](./013.md). \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/011.md b/project/addons/dialogic/Documentation/Content/Events/011.md new file mode 100644 index 0000000..347cdfd --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/011.md @@ -0,0 +1,11 @@ +# Choice Event +![image](./Images/Event_Choice.PNG) + +The `Choice Event` marks the start of a choice branch in a [question](./010.md). + +## How it works +Choice Events only work if they are placed inside a "question" ([Question Event](./010.md)). Once placed, you can place all kinds of new events below that choice. These events (which will be indented) will be executed when the choice is selected in game. + +## Adding a condition +By checking the `Has condition` check box and setting that condition, the player will only see that choice if the result is true. +The condition is made up of three parts: The `Value Definition` that will be compared, the `type of comparison` and the `value` that it will be compared to. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/012.md b/project/addons/dialogic/Documentation/Content/Events/012.md new file mode 100644 index 0000000..5a97bee --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/012.md @@ -0,0 +1,22 @@ +# Condition Event +![image](./Images/Event_Condition.PNG) + +The `Condition Event` allows you to set certain parts of your timelines to only play under certain conditions. + +## What's a condition? +In programming and games, a condition is mostly described by variables (in Dialogic, these are called `definitions`). +This means that you can check for a definition to have a certain `value` and only play the following events if it matches. + +## The settings +You can set your condition by first selecting the `value definition` that should be compared, then selecting the `type of comparison`, and finally the `value` that should be compared to. +Only the comparison types `Equal to` and `Different from` work with Strings, the rest work with integers (aka, whole numbers). +You can also enter the name of a `value definition` in the input field. This will compare to the current value of that `value definition`. + +## Adding events +You can then add new events below the Condition Event, and they will be indented and only be played when the condition is true. + +## Ending a condition +Every condition needs to have an [End Event](./013.md). After that event, all following events will ignore the condition again. +When creating a Condition Event a End Event will be added too. + +*Note: You can of course have conditions inside conditions. Just make sure to have the same amount of End Events* \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/013.md b/project/addons/dialogic/Documentation/Content/Events/013.md new file mode 100644 index 0000000..ba3c857 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/013.md @@ -0,0 +1,3 @@ +# End Event + +This event adds itself when you add its parent event. Its only function is to mark the end of a [question](./010.md) or [condition](./012.md). \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/014.md b/project/addons/dialogic/Documentation/Content/Events/014.md new file mode 100644 index 0000000..521ee09 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/014.md @@ -0,0 +1,11 @@ +# Set Value +![image](./Images/Event_Set_Value.PNG) +The `Set Value` event can be used to change the value of `value definitions`. + +## The options +You can select the `value definition` to be changed, then the `type of change`. Then you can determine the new `value` to be set. ++ `[to be]` will set the definition to EXACTLY the given value. ++ the others will use the existing value and change it in the given way. These only work with numbers. + +By toggling the little cube icon, you can use a random number instead of the fixed input field. +![image](./Images/Event_Set_Value_random.PNG) \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/030.md b/project/addons/dialogic/Documentation/Content/Events/030.md new file mode 100644 index 0000000..a710156 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/030.md @@ -0,0 +1,21 @@ +# Audio Events +*The Audio Event and Background Music Event are very similar, so they are explained together* +![image](./Images/audio_event.png) + +The `Audio Event` can be used to play sounds. In contrast, the `Background Music Event` is supposed to play long pieces. Only one background music file can be played, but it can fade from one to the next. + +## Options +Select the audio file that should be played. You can clear this selection with the garbage icon. + +Then you can set a `AudioBus` to use and a preferred `volume` level. More about AudioBus' [here](https://docs.godotengine.org/en/stable/tutorials/audio/audio_buses.html). + +The `Background Music Event` additionally has a option for the fade length. + +## Is the audio looping when you don't want it to? +The `Audio Event` doesn't loop by itself. In Godot, looping of audio is mostly due to how you imported it (default for .ogg files). + +To solve this: +1. Select your audio file. +2. Go to the import tab (it's next to the scene tree tab by default) +3. Uncheck the loop checkbox. +4. Hit re-import. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/040.md b/project/addons/dialogic/Documentation/Content/Events/040.md new file mode 100644 index 0000000..e4cc870 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/040.md @@ -0,0 +1,23 @@ +# Emit Signal +![image](./Images/Event_Emit_Signal.PNG) + +The `Emit Signal` event will emit the signal `dialogic_signal` of the **current dialog node** and pass the given string as an **argument**. +The event does NOT create a new signal! + +If you instance your timeline via script, use code similar to this: +```gd +func start_dialog(): + var dialog = Dialogic.start("my_timeline") + dialog.connect("dialogic_signal", self, "dialog_listener") + add_child(dialog) + +func dialog_listener(string): + match string: + "quest_point_two": + # do something + pass +``` + +If you instanced the scene using the editor, you can connect the signal like normal in Godot from the `NODE TAB > Signals`. + +*If you don't know about signals you should definitely learn about them. For example [here](https://docs.godotengine.org/en/stable/getting_started/step_by_step/signals.html).* diff --git a/project/addons/dialogic/Documentation/Content/Events/041.md b/project/addons/dialogic/Documentation/Content/Events/041.md new file mode 100644 index 0000000..dc580e1 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/041.md @@ -0,0 +1,5 @@ +# Change Scene + +The `Change Scene` event will stop the current scene and load the selected one. This means the dialogue will be stopped too. + +Be careful when using this while you your tree is set to paused! Consider adding an [Emit Signal event](./040.md) before and resume the tree with `get_tree().paused = false`. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/042.md b/project/addons/dialogic/Documentation/Content/Events/042.md new file mode 100644 index 0000000..d74dc55 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/042.md @@ -0,0 +1,35 @@ +# Call Node +![image](./Images/Call_Node.PNG) + +This event allows to call a function in a node or autoload and pass arguments to that function. + +Many people struggle on first setting the node. You will have to either put in a full path (starting from root) or a relative path. + +#### Using a relative path +*You need to have a basic knowledge of relative paths. You can learn a bit about them [here](https://docs.godotengine.org/en/stable/classes/class_nodepath.html).* +The path needs to be relative to your DialogNode. This means you need to consider where it will be added to. +Let's for now imagine an example scene tree like this: + +``` +- World +-- Temple +-- NPC` +``` + +Now in the NPC's script the dialog node is added as a child of the NPC node. When getting instanced, there will be a canvas layer inbetween resulting in an actual tree like this: + +``` +- World +-- Temple +-- NPC +--- CanvasLayer +---- DialogNode +``` + +But we want to call a function in the Temple scene with our Call Node Event. From the structure above we can see that we need to go up three times and then down one time to get from the DialogNode to the temple, so this is the resulting path: +`'../../../Temple'` + +*Of course if you have canvas_layer set to false in Dialogic.start() you need on '..' less.* + +#### Using the name of an autoload +If you use an autoload instead, it's wonderfully easy. You can just use the name of the autoload! diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/CreateCustomEvents.md b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/CreateCustomEvents.md new file mode 100644 index 0000000..2b5bf9c --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/CreateCustomEvents.md @@ -0,0 +1,121 @@ +# Creating custom events +![HeaderImage](./Images/CustomEventsShowOff.PNG) + + +# Introduction +### What are Dialogic events? +Events are visual representation of data. Whenever you create one event in your timeline, you are modifying a dictionary with a lot of keys and values. Each pair will contain all the information needed to perform an action during the game. + +### What makes a custom event? +A custom event is made up of a two main parts: the **Event Block** and the **Event Handling Script**. + +The **Event Block** is the scene that will be shown in the timeline editor. It needs to inherit Dialogic's `EventTemplate.tscn` scene. + +In most cases you will additionally need scenes that have all the setting controls in them. These will be the "content" of your event block. These kind of scenes will have to extend the `EventPart.gd` script. + +Here is a very simple example of an `EventBlock`: +![EventBlock](./Images/EventBlock.png) +It contains two **EventParts**, a **header** and a **body**. + +The **Event Handling Script** is what contains the logic and what will happen when your event happens in the game. This script will need the `handle_event()` function that will be called if the event is reached. + +All of the files that are used for creating a custom Event Block and Handling Script should be in this directory: `res://dialogic/custom-events`. That way Dialogic can recognize it and show it in your timeline editor. + + + + +# Making your first custom event in 6 steps +Let's now create a simple event that will print some text to the Output panel in Godot. + + +## Create the event +Go to the `settings page` and in the `custom events section` hit the `New` button. +Fill in a name for your event, a folder name and an ID. For the IDs, I recommend using your name or a string unique to you followed by a number. +**The ID has to be different for every event!!!** +This is why I recommend the unique string, as it will enable you to share the event with others without breaking their games. +![Creating](./Images/CreationProcess.PNG) + +When you are ready, hit `Create`. You will see the folder appear in the `FileSystem` under `res://dialogic/custom-events/`. + +If you go to the `timeline editor` now, you should already be able to see your event in the event list. + +### What happened +This little menu already created a number of things for you: +- The `EventBlock` (EventBlock.tscn) +- An example `EventPart` (EventPart_Example.gd/.tscn) +- The `event handling script` (event_+EVENTID+.gd) +- A `stylebox` for your event (Stylebox.tres) + + + +## What next +The automatic process already set up a lot, but it didn't know the purpose of our event, so we will have to add that. + +### | Adding the data +First we want to open the `EventBlock.tscn` scene. (Do not rename this scene!) + +Select its root node and look at its exported variables in the inspector. + +We will need to add all the data that our event can have to `event_data`. +As you can see, it already contains your event id. This needs to be there, so don't delete it! + +I want to be able to set the text that will be printed when my event is activated, so I'll add an information slot for that: +![EventData](./Images/EventBlock_EventData.PNG) + +### | Icon and Stylebox +You can also change your events icon in the Inspector. Just drag an image into the `Event Icon`. + +Below that, you can open the Stylebox and change its background color to give your event a unique look. + + +### | The Event Blocks Content (EventParts) +Right now your event block will be empty, so let's change that if you want to. + +The content of an EventBlock is separated into `EventParts`. This allows for some reuse. +There are two places EventParts can be in an EventBlock: The Header (always visible) and the Body (can be hidden). + +*An EventBlock does not have to have a body nor a header EventPart. For example the End Branch event has none.* + +There is already a simple example `EventPart` (Script and Scene) included. You can change it as much as you want. + +#### | Loading the data +In `load_data()` you will need to set the values of your control nodes. This function is called when the event is added to the timeline editor. + +#### | Saving changes to the data +When the values get changed (listen to it via signals) set the according value in the `event_data` dictionary and call `data_changed()`. + +This is pretty much all you need to know. +*If you want to find more examples you can go to `res://addons/dialogic/Editor/Events/Parts/` and look at the EventParts that shape Dialogic's default blocks.* + +### | Using the EventPart +Once you've finished everything in your EventPart(s) you need to, go into the `EventBlock` scene and set the `header`/`body` variable in the Inspector to the new scene(s). + + + +### | The event handler script (event_yourname_000.gd) +Once you have your `EventBlock` finished, you need to add the event handling logic. + +#### | The handle_event() function +If you open the script you will see, that there is only one function by default, the `handle_event()` function. + +It comes with two useful pieces of information: the `event_data` and a reference to the `dialog_node`. + +For me I'll just add +`print(event_data['print_text']` +there, but of course you can do a lot more. + + +Some more stuff is already explained in the script: +##### Continue +Use `dialog_node.load_next_event()` to continue with the next event. + +##### Waiting +If you don't want the player to interrupt your event, set `dialog_node.waiting` to `true` while your event is handled. +Don't forget to set it back to `false`. + + + +## And done! +Great, you've created your first custom event for Dialogic. + +*Make sure to check Emilio's Discord server just in case someone has already created the custom event that you need. They are super easy to [import](./ImportCustomEvents.md)!* \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG new file mode 100644 index 0000000..1bd21d0 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG.import b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG.import new file mode 100644 index 0000000..ec2ef15 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CreationProcess.PNG" +dest_files=[ "res://.import/CreationProcess.PNG-05f3e3e7144b33f6a2e204a8d70bb677.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG new file mode 100644 index 0000000..65c309b Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG.import b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG.import new file mode 100644 index 0000000..3149297 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/CustomEvents/Images/CustomEventsShowOff.PNG" +dest_files=[ "res://.import/CustomEventsShowOff.PNG-1ca9776c8c1de417754bb64c0e9ae3f2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png new file mode 100644 index 0000000..f617e37 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png differ diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png.import b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png.import new file mode 100644 index 0000000..98b2fb2 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock.png" +dest_files=[ "res://.import/EventBlock.png-460fc7d7eb7c57b17d7116ac3a401e04.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG new file mode 100644 index 0000000..839fe75 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG.import b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG.import new file mode 100644 index 0000000..2fd29b8 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/CustomEvents/Images/EventBlock_EventData.PNG" +dest_files=[ "res://.import/EventBlock_EventData.PNG-3ba75184a293de83ba741f739e02831d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/CustomEvents/ImportCustomEvents.md b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/ImportCustomEvents.md new file mode 100644 index 0000000..6c990f9 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/CustomEvents/ImportCustomEvents.md @@ -0,0 +1,9 @@ +# Importing custom events + +It's very easy to share `custom events` because they are pretty much self-contained. +You will just need to get the folder from someone. If you have it, move it into `res://dialogic/custom-events/`. + +Then enable custom events in Dialogic's settings menu (if you haven't already). +You should now find the custom event in the bottom of the event button panel on the right in the timeline editor. + +*Vòila! Hope it works ;)* \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG new file mode 100644 index 0000000..b5b592d Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG.import new file mode 100644 index 0000000..0827498 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Call_Node.PNG" +dest_files=[ "res://.import/Call_Node.PNG-f719aeb3b34d67d458b47384bffd26dd.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG new file mode 100644 index 0000000..1c6ab46 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG.import new file mode 100644 index 0000000..9d88550 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Change_Timeline.PNG" +dest_files=[ "res://.import/Event_Change_Timeline.PNG-3613b62ffaabe4ec350f5c6f97611565.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG new file mode 100644 index 0000000..0a5410b Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG.import new file mode 100644 index 0000000..4313f5f --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Character_Join.PNG" +dest_files=[ "res://.import/Event_Character_Join.PNG-c00e395692cca58b463fed8c9531c914.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG new file mode 100644 index 0000000..a46cb6c Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG.import new file mode 100644 index 0000000..91108a2 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Character_Leave.PNG" +dest_files=[ "res://.import/Event_Character_Leave.PNG-6bd42ebbbe4c9f56973b0c4c0d706b93.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG new file mode 100644 index 0000000..f635a49 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG.import new file mode 100644 index 0000000..201f87c --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Character_Update.PNG" +dest_files=[ "res://.import/Event_Character_Update.PNG-b8de5875da5c54e2a2a29f292229c586.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG new file mode 100644 index 0000000..be35232 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG.import new file mode 100644 index 0000000..3e4bc05 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Choice.PNG" +dest_files=[ "res://.import/Event_Choice.PNG-298ca290c2de63f7b8f94abfe35b45f0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG new file mode 100644 index 0000000..181f546 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG.import new file mode 100644 index 0000000..e936a82 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Choice_Condition.PNG" +dest_files=[ "res://.import/Event_Choice_Condition.PNG-47064c87073a3b92a27167e9940f8c31.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG new file mode 100644 index 0000000..ceafac7 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG.import new file mode 100644 index 0000000..0e770c9 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Close_Dialog.PNG" +dest_files=[ "res://.import/Event_Close_Dialog.PNG-3654b068ff053b245b5a111cf97e619f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG new file mode 100644 index 0000000..e8a97d2 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG.import new file mode 100644 index 0000000..cb5f78c --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Condition.PNG" +dest_files=[ "res://.import/Event_Condition.PNG-7f4a2dbe15404fc55c0fdda27cd6fe3d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG new file mode 100644 index 0000000..0e7bad3 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG.import new file mode 100644 index 0000000..b4889fb --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Condition_in_use.PNG" +dest_files=[ "res://.import/Event_Condition_in_use.PNG-86b74676182e6c775eae710456cbe8d4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG new file mode 100644 index 0000000..bbebf69 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG.import new file mode 100644 index 0000000..64f8de0 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Emit_Signal.PNG" +dest_files=[ "res://.import/Event_Emit_Signal.PNG-29a3fcdd35b5592c3ff1adca2227eaec.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG new file mode 100644 index 0000000..03ddfb9 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG.import new file mode 100644 index 0000000..69d5120 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_End_Branch.PNG" +dest_files=[ "res://.import/Event_End_Branch.PNG-081876dfa5df74f8bd1922b91957d0f7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG new file mode 100644 index 0000000..8837add Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG.import new file mode 100644 index 0000000..9fba7ab --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Question.PNG" +dest_files=[ "res://.import/Event_Question.PNG-03cb0b2c1bd44f6b99ae19336e724884.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG new file mode 100644 index 0000000..0619ac5 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG.import new file mode 100644 index 0000000..9f78f09 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Question_in_use.PNG" +dest_files=[ "res://.import/Event_Question_in_use.PNG-373002c26425df47606663984f025574.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG new file mode 100644 index 0000000..79c4bac Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG.import new file mode 100644 index 0000000..2af7aa0 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Set_Theme.PNG" +dest_files=[ "res://.import/Event_Set_Theme.PNG-73f2c9d713bc2975932401717f981883.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG new file mode 100644 index 0000000..a4fea6f Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG.import new file mode 100644 index 0000000..126e68c --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value.PNG" +dest_files=[ "res://.import/Event_Set_Value.PNG-b2672955798f7f97c72e2c4f3f23f42d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG new file mode 100644 index 0000000..bb2d9fb Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG.import new file mode 100644 index 0000000..a5cce45 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Set_Value_random.PNG" +dest_files=[ "res://.import/Event_Set_Value_random.PNG-46d4b8d8ff67af47afb6137a22fa0790.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG new file mode 100644 index 0000000..8e961c5 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG.import b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG.import new file mode 100644 index 0000000..d32b120 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/Event_Wait_Seconds.PNG" +dest_files=[ "res://.import/Event_Wait_Seconds.PNG-8023c213d12ebc598f48204427f06be2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/audio_event.png b/project/addons/dialogic/Documentation/Content/Events/Images/audio_event.png new file mode 100644 index 0000000..bcedb1a Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/audio_event.png differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/audio_event.png.import b/project/addons/dialogic/Documentation/Content/Events/Images/audio_event.png.import new file mode 100644 index 0000000..f690238 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/audio_event.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/audio_event.png" +dest_files=[ "res://.import/audio_event.png-abe3ddd1bd4a041a15bf5b182b4dc2c6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/text_event_1.png b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_1.png new file mode 100644 index 0000000..e5307ee Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_1.png differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/text_event_1.png.import b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_1.png.import new file mode 100644 index 0000000..deb5af9 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/text_event_1.png" +dest_files=[ "res://.import/text_event_1.png-c1ef7be33362776ee815070c9be95e63.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/text_event_2.png b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_2.png new file mode 100644 index 0000000..5041b17 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_2.png differ diff --git a/project/addons/dialogic/Documentation/Content/Events/Images/text_event_2.png.import b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_2.png.import new file mode 100644 index 0000000..65cbdec --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Events/Images/text_event_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Events/Images/text_event_2.png" +dest_files=[ "res://.import/text_event_2.png-d8c291379c3bc509219959a9270f0754.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/FAQ/CSharp.md b/project/addons/dialogic/Documentation/Content/FAQ/CSharp.md new file mode 100644 index 0000000..7d2b0e8 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/CSharp.md @@ -0,0 +1,14 @@ +# Can I use C# with Dialogic? + +Yes, but it's experimental at the present time. If you want to try it out, and you find issues with the implementation, please let us know. + +Usage: + +`public override void _Ready() + { + var dialog = DialogicSharp.Start("Greeting"); + AddChild(dialog); + } +` + +This is the PR that added this feature: [https://github.com/coppolaemilio/dialogic/pull/217](https://github.com/coppolaemilio/dialogic/pull/217) \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/Signals.md b/project/addons/dialogic/Documentation/Content/FAQ/Signals.md new file mode 100644 index 0000000..8cbb31b --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/Signals.md @@ -0,0 +1,18 @@ +# How do I use signals with Dialogic? + +## Emit Signal event +You can learn more about how to use this event in its own documentation page in the Events folder. + +## Other signals +You can also listen to Dialogic using four preset signals: + +- **event_end** and **event_start** are emitted for each event in your timeline +- **timeline_end** and **timeline_start** are emitted when a timeline starts and ends. + +You can connect signals using the editor or via code: +```gdscript +func start_dialog(): + var dialog = Dialogic.start("my_timeline") + dialog.connect("timeline_end", self, "dialog_ended") + add_node(dialog) +``` diff --git a/project/addons/dialogic/Documentation/Content/FAQ/can-i-use-dialogic-in-my-project.md b/project/addons/dialogic/Documentation/Content/FAQ/can-i-use-dialogic-in-my-project.md new file mode 100644 index 0000000..e3e9758 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/can-i-use-dialogic-in-my-project.md @@ -0,0 +1,4 @@ +# What license? + +**May I use Dialogic in one of my projects?** +Yes, you may use Dialogic to make any kind of game - even commercial ones! The project is developed under the [MIT License](https://github.com/coppolaemilio/dialogic/blob/master/LICENSE). All we ask is that you please remember to credit us in your project! \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/create-timeline-using-gdscript.md b/project/addons/dialogic/Documentation/Content/FAQ/create-timeline-using-gdscript.md new file mode 100644 index 0000000..1eeff45 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/create-timeline-using-gdscript.md @@ -0,0 +1,28 @@ +# Creating timeline in code? + +**Can I create a timeline using GDScript?** + +Yes! It's a bit harder since you will have to create each event yourself, and each event has to be **valid.** To get an idea for how to build one properly, open an already created timeline with a text editor and see how we set ours up as an example for yourself. We'll be adding a better tutorial and documentation on this process eventually. + + +Here's a simple example: + +``` + +func _ready(): + + var gdscript_dialog = Dialogic.start('') + + gdscript_dialog.dialog_node.dialog_script = { + + "events":[ + + { 'event_id':'dialogic_001', "text": "This dialog was created using GDScript!"} + + ] + + } + + add_child(gdscript_dialog) + +``` diff --git a/project/addons/dialogic/Documentation/Content/FAQ/custom-portraits.md b/project/addons/dialogic/Documentation/Content/FAQ/custom-portraits.md new file mode 100644 index 0000000..3f778e2 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/custom-portraits.md @@ -0,0 +1,3 @@ +# Custom portraits + +You can define custom portraits that are animated or have particle effects and shaders by selecting a path to a scene (*.tscn) rather than to an image in the character screen. Your custom scene can be a Control node, a sprite or an animated sprite. When selecting a Node2D Dialogic might be unable to access its intended dimensions due to the nature of Node2D not having a specific size attribute defined. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/how-to-make-dialog-show-up-in-game.md b/project/addons/dialogic/Documentation/Content/FAQ/how-to-make-dialog-show-up-in-game.md new file mode 100644 index 0000000..ce2c59c --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/how-to-make-dialog-show-up-in-game.md @@ -0,0 +1,13 @@ +# Enable/start dialog? + +**How can I make my dialogue show up in game?** +There are two ways of doing this: you can use GDScript or the Scene Editor. + +Using the `Dialogic` class, you can add dialog nodes from code easily: + +``` +var new_dialog = Dialogic.start('Your Timeline Name Here') +add_child(new_dialog) +``` + +Using the editor, you can drag and drop the scene located at `/addons/dialogic/Dialog.tscn` and set the current timeline via the Inspector. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/input.md b/project/addons/dialogic/Documentation/Content/FAQ/input.md new file mode 100644 index 0000000..89cfb0f --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/input.md @@ -0,0 +1,5 @@ +# How to change the input? + +Dialogic uses a godot `Input Action` for the so called `"action key"`. You can create a new `Input Action` in the `Project Settings` under `Input Map`. Then you can select the action key in the dialogic settings. + +This way you can use anything from mouse buttons to controler buttons or all of them together. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/plugin-shipped-godot.md b/project/addons/dialogic/Documentation/Content/FAQ/plugin-shipped-godot.md new file mode 100644 index 0000000..78d9b14 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/plugin-shipped-godot.md @@ -0,0 +1,4 @@ +# Why a plugin? + +**The plugin is cool! Why is it not shipped with Godot?** +I see a lot of people saying that the plugin should come with Godot, but I believe this should stay as a plugin since most of the people making games won't be using it. I'm flattered by your comments but this will remain a plugin :) \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/portraits-not-showing.md b/project/addons/dialogic/Documentation/Content/FAQ/portraits-not-showing.md new file mode 100644 index 0000000..683ebb8 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/portraits-not-showing.md @@ -0,0 +1,6 @@ +# Show portraits? + +**Portraits not showing in game?** +In order to make the characters show up on the screen, you need to make them join your current scene using the [Character Join](../Events/001.md). + +If you used the join event and still don't see them, you should try modifying the offset and scale values in your character's portrait until they do appear. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/resolution-small-dialog-big.md b/project/addons/dialogic/Documentation/Content/FAQ/resolution-small-dialog-big.md new file mode 100644 index 0000000..b55dd3a --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/resolution-small-dialog-big.md @@ -0,0 +1,4 @@ +# Text box to big? + +**My resolution is too small and my dialog box is too big. Help!** +The scale of dialogue boxes and text are set in the Theme selected for the project. If your resolution is too small, the default one may be too big. Create a new theme and make the box and text sizes smaller until it fits appropriately. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/FAQ/touch-support-tutorial.md b/project/addons/dialogic/Documentation/Content/FAQ/touch-support-tutorial.md new file mode 100644 index 0000000..6b1ea30 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/touch-support-tutorial.md @@ -0,0 +1,41 @@ +# Is there touch/tap support? + +**How can I allow touch/tap to advance the dialog?** + +'Tap to advance dialog' is supported by default as of release 1.4.2. + +By default an invisible 'Touch Button' covers the full screen when Dialog is shown, so a tap anywhere will advance dialog. If you do not want automatic resizing and full screen touch first uncheck the 'Tap area covers full screen' setting: + +![image](https://user-images.githubusercontent.com/7741797/170019154-ee5f0231-b8c8-4641-a6df-0490ee165749.png) + + +Next go to the **DialogNode.tscn** + +![image](https://user-images.githubusercontent.com/7741797/170019276-1ffcc9fe-3e4b-474d-9457-4884f941e08c.png) + + +And find the **TouchScreenButton** node + +![image](https://user-images.githubusercontent.com/7741797/170019315-91d79111-2fda-40fc-b1b6-62c5492a81f0.png) + + +In the inspector, make the shape visible so you can edit it + +![image](https://user-images.githubusercontent.com/7741797/170019396-35c11002-c5f8-4fd7-91bd-28f88e5d431e.png) + + +Then resize it to your hearts content. + +**How can I select choices with touch/tap?** +Choice buttons are simply normal Godot UI buttons. This means by default only a mouse click will work on them. If you wish for otouch tap support you have 2 options +1) Emulate Mouse From Touch in your project settings + +![image](https://user-images.githubusercontent.com/7741797/170020234-dd0068bb-ede6-4f3e-a3a1-2eabaa2fe76c.png) + + +2) Edit the **ChoiceButton.tscn** + +![image](https://user-images.githubusercontent.com/7741797/170020314-968c96d4-77be-4641-8be5-4e2b16979cfb.png) + + +And attach or replace it with a touch buttons as your project demands. diff --git a/project/addons/dialogic/Documentation/Content/FAQ/why-not-graph-nodes.md b/project/addons/dialogic/Documentation/Content/FAQ/why-not-graph-nodes.md new file mode 100644 index 0000000..6883ea3 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/FAQ/why-not-graph-nodes.md @@ -0,0 +1,6 @@ +# Why not graph nodes? + +**Why doesn't Dialogic use graph nodes?** +Because of how the graph nodes are arranged, the screen gets full of UI elements and it gets harder to follow. + +If you want to use graph based editors, you can try [Levraut's LE Dialogue Editor](https://levrault.itch.io/le-dialogue-editor) or [EXP Godot Dialog System](https://github.com/EXPWorlds/Godot-Dialog-System). \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png b/project/addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png new file mode 100644 index 0000000..58e61bc Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png differ diff --git a/project/addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png.import b/project/addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png.import new file mode 100644 index 0000000..01e32d2 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Images/dialogic-hero-1.3.png" +dest_files=[ "res://.import/dialogic-hero-1.3.png-7a281002dc7b4ec8e79698bd2ada9b48.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/000.md b/project/addons/dialogic/Documentation/Content/Reference/000.md new file mode 100644 index 0000000..72ecc12 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/000.md @@ -0,0 +1,5 @@ +# Dialog Node + +This is the node that allows your created dialogue timelines to appear. + +You can either drag it into one of your scenes from `/addons/dialogic/Dialog.tscn` or create one using the `Dialogic.start()` function. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Reference/001.md b/project/addons/dialogic/Documentation/Content/Reference/001.md new file mode 100644 index 0000000..059a9cf --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/001.md @@ -0,0 +1,166 @@ +# Dialog Class + +The Dialogic class provides pretty much all the methods you need to interact with Dialogic via code. +You can access them simply by using the class name `Dialogic.method_i_want_to_call()`. + +## Starting Dialog + +### start() +`start(timeline, default_timeline, dialog_scene_path, use_canvas_instead)` + +Starts the dialog for the given timeline and returns a Dialog node. +You must then add it manually to the scene to display the dialog. + +Example: +``` +var new_dialog = Dialogic.start('Your Timeline Name Here') +add_child(new_dialog) +``` + +`@param timeline` +The timeline you wish to load. You can provide the timeline name or the filename, at your discretion. Leave this empty to start from a save slot. +We encourage you to specify the timeline name with the folders in front (e.g. 'Part 1/Chapter 1'). + +`@param default_timeline` +If timeline == '' (so it's loading from the save slot) and no valid data was found, this will be loaded. + +`@param dialog_scene_path` +If you made a custom Dialog scene or moved it from its default path, you can specify its new path here. + +`@param use_canvas_instead` +True by default. Creates the Dialog inside a canvas layer to make it show up regardless of the camera 2D/3D situation. + +**@returns** +A Dialog node to be added into the scene tree (see example above). + + +### change_timeline() +`change_timeline(timeline)` + +Is used to change the current timeline. This way the state of the DialogNode (like characters, the theme and background music) are preserved from the currently active node. + +`@param timeline` +Same as the one on `start()`, although it cannot load from saves. + + +### next_event() +`next_event(discreetly)` +Is used to immediately play the next event. + +`@param discreetly` +A boolean (default value: false) that determines whether the Passing Audio will be played. + + +### timeline_exists() +`timeline_exists(timeline)` +Returns true if a timeline with the given name at the given path exists, otherwise false. + +`@param timeline` +The name/path to check. + + + +## Saving and loading +The Dialogic class provides the following methods for dealing with saving and loading. Learn more about how to use them in the Saving and Loading tutorial. + +### load() +`load(slot_name)` + +`@param slot_name` +Specifies the slot name to be loaded. If empty, it will load the default save. + +### save() +`save(slot_name)` + +`@param slot_name` +Specifies the slot name to be saved to. If empty, it will save to the default slot. + +### get_slot_names() +`get_slot_names()` + +**@returns** +An array with all the available slot names. + +### erase_slot() +`erase_slot(slot_name)` + +`@param slot_name` +Specifies the slot name to be deleted. + +### has_current_dialog_node() +`has_current_dialog_node()` + +**@returns** +True if there is a Dialog Node active, otherwise false. + +### reset_saves() +`reset_saves(slot_name)` + +`@param slot_name` +Specifies the slot to be reset. Uses the default slot if left empty. + +### get_current_slot() +`get_current_slot()` + +**@returns** +The name of the last loaded slot or "/" if import() was used. + +### export() +`export()` +Is used to get all necessary info, so you can save it however you want. + +**@returns** +A dictionary with all important information about the dialogic game state. +There are three sub-dictionaries with the keys 'definitions', 'state' and 'dialog_state'. +- *'definitions'* contains all the definitions, values as well as glossary entries (only their current value, not the defaults +- *'state'* contains the so called "game_state": custom information that can be accessed with the `Dialogic.get_saved_state_general_key()` and `Dialogic.set_saved_state_general_key()` methods. +- *'dialog_state'* that contains all information needed to load the dialog back in (if any dialog was playing when export() is called. Example information is the current timeline, event index, characters on screen with their portraits, background, music, etc... + +### import() +`import(data)` +Is used to load data that was exported back in. + +`@param data` +A dictionary that should be the same as the one you get from `export()`. + + + +## Variables +You can change the value definitions through your code! +### set_variable() +`set_variable(name, value)` + +Sets the value of the value definition named `@param name` to `@param value`. + +### get_variable() +`get_variable(name, default)` + +Returns the current (not default) value of the value definition named `@param name` or `@param default` if no value definition like that was named. + +### clear_all_variables() +`clear_all_variables()` + +Clears all configured variables. + +## Game State +The game state is custom information that you can access with the following functions and that will be saved and loaded alongside the other dialogic data. + +### get_saved_state_general_key() +`get_saved_state_general_key(key, default)` + +**@returns** +The value of the given `@param key` or `@param default` if nothing is found. + +### set_saved_state_general_key() +`set_saved_state_general_key(key, value)` + +Changes the value of the given `@param key` to the value of `@param value`. + + +## Other stuff + +### get_action_button() +Mostly used for internal purposes. + +**@returns** +The input action selected on the dialogic setting page. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Reference/Character.md b/project/addons/dialogic/Documentation/Content/Reference/Character.md new file mode 100644 index 0000000..d5e18e0 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Character.md @@ -0,0 +1,41 @@ +# Character Editor + +The `Character Editor` is used to set up the characters of your story. Here you can learn more about the editor's settings. + +### Color and Name Name +The first settings are the character's name and the color used for it. This is the name that you will see in all the menus, and by default it's the one displayed when the character is speaking. + +### Display Name +You can change what name is shown in game when the character speaks by enabeling and setting the `Display Name`. + +### Nicknames +By default, all occurrences of the character's name in text are colored in the character's color. +*This can be disabled in settings.* +By using the `Nicknames` feature, you can add additional names that will also be colored. Just enable the Nicknames box and add all Names that should be colored as a comma- (`,`)-seperated list. + +### Description +This area is for you to take notes. It has no effect on your game. + +### Theme +This allows to use a different theme whenever the character speaks. The game will change back to the previous one once a different character speaks. + + +## Portraits / Expressions +This section is one of the most important, as it allows you to load all the images of your character. We highly recommend that you give each one a useful name, as it will make it easier to use them! +You can also import a whole folder of images with the **`Import folder`** button. + +### Scale +Changing this allows you to scale the portraits down. If your portraits are far too big in the game, adjust this setting until they look right. + +### Offset +Sets an offset that will adjust the position of your character in two dimensions, depending on the base location selected in the timeline. + +### Mirror portraits +This will mirror all of the portraits. You can use the mirror option of the `Character Event` if you just want to mirror it sometimes. + + +## Preview +On the right, you can see a preview of the currently selected portrait. + +You can change between "Full View" which will fit the portrait image to the size of the preview container. Use "Actual Size" to see the image in the size it will have in the game. + diff --git a/project/addons/dialogic/Documentation/Content/Reference/History.md b/project/addons/dialogic/Documentation/Content/Reference/History.md new file mode 100644 index 0000000..6ce1685 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/History.md @@ -0,0 +1,133 @@ +# History timeline + +When enabled, the History timeline feature automatically builds a log of events that can be reviewed by the user or, if audio is enabled, replay the audio as well. The History timeline is at its core an opinionated, fancy logging system, and has many settings that can be configured to change its behavior. In addition to these settings, the history timelines look and feel can also be customized further by intermediate to experienced users, without affecting its functionality. + +![anatomy-history](./Images/history_settings_explained.png) + +The above image gives a rough look at how a history timeline can look in game. By default, a History timeline is made up of a *History* node that instances a single *HistoryBackground*, two *HistoryButtons*, and as many *HistoryRows* as neccesary. The History timeline is destroyed along with the rest of the Dialogic node when the timeline ends. + +## History settings +Unless otherwise noted, all settings are enabled by default. + +### Enable history +Allows history logs to be taken. If disabled no other history settings will be displayed, and no history log will be kept in game + +### Show open button +Displays the default history open button. This button opens the history timeline and disappears while it is open. Its position is determined by the History button position setting. If you wish to customize this button, refer to the History anatomy below + +### Show close button +Displays the default history close button. This button closes the history timeline and disappears while it is closed. Its position is determined by the History button position setting. If you wish to customize this button, refer to the History anatomy below + +### Log all choices +Record all possible choices the player could have picked from a choice event in the format: +*\[choice 1\] \\t \[choice 2\] \\t \[choice 3\] \\t* + +If you need this format changed, the code can be found here: +https://github.com/coppolaemilio/dialogic/blob/5e99dfe0374695ff4ec3680bad75d17ffe939264/addons/dialogic/Nodes/History.gd#L236-L237 + +### Log choice answer +Record the choice ultimately selected by the player in a choice event in the format: +*\\t \* + +If you need this format changed, the code can be found here: + https://github.com/coppolaemilio/dialogic/blob/5e99dfe0374695ff4ec3680bad75d17ffe939264/addons/dialogic/Nodes/History.gd#L244 + +### Log character joins +Record when a character joins a timeline in the format: +*\ \* + +Which by default displays as: + *Emilio has arrived* + +### Log character joins text +The text to display after a character name when a character arrives. This defaults to 'has arrived'. This option has no effect if Log character joins is disabled + +### Log character leaves +Record when a character leaves a timeline in the format: +*\ \* + +Which by default displays as: +*Emilio has left* + +### Log character leaves text +The text to display after a character name when a character leaves. This defaults to 'has left'. This option has no effect if Log character leaves is disabled + +### Scroll to bottom +Auto scrolls the history timeline to the most recent entry. Disable this if you wish for your player to start reading from the first entry and have to scroll down manually + +### Reverse timeline +Add new HistoryRows to the top of the history timeline, reversing the default way the timeline is built. This option is **disabled** by default + +### Show name colors +Use the color defined in the character within the timeline + +![image](./Images/history_character_color_example.png) + +In this case the characters name woudld be blue in the history timeline. Disable this option to force character names to use the default font color. + +### Line break after names +Forces the character name to be logged on a separate line from the rest of the text. This option is **disabled** by default + +### History button position +Choose the relative location on screen you want the default history open and default history close button to appear + +![image](./Images/history_button_positions.png) + +If you wish to customize this further, consider using the exposed *toggle_history* function described in History API below + +### Name delimiter +Type in the 'delimiter' to be affixed to the character name in the history timeline. By default this is a colon *\:* which would display as: +*Emilio: Welcome to dialogic!* + +Changing this to a dash *\-* would display as: +*Emilio- Welcome to dialogic!* + +### Screen margin +Sets a distance in pixels that the history panel will buffer away from the edge of the screen. + +![image](./Images/history_screen_margin.png) + +This example would give a margin of 25 pixels on the left and right sides of the screen (X axis) and 10 pixels on the top and bottom of the screen (Y axis) + +### Log margin +Sets a distance in pixels that the history panel will buffer away from the HistoryRows that it contains. + +![image](./Images/history_log_margin.png) + +This example would give a margine of 45 pixels on the left and right sides of the screen (X axis) and 15 pixels on the top and bottom of the screen (Y axis). Note that the Y axis pixels may not be as apparent as the scrollcontainer may obscure the bottom margin. + +## History anatomy +![image](./Images/history_scene_tree.png) + +The History node is a child of the DialogicNode and is made up of an AudioStreamPlayer to replay TextEvent audio and a ScrollContainer to ultimately hold HistoryRow instances. Neither of these nodes have much cause to be changed or customized. + +![image](./Images/history_script_variables.png) + +The History node has four exposed script variables that are instanced at run time and can be customized, changed, or extended to suit your needs. These default parts can all be found in the */addons/dialogic/Example Assets/History/* folder. + +### History background +There is no special code and few considerations when replacing or customizing the HistoryBackground. Its simply a panel with *mouse_filter* set to ignore. + +### HistoryButton and HistoryReturnButton +There is no special code or considerations when replacing either button. The only difference in these buttons are the Button texts. The buttons have their own theme that can be replaced, overridden, or ignored + +### HistoryRow +![image](./Images/history_row_scene_tree.png) + +If you intend to replace the HistoryRow, make sure to extend the script. HistoryRow contains two important functions +* add_history(historyString : string, newAudio='') - Called to actually write the data to the HistoryRow by the main History node. Edit this function with care. +* load_theme(theme: ConfigFile) - called by the History node to theme the HistoryRow with the default theme of Dialogic. If you wish to style your HistoryRow manually, than replace this functions content with a *pass*. + +The key nodes of the HistoryRow are the *RichTextLabel* which is where the actual text appears and the *PlayAudioButton* which allows replays of audio dialog in TextEvents. In the case of customizing your own HistoryRow, you will need to set the node path of these nodes which can be done via the script varialbes as seen below +![image](./Images/history_row_script_variables.png) + + +## History api +There is one exposed function in Dialogic that relates to the History system: toggle_history(). Toggle history is used to create your own custom button or function to open and close the History window. It is called like this: +*Dialogic.toggle_history()* +And can easily be tied to a button or function like so: + +``` +func _on_CustomHistoryButton_pressed(): + Dialogic.toggle_history() +``` \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png new file mode 100644 index 0000000..62a8120 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png.import new file mode 100644 index 0000000..c3af0f2 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_button_positions.png" +dest_files=[ "res://.import/history_button_positions.png-72533a28ddfc07077b44d0a6e96e1baa.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png new file mode 100644 index 0000000..eeffe9b Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png.import new file mode 100644 index 0000000..d081c33 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_character_color_example.png" +dest_files=[ "res://.import/history_character_color_example.png-e1c188d6ea27265bea79e5b0452da876.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png new file mode 100644 index 0000000..be25b0b Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png.import new file mode 100644 index 0000000..f90ee9e --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_log_margin.png" +dest_files=[ "res://.import/history_log_margin.png-7951084d0435f2e56c190e6e2640f6c5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png new file mode 100644 index 0000000..d8a8400 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png.import new file mode 100644 index 0000000..94558a0 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_row_scene_tree.png" +dest_files=[ "res://.import/history_row_scene_tree.png-45ecd56d38d8cae30e7bfa33cc7d6498.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png new file mode 100644 index 0000000..5f8c1c0 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png.import new file mode 100644 index 0000000..218477c --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_row_script_variables.png" +dest_files=[ "res://.import/history_row_script_variables.png-7faf5863895922f33870b2c95d224224.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png new file mode 100644 index 0000000..af37db1 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png.import new file mode 100644 index 0000000..2d51386 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_scene_tree.png" +dest_files=[ "res://.import/history_scene_tree.png-452d329581c0c1aabc4c7ba3d492f918.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png new file mode 100644 index 0000000..0499096 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png.import new file mode 100644 index 0000000..2fa13a7 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_screen_margin.png" +dest_files=[ "res://.import/history_screen_margin.png-5500c4e829498bbfd61b259518ec8556.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png new file mode 100644 index 0000000..91f89f5 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png.import new file mode 100644 index 0000000..aad837e --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_script_variables.png" +dest_files=[ "res://.import/history_script_variables.png-149d850163ef255e463f2a6fe425c246.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png b/project/addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png new file mode 100644 index 0000000..77738bf Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png differ diff --git a/project/addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png.import b/project/addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png.import new file mode 100644 index 0000000..c8cc02f --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Reference/Images/history_settings_explained.png" +dest_files=[ "res://.import/history_settings_explained.png-cfaf538faf67b5a114d0d588774b6c80.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Reference/Theme.md b/project/addons/dialogic/Documentation/Content/Reference/Theme.md new file mode 100644 index 0000000..4f3f74d --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Theme.md @@ -0,0 +1,110 @@ +# Theme Editor + +Themes allow you to set how your dialogue looks, sounds, and behaves. + +At the top of the Theme Editor you have a **preview field.** Here, you can set the text to be previewed, the speaker of the preview, and force a preview refresh. + +The settings are sorted into different sections. Most are self-explanatory, but some require a little more in the way of explanation. + +## Dialog Text +Allows you to set the look and behavior of the text inside the dialog box. + +##### Margin +Sets the individual margin between the border of the box and the edge the dialog text for a given side. + +##### Behaviour>Speed +Using this setting, you can change the speed at which the text is shown. Bigger values will result in a slower speed. +Setting this to 0 will result in the text instantly appearing. + +##### Behaviour>Alignment +Use this to align the text inside the box. + +##### Behaviour>Single Portrait Mode +If you enable this mode, there will always only be one portrait visible. This will be the portrait of the character who is currently speaking. + +##### Behaviour>Don't Close After Last Event +If enabled, the dialog box will not delete itself after the last event. Instead you will need to remove it manualy. Usefull if the box is intergrated into your design and should never vanish. + + +## Dialog Box +### Dialog Box>Visuals +You may choose either a solid color or a texture for the background of the box. For the texture, you can also change its modulation. + +## Dialog Box>Visuals>9-Patch Margin Left/Right and Top/Bottom +Allows you to configure 9-Patch Rectangle support on the approprate sides of your image. See this tutorial for details on how a 9-patch rect works [Youtube](https://www.youtube.com/watch?v=1u4817DKvb8). Leaving these values at 0 treats the texture as a normal background texture. + +##### Size and Position>Full width +This setting makes your box stretch to the full extent of the view. + +##### Size and Position>Margin +Sets the individual margin between the border of the box and the edge of the viewport. + + +### Next indicator +An icon that appears once the text is completed. + +### Dialog Box>Behaviour +##### Behaviour>Fade in time +Sets how long the theme takes to fade in. Fading only happens on dialog load and is not triggered by the `Set Theme` event. + +##### Behaviour>Portraits Dim Color +Use this to change the modulation of the active character. Set it to white if you do not want any changes. + +##### Behaviour>Portraits Behind Dialog Box +If you disable this, the portraits will instead be in front of the dialog box. + + +## Name Label +The `Name Label` is the section above the text box that displays the name of the character who is currently speaking. + +##### Behaviour>Hide name labels +If this is enabled, the name label will not be shown. + +##### Text>Use character Color +If you enable this, the name label will always use the color of the currently speaking character. The characters color can be edited in the [Character Editor](./Character.md). + +### Name Label>Box +As for the text box, you can choose between a solid color or a texture. + +##### Box>Box Padding +The padding between the texture border and the text. + +### Name Label>Placement +Here you can set the alignment of the `Name label` as well as setting some additional offset. + + +## Choice Buttons +You can change the look of the buttons four states, although "Disabled" currently does nothing. + + +## Glossary +These setting lets you define the appearance of the box that appears when you hover over a glossary entry. + +##### Visuals>Word color +Sets the color of glossary word inside the dialog. + +##### Behaviour>Show +If this is disabled, the glossary info box won't be shown and glossary entries won't be colored. + + +## Audio +This sections allows you to set audio for your dialogue. Dialogic uses the [RandomAudioPlayer by TimKrief](https://gitlab.com/timkrief/godot-random-audio-stream-player). + +When selecting what audio to play, you can either select a single audio file or a folder where a file will be picked from. +You can set a range for the `volume` - a random level in that range will be picked each time it's called. Likewise, you can set a range for the `pitch`. `Allow interrupt` dictates whether or not the sound can be interrupted by a new sound of that type. + +##### Typing Sound Effects +When the text scrolls across the screen, this will play a sound for each letter. + +##### Next Sound Effects>Waiting +If you set a sound here, it will play once the text has finished typing. + +##### Next Sound Effects>Passing +This plays when the player continues to the next dialogue box. + +##### Choice Sound Effects>Hovered +This sound plays when a character is hovering over a choice button. + +##### Choice Sound Effects>Selecting +Plays when a character selects a choice button. + diff --git a/project/addons/dialogic/Documentation/Content/Reference/Timeline.md b/project/addons/dialogic/Documentation/Content/Reference/Timeline.md new file mode 100644 index 0000000..c78a56d --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Reference/Timeline.md @@ -0,0 +1,31 @@ +# Timeline Editor + +The `timeline editor` is one of the central parts of Dialogic, allowing you create your dialogue tree using the Events system. + +This editor consists of two parts: the main area, and the event bar on the side. The event bar allows you to add events to the main area, and the main area is where you write your text and arrange the events to create your timeline tree. + +## Building a timeline +Begin by pressing an event button or dragging it onto the main area in a desired location. + +Once in the timeline tree, you can move events by dragging and dropping them. + + +## Shortcuts +By holding CTRL, you can select multiple events by clicking on them. By holding SHIFT, you can select a range of events from the one initially selected to the one you click on. + +The editor supports the following short-cuts: +` +CRTL+C copy selected events +CRTL+P paste selected events +CRTL+X cut selected events +DEL delete selected events +DOWN/UP select the next/previous event +ALT+UP/DOWN move the selected event up or down (only works with one event) +CRTL+A select all events +CRTL+SHIFT+A deselect all events +CRTL+Z undo the last event action +CRTL+Y or CRTL+SHIFT+Z redo the last undone action + +CRTL+T add a new Text event +` + diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/AddingNewAnimations.md b/project/addons/dialogic/Documentation/Content/Tutorials/AddingNewAnimations.md new file mode 100644 index 0000000..8148439 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/AddingNewAnimations.md @@ -0,0 +1,37 @@ +# Adding character animations + +Dialogic 1.4 introduced a new animation system ([Anima by Alessandro Senese](https://github.com/ceceppa/anima)). +The files for the animations are stored in the `/dialogic/addons/dialogic/Nodes/Anima/animations` folder. + +There are two different kind of animations: Entrances and exits and attention seekers. +You can add your custom animations by creating new `.gd` files in the `animations/entrances_and_exists` or `animations/attention_seeker` folder. + +## Entrances and exits +These are used when you have a character showing up or leaving a scene using the character event. +A regular fade in animation looks something like this: + +``` +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 0, to = 1, easing_points = [0.42, 0, 0.58, 1]}, + ] + anima_tween.add_frames(data, "opacity", opacity_frames) +``` + +## Attention seekers +These are used when you when using the Character event and the Update setting. +They can be used to make a character shake, bounce or any other one to emphasize the character. + +They look something like this: +``` +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var frames = [ + { percentage = 0, from = 1 }, + { percentage = 25, to = 0 }, + { percentage = 50, to = 1 }, + { percentage = 75, to = 0 }, + { percentage = 100, to = 1 }, + ] + + anima_tween.add_frames(data, "opacity", frames) +``` \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/BeginnersGuideStepByStep.md b/project/addons/dialogic/Documentation/Content/Tutorials/BeginnersGuideStepByStep.md new file mode 100644 index 0000000..7ddf23b --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/BeginnersGuideStepByStep.md @@ -0,0 +1,166 @@ +# Beginners Guide +Let's walk you through creating dialogue with Dialogic! + + + +## 1. Meeting the Dialogic tab +Everything related to dialogue will be done in the Dialogic tab. You can access it like the 2D and 3D tab at the very top of the editor. +![Dialogic Tab](./Images/Dialogic_Tab.PNG) + + +Let's have a look at the `toolbar` at the top. + +![Toolbar](./Images/Toolbar.PNG) + + +### | The resources +Here you can create Dialogic's five **resources**. You will hear more on each of them later. + +**Timelines** represent a list of events. Show characters, make them talk, change the background, ask questions, emit signals, and more! + +**Characters** can have name, a special color, and different images for expressions. + +**Value Definitions** that can be used as variables to branch your story or be used inside the texts. + +**Glossary Entries** that can contain information that is shown in a popup when the player hovers over the word. + +**Themes** that specify how your dialogue looks. There are many settings you can tweak to suit your need. + +### | The master tree +All your resources are shown in the big `master tree` on the left. You can select which you want to work with there, create sub folders, and move items by dragging them. + +*Let's continue! What's the most important thing in dialogue? Someone to talk to. So, let's create our first character.* + +-------------------- + + +## 2. Creating your first character +Click the little character icon in the toolbar to create a new character. This will take you into the `character editor`. +### | Name +When creating a character, you may start typing in the `name` that the character should have. Hit enter to set the name. You can also double-click on their icon in the Character list on the left to set it. +![Empty Character Editor](./Images/Empty_Character_Editor.PNG) + +### | Color +Go ahead and also set a `color` by clicking on the color block. + +### | A default portrait/expression +Next, let's add a default `portrait` for them. You can select a file by clicking the three dots to the right of the blank path. You can also set a name for the expression on the left. +If you do not have a image to use right now, you can use the example dwarf from the `Example Assets folder` inside the Dialogic folder (res://addons/dialogic/Example Assets/portraits). + + +![grafik](./Images/Character_Editor_With_Portrait.PNG) +This is all for now. You can create as many characters as your story needs. + +*Now, let's create our first dialogue timeline!* + +-------------------- + + +## 3. Creating your first timeline +Timelines specify what events happen in which order. Create a new timeline with the icon in the toolbar. +You can now see the `timeline editor`. + +### | Name +Go ahead and give it a `name`. You can do so right after creating or double-click the item in the tree. + +### | Adding your first event +You can find all possible `events` on the right. +![Empty Timeline](./Images/Empty_Timeline_Editor.PNG) + +Go ahead and add a `Text` event (the very first, grey button), by clicking it or dragging it into the timeline area. + +The `Text` event is what will make text appear on the dialog box. +You can select a character, and this will add their `name` above the dialogue box. Go ahead and let your character say something! + +### | More events! +If we also want our character to be visible in the scene, we use the `Character Join` event (the second, green event). + +Select what character should appear and at which of the 5 available positions. This will add their character to the scene. The portrait position is approximate, and can be adjusted by setting their offset in their Character Editor. + +Make sure the new event is above the Text event. If it's not, you can drag it up (alternatively you can select the event and use `ALT+UP`/`ALT+DOWN`). + +### | Create your dialogue +Now go ahead and try out the other events. If you want to learn more about them, click the little help button on them! This will open up the documentation for that item. + +Keep in mind that, when adding new events with their buttons, they get added beneath the currently selected one. + +If you want to delete an event use `DEL` key or click the three dots on the right and select `Remove`. + +After a little effort, your dialogue tree might look something like this: +![TimelineExample](./Images/TimelineEditor_Example.PNG) + +*Now your dialogue tree is ready to be played! But how? Let's find out!* + +-------------------- + + +## 4. Adding your first DialogNode to a scene + +You can add dialogue trees - in the form of Dialog nodes - by one of two ways: gdscript or the scene editor. + +### | Instancing the scene using gdscript +Using the `Dialogic` class, you can add dialogue trees from code easily: + +```gdscript +var new_dialog = Dialogic.start('Your Timeline Name Here') +add_child(new_dialog) +``` + +### | Instancing the scene using the editor +Using the editor, you can drag and drop the scene located at `/addons/dialogic/Dialog.tscn` and set the current timeline via the inspector. + +### | Run, game, run! +Once you've done one of the previous steps, run your game (F5) or the scene (F6). Check to see if your dialogue begins. If not, check to see if you missed a step. If you're still having trouble, or just want to let us know what you think, you can always join us on our Discord channel. + +*Now that you've mastered the basics, let's introduce some more cool things!* + +-------------------- + + +## 5. Making your first value and glossary entry +This is already pretty cool, but let's make things more complex. There are two other resources that can help provide greater flexibility to your dialogue timelines: `values` and `glossary entries`. + +### | Make a value +Create a new `value` by clicking the X-icon in the toolbar. This will open up the definition editor. + +This allows you to set a name for your value and a default value. +Now you can use this value in your timelines. You can: +- change it with the Set Value event +- use it to have conditions (through the Condition event) +- add conditions to choices +- display it in text by writing [MyValue] + +#### Example value +Here an example value ... +![ValueExample](./Images/Value_Example1.PNG) +... and how it might be used in a timeline. +![ValueExampleTimeline](./Images/Value_ExampleTimeline.PNG) + +### | Make a glossary entry +A `glossary entry` is used for extra information. If the name of this is used in a text or question event, the player can hover over it with their indicator, and it will show a popup with the given information. You can also change the information during the game with the `Set Glossary` event. + +#### Example glossary entry +Here is an example glossary entry... +![GlossaryExample](./Images/Glossary_Example.PNG) +... and how it looks in the game. +![GlossaryExampleLook](./Images/Glossary_ExampleLook.PNG) + +*If you don't like the look of this box, don't worry. The next section is about customizing the look of your dialogue!* + +-------------------- + + +## 6. Create your first dialog theme +Themes are used to change the look. By default you already have a theme. Let's start by clicking it. +You will now see the `theme editor`. + +It has a preview at the top, and all the settings - grouped into multiple tabs - at the bottom. +I won't explain all the settings here. If you need additional information about a setting, the `Theme Editor Reference` can help you out. + +One of the most important settings is the Dialogue Box's `Box Size`. If you are making a pixel art game with a small resolution you will have to change it to be much smaller. You can also change the font size to fit your game's size. + +-------------------- + + +## Behind the scenes +To get an idea for how all of this is built and operated, all the resources are saved as `.json` or `.cfg` in a Dialogic folder in your games root directory `res://dialogic/`. diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/GettingStarted.md b/project/addons/dialogic/Documentation/Content/Tutorials/GettingStarted.md new file mode 100644 index 0000000..3bd3d3d --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/GettingStarted.md @@ -0,0 +1,3 @@ +# Getting started + +This video is a bit outdated since it was made using the previous version, but the concepts are the same as what we do now. You can watch the video [here](https://www.youtube.com/watch?v=sYjgDIgD7AY) or use the new and improved guide [here](./BeginnersGuideStepByStep.md) diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG new file mode 100644 index 0000000..7a6d0e5 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG.import new file mode 100644 index 0000000..80f8a14 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Character_Editor_With_Portrait.PNG" +dest_files=[ "res://.import/Character_Editor_With_Portrait.PNG-88588c77d89d8a1c2f15f9be07073a87.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG new file mode 100644 index 0000000..16dc26b Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG.import new file mode 100644 index 0000000..2f11309 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Dialogic_Tab.PNG" +dest_files=[ "res://.import/Dialogic_Tab.PNG-3a868bb7f47fb141608e40d56ba89603.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG new file mode 100644 index 0000000..ee1e6e4 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG.import new file mode 100644 index 0000000..4f8188d --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Character_Editor.PNG" +dest_files=[ "res://.import/Empty_Character_Editor.PNG-b81e9a25b7190089d68ae8c2351d5ed6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG new file mode 100644 index 0000000..aedb089 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG.import new file mode 100644 index 0000000..27bb2d8 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Empty_Timeline_Editor.PNG" +dest_files=[ "res://.import/Empty_Timeline_Editor.PNG-508a5eb2b419ec35635764d597b0d17f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG new file mode 100644 index 0000000..c8469dc Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG.import new file mode 100644 index 0000000..f63e333 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_Example.PNG" +dest_files=[ "res://.import/Glossary_Example.PNG-c2cbcb58bda208cde5fff6ba9306fe10.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG new file mode 100644 index 0000000..56588fd Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG.import new file mode 100644 index 0000000..7cf601a --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Glossary_ExampleLook.PNG" +dest_files=[ "res://.import/Glossary_ExampleLook.PNG-7b274bf4b5547fb36a98967673b795df.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG new file mode 100644 index 0000000..c8b51a3 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG.import new file mode 100644 index 0000000..bbc3e51 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Import_Selection.PNG" +dest_files=[ "res://.import/Import_Selection.PNG-c43f6694aa6604864297e096cdd63b91.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG new file mode 100644 index 0000000..6c7595d Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG.import new file mode 100644 index 0000000..3347cb1 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/TimelineEditor_Example.PNG" +dest_files=[ "res://.import/TimelineEditor_Example.PNG-15eec17720b37f03e5438065226d14ca.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG new file mode 100644 index 0000000..a2f9c83 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG.import new file mode 100644 index 0000000..a88479a --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Toolbar.PNG" +dest_files=[ "res://.import/Toolbar.PNG-c15bbedd058e9f4460ab85836a52b6e3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG new file mode 100644 index 0000000..473b413 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG.import new file mode 100644 index 0000000..2b0bf5d --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/ValueInUse.PNG" +dest_files=[ "res://.import/ValueInUse.PNG-b73ec239496719f3ef4c2c5e92505090.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG new file mode 100644 index 0000000..2f8dfbd Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG.import new file mode 100644 index 0000000..10ab465 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Value_Example1.PNG" +dest_files=[ "res://.import/Value_Example1.PNG-c634010ced69a9a3f06bd3f936197066.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG new file mode 100644 index 0000000..7419f65 Binary files /dev/null and b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG differ diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG.import b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG.import new file mode 100644 index 0000000..2c4e907 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Documentation/Content/Tutorials/Images/Value_ExampleTimeline.PNG" +dest_files=[ "res://.import/Value_ExampleTimeline.PNG-6bfa8a46f616569450bd2d9b8ad27fe3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Saving.md b/project/addons/dialogic/Documentation/Content/Tutorials/Saving.md new file mode 100644 index 0000000..1223fa3 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Saving.md @@ -0,0 +1,52 @@ +# Saving and loading + +Dialogic can handle saving and loading the game for you. + +## Simple saving +By default, Dialogic's autosave settings are turned on. They will save whenever you start a new timeline. +To trigger a save you can also use the `Save` event, or call `Dialogic.save()`. + +## Simple loading +All the saving in the world will have little visible effece if you don't load your dialogue. + +To do so, you can call `Dialogic.load()`. + +Then you can use `Dialogic.start('')` to play from the last saved point. As a fallback (for the first game, or if the player finished the game last time), you can give a default timeline as the second argument: `Dialogic.start('', 'Chapter1')`. + +In case you want to restart, you can do `Dialogic.reset_saves()` before calling `Dialogic.start()`. + + + +## Implementing save slots +Many games allow you to have more then one save at the same time. + +To make this easily possible, you can do `Dialogic.save('slot_name')` and `Dialogic.load('slot_name')`. + +There are some more functions for slots: + +- `Dialogic.get_slot_list()` returns a list of slots. +- `Dialogic.erase_slot('slot_name')` deletes the given slot. +- `Dialogic.get_current_slot()` returns the name of the last loaded slot. +- `Dialogic.reset_saves('slot_name')` will reset the given slot. + +For making menus with this, the function `Dialogic.has_current_dialog_node()` is useful, as it will tell you whether a dialogue node is instanced right now. + +For **visual novels** there is a [template with a full menu](https://github.com/Dialogic-Godot/visual-novel-template). You can look at the implementation there if you are want to know how to do a menu. + + +## Custom saving/loading (export+import) +Some games might not want to use dialogic's built in saving system, but still want to save and load dialogic data. + +The `Dialogic.export()` function will give you all the important information in a dictionary that you can save or do whatever you want with. + +You can then use `Dialogic.import(data)` to import a dictionary. After you have done so, you can use `Dialogic.start('')` like before. + + +## Saving custom information +Dialogic has a dictionary of custom information that you can use to store things unrelated to dialogic too. You could store your players location in there or other variables. + +There are two functions for this: +- `Dialogic.get_saved_state_general_key('key')` +- `Dialogic.set_saved_state_general_key('key', value)` + +This dictionary is saved and loaded (or exported/imported) alongside the other information. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Updating.md b/project/addons/dialogic/Documentation/Content/Tutorials/Updating.md new file mode 100644 index 0000000..d9dfbd4 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Updating.md @@ -0,0 +1,17 @@ +# Updating to 1.4 + +1.4 has brought some big changes, and a few changed the behavior in a way that might break some older code of yours. +This assumes you are upgrading from version 1.3. + +Here is everything you need to do to successfully updated (as far as we know): + +## 1. Make a backup of your project + - Close your project/Godot + - Make a full project backup just in case you lose some data while upgrading + - Remove the `/addons/dialogic` folder from your project + - Paste the new Dialogic 1.4 into the addons folder + - Open your project/Godot again + - Enable the new Dialogic from the plugin menu (Project Settings/Plugins) + +## Update the call node events target functions + - The `Call Node Event` now sends arguments instead of a single array. If you were using it in one of your timelines you will need to update the functions you are calling to accommodate this. So if the function you were calling before was something like `func hello(Array)` now it should be `func hello(argument1, argument2, argument3, ...)` with as many arguments as you have in the event settings. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/Values.md b/project/addons/dialogic/Documentation/Content/Tutorials/Values.md new file mode 100644 index 0000000..1bd8136 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/Values.md @@ -0,0 +1,19 @@ +# Values + +Values are a dialogic resource that allows to store strings and integers and easily reference them with dialogic. + +Once created, a value with a name (e.g. `PlayerName` or `PlayerStrength`) can be added into text events by using square brackets: +![Value is being used](./Images/ValueInUse.PNG) + +It can also be used in conditions (Condition Event, Choice Event). + +From outside values can be accessed using the DialogiClass: +``` +func _ready(): + Dialogic.set_variable('PlayerName', 'John') + if Dialogic.get_variable('PlayerStrength') > 10: + print("Wow, so strong!") +``` + +You can also use the whole path when referencing variables. In text this could look like `[Characters/Player/Name]`, in code like `Dialogic.set_variable('Characters/Player/Name', 'Sally')`. + diff --git a/project/addons/dialogic/Documentation/Content/Tutorials/VoiceLines.md b/project/addons/dialogic/Documentation/Content/Tutorials/VoiceLines.md new file mode 100644 index 0000000..95e1ed5 --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Tutorials/VoiceLines.md @@ -0,0 +1,20 @@ +# Voice Line Support + +You can add audio to your text events! Here's what you have to do: + +## 1. Settings +In Dialogic's `Settings` window, enable audio for Text events. + +I recommend also creating a `new audio bus` for your voice lines. +If you do this correctly now and select it as the default bus (the next setting), you wont have to select it every time. +Having a seperate bus allows you to control the volume and effects of the voice lines seperately from your other audio. + +## 2. Adding audio to your Text events +Now when you see a Text or Question event, you should find that it has a new section called 'Audio Pickers'. +For each line (except if "New lines create extra messages" is off) you will find an Audio picker. +You can select the `audio file` you want to play while that line is shown. + +You can also change `volume`, `audiobus`, and an `audio region` (the second to begin at and the one where to end). +Leave both audio-regions at 0 to play the whole file. + +Great! That's all you need to know. \ No newline at end of file diff --git a/project/addons/dialogic/Documentation/Content/Welcome.md b/project/addons/dialogic/Documentation/Content/Welcome.md new file mode 100644 index 0000000..458903f --- /dev/null +++ b/project/addons/dialogic/Documentation/Content/Welcome.md @@ -0,0 +1,71 @@ +![WelcomeImage](./Images/dialogic-hero-1.3.png) +Welcome to the help pages. Here you can find all the information available on how to use the plugin and its parts. + +If you are looking for something specific, you can use the filter in the upper left. If you need extra help you can ask questions here: [GitHub Discussions](https://github.com/coppolaemilio/dialogic/discussions) or alternatively chat about the development of Dialogic on [Emilio's Discord server](https://discord.gg/v4zhZNh)! + +This project is made possible by the support of our [Patreons](https://www.patreon.com/coppolaemilio) and Github Sponsors. + +# Index +## Events +- [Text Event](./Events/001.md) +- [Character Event](./Events/002.md) +- [Question Event](./Events/010.md) +- [Choice Event](./Events/011.md) +- [Condition Event](./Events/012.md) +- [End Event](./Events/013.md) +- [Set Value](./Events/014.md) +- [Audio Events](./Events/030.md) +- [Emit Signal](./Events/040.md) +- [Change Scene](./Events/041.md) +- [Call Node](./Events/042.md) + +## FAQ +- [Can I use Dialogic in one of my projects?](./FAQ/can-i-use-dialogic-in-my-project.md) +- [Can I create a timeline using GDScript?](./FAQ/create-timeline-using-gdscript.md) +- [Can I use C# with Dialogic?](./FAQ/CSharp.md) +- [How can I make a dialog show up in game?](./FAQ/how-to-make-dialog-show-up-in-game.md) +- [The plugin is cool! Why is it not shipped with Godot?](./FAQ/plugin-shipped-godot.md) +- [Portraits not showing in game?](./FAQ/portraits-not-showing.md) +- [How can I define animated portraits?](./FAQ/custom-portraits.md) +- [My resolution is too small and the dialog is too big.](./FAQ/resolution-small-dialog-big.md) +- [Using signals?](./FAQ/Signals.md) +- [Why are you not using graph nodes?](./FAQ/why-not-graph-nodes.md) +- [What kind of touch support is available?](./FAQ/touch-support-tutorial.md) + +## Reference +- [Dialog node](./Reference/000.md) +- [Dialog Class](./Reference/001.md) +- [Timeline Editor](./Reference/Timeline.md) +- [Character Editor](./Reference/Character.md) +- [Theme Editor](./Reference/Theme.md) +- [History Log](./Reference/History.md) + +## Tutorials +- [Beginners Guide](./Tutorials/BeginnersGuideStepByStep.md) +- [Getting started (video)](https://www.youtube.com/watch?v=sYjgDIgD7AY) +- [Updating to 1.4](./Tutorials/Updating.md) +- [Saving and Loading](./Tutorials/Saving.md) +- [Creating Custom Events](./Events/CustomEvents/CreateCustomEvents.md) +- [Adding Character Animations](./Tutorials/AddingNewAnimations.md) +- [Voice Line Support](./Tutorials/VoiceLines.md) + + + +# Dialogic is made by: +**[Emilio Coppola](https://github.com/coppolaemilio)** +[Jowan-Spooner](https://github.com/Jowan-Spooner) +[Tim Krief](https://github.com/timkrief) +[zaknafean](https://github.com/zaknafean) +[ellogwen](https://github.com/ellogwen) +[AnidemDex](https://github.com/AnidemDex) +[Arnaud Vergnet](https://github.com/arnaudvergnet) +And many [more](https://github.com/coppolaemilio/dialogic/graphs/contributors)! + + +# License +MIT License +Copyright (c) 2020 Emilio Coppola + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/project/addons/dialogic/Documentation/Nodes/DocsMarkdownParser.gd b/project/addons/dialogic/Documentation/Nodes/DocsMarkdownParser.gd new file mode 100644 index 0000000..1b1b171 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocsMarkdownParser.gd @@ -0,0 +1,202 @@ +extends Node + +var heading1_font = "res://addons/dialogic/Documentation/Theme/DocumentationH1.tres" +var heading2_font = "res://addons/dialogic/Documentation/Theme/DocumentationH2.tres" +var heading3_font = "res://addons/dialogic/Documentation/Theme/DocumentationH3.tres" +var heading4_font = "res://addons/dialogic/Documentation/Theme/DocumentationH4.tres" +var heading5_font = "res://addons/dialogic/Documentation/Theme/DocumentationH5.tres" + +## These will change with each parsing, but can be saved manually after parsing +var heading1s = [] +var heading2s = [] +var heading3s = [] +var heading4s = [] +var heading5s = [] +var result = "" +var bolded = [] +var italics = [] +var striked = [] +var coded = [] +var linknames = [] +var links = [] +var imagenames = [] +var imagelinks = [] +var lists = [] +var underlined = [] + +var accent_color := Color() +var sub_accent_color := Color() + +var editor_scale := 1.0 + +################################################################################ +## PUBLIC FUNCTIONS ## +################################################################################ + +func set_accent_colors(new_accent_color : Color, new_sub_accent_color : Color) -> void: + accent_color = new_accent_color + sub_accent_color = new_sub_accent_color + +### Takes a markdown string and returns it as BBCode +func parse(content : String, file_path:String = '', docs_path:String = ''): + + heading1s = [] + heading2s = [] + heading3s = [] + heading4s = [] + heading5s = [] + result = "" + bolded = [] + italics = [] + striked = [] + coded = [] + linknames = [] + links = [] + imagenames = [] + imagelinks = [] + lists = [] + underlined = [] + + var parsed_text = content + + var regex = RegEx.new() + + ## Remove all comments + # TODO: remove comments + + + ## Find all occurences of bold text + regex.compile('\\*\\*(?(\\.|[^(\\*\\*)])*)\\*\\*') + result = regex.search_all(content) + if result: + for res in result: + parsed_text = parsed_text.replace("**"+res.get_string("boldtext")+"**","[b]"+res.get_string("boldtext")+"[/b]") + + ## Find all occurences of underlined text + regex.compile('\\_\\_(?.*)\\_\\_') + result = regex.search_all(content) + if result: + for res in result: + parsed_text = parsed_text.replace("__"+res.get_string("underlinetext")+"__","[u]"+res.get_string("underlinetext")+"[/u]") + + ## Find all occurences of italic text + regex.compile("\\*(?[^\\*]*)\\*") + result = regex.search_all(content) + if result: + for res in result: + parsed_text = parsed_text.replace("*"+res.get_string('italictext')+'*', "[i]"+res.get_string('italictext')+"[/i]") +# italics.append(res.get_string("italictext")) +# for italic in italics: +# content = content.replace("*"+italic+"*",) + + + ## Find all occurences of underlined text + regex.compile("~~(?.*)~~") + result = regex.search_all(content) + if result: + for res in result: + parsed_text = parsed_text.replace("~~"+res.get_string("strikedtext")+"~~","[s]"+res.get_string("strikedtext")+"[/s]") + + ## Find all occurences of code snippets + regex.compile("(([^`]`)|(```))(?[^`]+)(?(2)(`)|(```))") + result = regex.search_all(content) + if result: + for res in result: + if res.get_string().begins_with("```"): + parsed_text = parsed_text.replace("```"+res.get_string("coded")+"```","[indent][color=#"+accent_color.lightened(0.6).to_html()+"][code]"+res.get_string("coded")+"[/code][/color][/indent]") + else: + parsed_text = parsed_text.replace("`"+res.get_string("coded")+"`","[color=#"+accent_color.lightened(0.6).to_html()+"][code]"+res.get_string("coded")+"[/code][/color]") + + + + ## Find all occurences of list items + regex.compile("\\n\\s*(?[-+*])(?\\s.*)") + result = regex.search_all(parsed_text) + if result: + for res in result: + var symbol = res.get_string('symbol') + var element = res.get_string("element") + if parsed_text.find(symbol+" "+element): + parsed_text = parsed_text.replace(symbol+" "+element,"[indent]"+symbol+" "+element+"[/indent]") + + ## Find all occurences of images + regex.compile("!\\[(?.*)\\]\\((?.*)\\)") + result = regex.search_all(content) + if result: + for res in result: + if res.get_string("imglink")!="": + imagelinks.append(res.get_string("imglink")) + if res.get_string("imgname")!="": + imagenames.append(res.get_string("imgname")) + + ## Find all occurences of links (that are not images) + regex.compile("[^!]\\[(?[^\\[]+)\\]\\((?[^\\)]*\\S*?)\\)") + result = regex.search_all(content) + if result: + for res in result: + if res.get_string("link")!="": + links.append(res.get_string("link")) + if res.get_string("linkname")!="": + linknames.append(res.get_string("linkname")) + + ## Find all heading1s + regex.compile("(?:\\n|^)#(?[^#\\n]+[^\\n]+)") + result = regex.search_all(content) + if result: + for res in result: + var heading = res.get_string("heading") + heading1s.append(heading) + parsed_text = parsed_text.replace("#"+heading, "[color=#"+accent_color.lightened(0.2).to_html()+"][font="+heading1_font+"]"+heading.strip_edges()+"[/font][/color]") + + ## Find all heading2s + regex.compile("(?:\\n|^)##(?[^#\\n]+[^\\n]+)") + result = regex.search_all(content) + if result: + for res in result: + var heading = res.get_string("heading") + heading2s.append(heading) + parsed_text = parsed_text.replace("\n##"+heading, "\n[color=#"+accent_color.lightened(0.5).to_html()+"][font="+heading2_font+"]"+heading.strip_edges()+"[/font][/color]") + + ## Find all heading3s + regex.compile("(?:\\n|^)###(?[^#\\n]+[^\\n]+)") + result = regex.search_all(content) + if result: + for res in result: + var heading = res.get_string("heading") + parsed_text = parsed_text.replace("\n###"+heading, "\n[color=#"+accent_color.lightened(0.7).to_html()+"][font="+heading3_font+"]"+heading.strip_edges()+"[/font][/color]") + + ## Find all heading4s + regex.compile("(?:\\n|^)####(?[^#\\n]+[^\\n]+)") + result = regex.search_all(content) + if result: + for res in result: + var heading = res.get_string("heading") + parsed_text = parsed_text.replace("\n####"+heading, "\n[color=#"+accent_color.lightened(0.85).to_html()+"][font="+heading4_font+"]"+heading.strip_edges()+"[/font][/color]") + + + ## Find all heading5s + regex.compile("(?:\\n|^)#####(?[^#\\n]+[^\\n]+)") + result = regex.search_all(content) + if result: + for res in result: + var heading = res.get_string("heading") + parsed_text = parsed_text.replace("\n#####"+heading, "\n[color=#"+accent_color.lightened(0.85).to_html()+"][font="+heading5_font+"]"+heading.strip_edges()+"[/font][/color]") + + for i in links.size(): + parsed_text = parsed_text.replace("["+linknames[i]+"]("+links[i]+")","[color=#"+accent_color.to_html()+"][url="+links[i]+"]"+linknames[i]+"[/url][/color]") + + for i in imagenames.size(): + var imagelink_to_use = imagelinks[i] + if imagelink_to_use.begins_with("http"): + var path_parts = imagelink_to_use.split("/Documentation/") + if path_parts.size() > 1: + imagelink_to_use = docs_path +"/"+ path_parts[1] + else: + imagelink_to_use = "icon.png" + if imagelink_to_use.begins_with(".") and file_path: + imagelink_to_use = file_path.trim_suffix(file_path.get_file()).trim_suffix("/") + imagelink_to_use.trim_prefix(".") + parsed_text = parsed_text.replace("!["+imagenames[i]+"]("+imagelinks[i]+")","[img="+str(int(700*editor_scale))+"]"+imagelink_to_use+"[/img]") + + parsed_text += "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + + return parsed_text diff --git a/project/addons/dialogic/Documentation/Nodes/DocsPageViewer.gd b/project/addons/dialogic/Documentation/Nodes/DocsPageViewer.gd new file mode 100644 index 0000000..66e59f2 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocsPageViewer.gd @@ -0,0 +1,206 @@ +tool +extends Control + +export (bool) var enable_editing = false +# needs to be corrected, if you use this on a diffrent plugin!!! +export (String) var documentation_path: String = "res://addons/dialogic/Documentation" +var MarkdownParser = load("res://addons/dialogic/Documentation/Nodes/DocsMarkdownParser.gd").new() + +var current_path: String = "" +var current_headings = [] + +onready var Content = $Content + +signal open_non_html_link(link, section) + +################################################################################ +## PUBLIC FUNCTIONS ## +################################################################################ + +## Opens a page at path PAGE_PATH +## The PAGE_PATH can be a full godot path or a path from Documentation/Content +## E.g.: +## "res://addons/thing/Documentation/Content/Tuts/welcome.md" == "Tuts/welcome" +## +## The section can either be passed as a second argument or in the PAGE_PATH with # +## E.g.: "Tuts/welcome#how-to-use-the-plugin" == "Tuts/welcome", "#how-to-use-the-plugin" +func load_page(page_path: String, section : String=''): + Content.set('custom_styles/normal', StyleBoxEmpty.new()) + Content.get('custom_styles/normal').content_margin_left = 15 + Content.get('custom_styles/normal').content_margin_top = 15 + Content.get('custom_styles/normal').content_margin_right = 15 + Content.get('custom_styles/normal').content_margin_bottom = 15 + + var base_size = 16 + Content.set('custom_fonts/normal_font/size', int(base_size * get_constant("scale", "Editor"))) + Content.set('custom_fonts/bold_font/size', int(base_size * get_constant("scale", "Editor"))) + #Content.set('custom_fonts/italics_font/size', int(base_size * get_constant("scale", "Editor"))) + Content.set('custom_fonts/mono_font/size', int(base_size * get_constant("scale", "Editor"))) + Content.set('custom_fonts/bold_italics_font/size', int(base_size * get_constant("scale", "Editor"))) + + + # Fonts + Content.set('custom_fonts/mono_font', get_font("doc_source", "EditorFonts")) + Content.set('custom_fonts/bold_font', Content.get_font("doc_bold", "EditorFonts")) + + MarkdownParser.set_accent_colors(get_color("accent_color", "Editor"),get_color("disabled_font_color", "Editor")) + # return if no path is given + if page_path == '' and not section: + return + + show() + _on_Content_resized() + + #print("load page ", page_path) + # find a section specifier at the end of the path + if page_path.count("#") > 0: + var result = page_path.split('#') + page_path = result[0] + section = '#'+result[1] + + # add necessary parts to the path + if not page_path.begins_with("res://"): + page_path = documentation_path+"/Content/"+page_path + if not page_path.ends_with('.md'): + page_path += ".md" + + # opening the file + var f = File.new() + f.open(page_path,File.READ) + current_path = page_path + + # parsing the file + Content.bbcode_text = MarkdownParser.parse(f.get_as_text(), current_path, documentation_path) + f.close() + + # saving the headings for going to sections + current_headings = MarkdownParser.heading1s + MarkdownParser.heading2s + MarkdownParser.heading3s + MarkdownParser.heading4s + MarkdownParser.heading5s + create_content_menu(MarkdownParser.heading1s + MarkdownParser.heading2s) + + # scroll to the given section + if not scroll_to_section(section): + Content.scroll_to_line(0) + + # Scroll to top of the document. This probably broke the previews "scroll to the given section" part of the code + yield(get_tree(), "idle_frame") + _on_Up_pressed() + + +# looks if there is a heading similar to the given TITLE and then scrolls there +func scroll_to_section(title): + if not title: + return + # this is not really nicely done... + for heading in current_headings: + if (heading.to_lower().strip_edges().replace(' ', '-') == title.replace('#', '')) or \ + (heading.to_lower().strip_edges() == title.to_lower().strip_edges()): + var x = Content.bbcode_text.find(heading.replace('#', '').strip_edges()+"[/font]") + x = Content.bbcode_text.count("\n", 0, x) + Content.scroll_to_line(x) + + $ContentMenu/Panel.hide() + + return true + + +################################################################################ +## PRIVATE FUNCTIONS ## +################################################################################ + +func _ready(): + $Up.icon = get_icon("ArrowUp", "EditorIcons") + + $Editing.visible = enable_editing + + +# creates the conten menu +func create_content_menu(headings): + for child in $ContentMenu/Panel/VBox.get_children(): + child.queue_free() + if len(headings) < 2: + $ContentMenu.hide() + return + $ContentMenu.show() + headings.pop_front() + for heading in headings: + var button = Button.new() + button.set("custom_styles/normal", get_stylebox("sub_inspector_bg0", "Editor")) + button.text = heading + button.align = Button.ALIGN_LEFT + button.connect("pressed", self, "content_button_pressed", [heading]) + $ContentMenu/Panel/VBox.add_child(button) + + +func content_button_pressed(heading): + scroll_to_section(heading) + $ContentMenu/ToggleContents.pressed = false + + +## When one of the links is clicked +func _on_meta_clicked(meta): + ## Check wether this is a real LINK + if meta.begins_with("http"): + + # test if we can interpret this as a normal link to a docs file + if meta.count("Documentation/Content") > 0: + meta = meta.split("Documentation/Content")[1] + + # else open it with the browser + else: + OS.shell_open(meta) + return + + ## Check wether it is a section + if meta.begins_with("#"): + # try to open it in this document + scroll_to_section(meta) + + ## Else send a signal that the pluginmaker has to interpret + else: + # if the link contains a section + var link = meta + var section = null + if meta.count("#") > 0: + var split = meta.split('#') + link = split[0] + section = split[1] + if link.begins_with('.'): + link = current_path.trim_suffix(current_path.get_file()).trim_suffix("/") + link.trim_prefix(".") + if not link.begins_with("res://"): + link = documentation_path.plus_file('Content').plus_file(link) + if not link.ends_with(".md"): + link += '.md' + + emit_signal("open_non_html_link", link, section) + + +func _on_EditPage_pressed(): + var x = File.new() + x.open(current_path, File.READ) + OS.shell_open(x.get_path_absolute()) + + +func _on_RefreshPage_pressed(): + load_page(current_path) + + +func _on_Up_pressed(): + Content.scroll_to_line(0) + + +func _on_ToggleContents_toggled(button_pressed): + $ContentMenu/Panel.visible = button_pressed + +func toggle_editing(): + enable_editing = !enable_editing + $Editing.visible = enable_editing + +func _on_Content_resized(): + if not Content: return + if Content.rect_size.x < 500: + Content.get('custom_styles/normal').content_margin_left = 15 + Content.get('custom_styles/normal').content_margin_right = 15 + else: + Content.get('custom_styles/normal').content_margin_left = (Content.rect_size.x-500)/4 + Content.get('custom_styles/normal').content_margin_right = (Content.rect_size.x-500)/3 + Content.update() diff --git a/project/addons/dialogic/Documentation/Nodes/DocsPageViewer.tscn b/project/addons/dialogic/Documentation/Nodes/DocsPageViewer.tscn new file mode 100644 index 0000000..e0d5dd5 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocsPageViewer.tscn @@ -0,0 +1,178 @@ +[gd_scene load_steps=13 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Regular.ttf" type="DynamicFontData" id=1] +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf" type="DynamicFontData" id=2] +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Italic.ttf" type="DynamicFontData" id=3] +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocsPageViewer.gd" type="Script" id=6] + +[sub_resource type="StyleBoxEmpty" id=1] +content_margin_left = 89.5 +content_margin_right = 119.333 + +[sub_resource type="DynamicFont" id=2] +use_filter = true +extra_spacing_char = 2 +extra_spacing_space = 2 +font_data = ExtResource( 1 ) + +[sub_resource type="DynamicFont" id=3] +use_filter = true +font_data = ExtResource( 2 ) + +[sub_resource type="DynamicFont" id=4] +font_data = ExtResource( 3 ) + +[sub_resource type="DynamicFont" id=5] +font_data = ExtResource( 2 ) + +[sub_resource type="DynamicFont" id=6] +use_filter = true +font_data = ExtResource( 1 ) + +[sub_resource type="Image" id=9] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=8] +flags = 4 +flags = 4 +image = SubResource( 9 ) +size = Vector2( 16, 16 ) + +[node name="DocsPageViewer" type="Control"] +margin_right = 1024.0 +margin_bottom = 600.0 +focus_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 6 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Content" type="RichTextLabel" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_min_size = Vector2( 50, 0 ) +focus_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/normal = SubResource( 1 ) +custom_fonts/mono_font = SubResource( 2 ) +custom_fonts/bold_italics_font = SubResource( 3 ) +custom_fonts/italics_font = SubResource( 4 ) +custom_fonts/bold_font = SubResource( 5 ) +custom_fonts/normal_font = SubResource( 6 ) +custom_colors/selection_color = Color( 0.45098, 0.45098, 0.45098, 0.45098 ) +bbcode_enabled = true +bbcode_text = "Can't find the specified file." +text = "Can't find the specified file." +scroll_following = true +selection_enabled = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Editing" type="HBoxContainer" parent="."] +visible = false +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -202.807 +margin_top = 8.09956 +margin_right = -8.80664 +margin_bottom = 33.0996 +grow_horizontal = 0 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RefreshPage" type="Button" parent="Editing"] +margin_left = 94.0 +margin_right = 154.0 +margin_bottom = 25.0 +text = "Refresh" + +[node name="EditPage" type="Button" parent="Editing"] +margin_left = 158.0 +margin_right = 194.0 +margin_bottom = 25.0 +text = "Edit" + +[node name="Up" type="Button" parent="."] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -40.5946 +margin_top = -41.6541 +margin_right = -10.5946 +margin_bottom = -11.6541 +rect_min_size = Vector2( 30, 30 ) +hint_tooltip = "Back to top" +icon = SubResource( 8 ) +expand_icon = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ContentMenu" type="VBoxContainer" parent="."] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -207.0 +margin_top = -590.0 +margin_right = -49.0 +margin_bottom = -13.0 +grow_horizontal = 0 +grow_vertical = 0 +rect_min_size = Vector2( 50, 40 ) +size_flags_horizontal = 0 +size_flags_vertical = 9 +custom_constants/separation = 20 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="Control" parent="ContentMenu"] +visible = false +margin_top = 537.0 +margin_right = 158.0 +margin_bottom = 537.0 + +[node name="VBox" type="VBoxContainer" parent="ContentMenu/Panel"] +margin_top = -88.0 +margin_right = 156.0 +margin_bottom = 4.0 +grow_horizontal = 0 +grow_vertical = 0 +size_flags_horizontal = 3 +alignment = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ToggleContents" type="Button" parent="ContentMenu"] +margin_top = 557.0 +margin_right = 158.0 +margin_bottom = 577.0 +toggle_mode = true +text = "Contents" + +[node name="Control" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 + +[connection signal="meta_clicked" from="Content" to="." method="_on_meta_clicked"] +[connection signal="resized" from="Content" to="." method="_on_Content_resized"] +[connection signal="pressed" from="Editing/RefreshPage" to="." method="_on_RefreshPage_pressed"] +[connection signal="pressed" from="Editing/EditPage" to="." method="_on_EditPage_pressed"] +[connection signal="pressed" from="Up" to="." method="_on_Up_pressed"] +[connection signal="toggled" from="ContentMenu/ToggleContents" to="." method="_on_ToggleContents_toggled"] diff --git a/project/addons/dialogic/Documentation/Nodes/DocsTreeHelper.gd b/project/addons/dialogic/Documentation/Nodes/DocsTreeHelper.gd new file mode 100644 index 0000000..9184d27 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocsTreeHelper.gd @@ -0,0 +1,224 @@ +tool +extends Control + +# Don't change this if possible +export (String) var documentation_path : String = "res://addons/dialogic/Documentation" + +# This enables/disables the use of folder files +# If enabled, the docs will expect a file named +# exactly like a folder for each folder in the docs: +## E.g.: If you have a Tutorials folder somewhere put a Tutorials.md file next to it. +## This way the folder will be clickable and you can see the page, +## but it won't be shown as a separate page +var use_folder_files = true + +# These files will not be listed. Just use the filename! No paths in here +var file_ignore_list = ['Welcome.md'] + + +################################################################################ +## PUBLIC FUNCTIONS ## +################################################################################ + +## Returns a dictionary that contains the important parts of the +## documentations Content folder. +## +## This is mainly used if you want to somehow display a list of the docs content, +## for example to create a file-tree or a list of documents +## +## Only files ending on .md are noticed. +## Folders that contain no such files are ignored +func get_documentation_content(): + return get_dir_contents(documentation_path+"/Content") + +## Will create a hirarchy of TreeItems on the given 'trees' root_item +## If not root_item is given a new root_item will be created +## The root item does not have to be the actual root item of the whole tree, +## but the root of the documentation branch. +## +## With def_folder_info and def_page_info special information can be +## added to the meta of the Items +## +## If a filter_term is given, only items with that filter will be created. +## Right now there will always be all folders. +func build_documentation_tree(tree : Tree, root_item:TreeItem = null, def_folder_info:Dictionary = {}, def_page_info:Dictionary = {}, filter_term:String = ''): + return _build_documentation_tree(tree, root_item, def_folder_info, def_page_info, filter_term) + + +################################################################################ +## PRIVATE FUNCTIONS ## +################################################################################ + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### LOOKING THROUGH THE DOCS FOLDERS: + +func get_dir_contents(rootPath: String) -> Dictionary: + var directory_structure = {} + var dir := Directory.new() + + if dir.open(rootPath) == OK: + dir.list_dir_begin(true, false) + directory_structure = _add_dir_contents(dir) + else: + push_error("Docs: An error occurred when trying to access the path.") + return directory_structure + +func _add_dir_contents(dir: Directory) -> Dictionary: + var file_name = dir.get_next() + + var structure = {} + while (file_name != ""): + var path = dir.get_current_dir() + "/" + file_name + if dir.current_is_dir(): + #print("Found directory: %s" % path) + var subDir = Directory.new() + subDir.open(path) + subDir.list_dir_begin(true, false) + var dir_content = _add_dir_contents(subDir) + if dir_content.has('_files_'): + structure[path] = dir_content + else: + #print("Found file: %s" % path) + if not file_name.ends_with(".md"): + file_name = dir.get_next() + continue + if file_name in file_ignore_list: + file_name = dir.get_next() + continue + if not structure.has("_files_"): + structure["_files_"] = [] + + structure["_files_"].append(path) + + file_name = dir.get_next() + dir.list_dir_end() + return structure + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### For bouilding the tree + +func _build_documentation_tree(tree : Tree, root_item:TreeItem = null, def_folder_info:Dictionary = {}, def_page_info:Dictionary = {}, filter_term:String =''): + + var documentation_tree + if root_item == null: + documentation_tree = tree.create_item() + documentation_tree.set_text(0, "Documentation") + + else: + documentation_tree = root_item + + # if no search is performed, collapse the tree by default + if not filter_term: + documentation_tree.collapsed = true + else: + documentation_tree.collapsed = false + + # create the rest of the tree based on the dict we get from the DocsHelper + var doc_structure = get_documentation_content() + #print(doc_structure) + create_doc_tree(tree, documentation_tree, def_folder_info, def_page_info, doc_structure, filter_term) + return documentation_tree + +# this calls itself recursivly to create the tree, based on the given dict +func create_doc_tree(tree, parent_item, def_folder_info, def_page_info, doc_structure, filter_term): + for key in doc_structure.keys(): + # if this is a folder + if typeof(doc_structure[key]) == TYPE_DICTIONARY: + var folder_item = _add_documentation_folder(tree, parent_item, {'name':key.get_file(), 'path':key}, def_folder_info) + create_doc_tree(tree, folder_item, def_folder_info, def_page_info, doc_structure[key], filter_term) + if not filter_term: + folder_item.collapsed = true + # if this is a page + elif typeof(doc_structure[key]) == TYPE_ARRAY: + for file in doc_structure[key]: + if use_folder_files and file.trim_suffix('.md') in doc_structure.keys(): + pass + else: + if not filter_term or (filter_term and filter_term.to_lower() in get_title(file, '').to_lower()): + _add_documentation_page(tree, parent_item, {'name':file.get_file().trim_suffix(".md"), 'path': file}, def_page_info) + +func merge_dir(target: Dictionary, patch: Dictionary): + var copy = target.duplicate() + for key in patch: + copy[key] = patch[key] + return copy + +# this adds a folder item to the tree +func _add_documentation_folder(tree, parent_item, folder_info, default_info): + var item = tree.create_item(parent_item) + item.set_text(0, folder_info['name']) + item.set_icon(0, tree.get_icon("HelpSearch", "EditorIcons")) + item.set_editable(0, false) + if use_folder_files: + var x = File.new() + if x.file_exists(folder_info['path']+'.md'): + folder_info['path'] += '.md' + else: + folder_info['path'] = '' + else: + folder_info['path'] = '' + item.set_metadata(0, merge_dir(default_info, folder_info)) + if not tree.get_constant("dark_theme", "Editor"): + item.set_icon_modulate(0, get_color("property_color", "Editor")) + return item + +# this adds a page item to the tree +func _add_documentation_page(tree, parent, page_info, default_info): + var item = tree.create_item(parent) + item.set_text(0, get_title(page_info['path'], page_info['name'])) + item.set_tooltip(0,page_info['path']) + item.set_editable(0, false) + item.set_icon(0, tree.get_icon("Help", "EditorIcons")) + var new_dir = merge_dir(default_info, page_info) + #print(new_dir) + item.set_metadata(0,new_dir) + if not tree.get_constant("dark_theme", "Editor"): + item.set_icon_modulate(0, get_color("property_color", "Editor")) + return item + +# returns the first line of a text_file, a bit cleaned up +func get_title(path, default_name): + # opening the file + var f = File.new() + f.open(path, File.READ) + var arr = f.get_as_text().split('\n', false, 1) + if not arr.empty(): + return arr[0].trim_prefix('#').strip_edges() + else: + return default_name +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## For searching the tree +## used to search and select an item of the tree based on a info saved in the metadata +## in most cases you just want to search for the item that has a certain path +## +## the paren_item parameter is only used so this can call itself recursivly +func search_and_select_docs(docs_tree_item:TreeItem, info:String, key:String = 'path'): + if info == "": return + if info == "/": + docs_tree_item.select(0) + return true + #print("Asearch ", key, " ", info) + #print("Asearchin on item: ", docs_tree_item.get_text(0)) + var item = docs_tree_item.get_children() + while item: + #print("A ",item.get_text(0)) + if not item.has_method('get_metadata'): + item = item.get_next() + + var meta = item.get_metadata(0) + #print(meta) + if meta.has(key): + if meta[key] == info: + item.select(0) + return true + if search_and_select_docs(item, info, key): + return true + item = item.get_next() + return false + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#### For bouilding the tree +#func create_reference(): +# var RefColl = ReferenceCollector.new() +# RefColl._run() diff --git a/project/addons/dialogic/Documentation/Nodes/DocsTreeHelper.tscn b/project/addons/dialogic/Documentation/Nodes/DocsTreeHelper.tscn new file mode 100644 index 0000000..e4f6bc9 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocsTreeHelper.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocsTreeHelper.gd" type="Script" id=1] + +[node name="DocsTreeHelper" type="Control"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Documentation/Nodes/DocumentationTree.gd b/project/addons/dialogic/Documentation/Nodes/DocumentationTree.gd new file mode 100644 index 0000000..7493c88 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocumentationTree.gd @@ -0,0 +1,32 @@ +tool +extends Tree + +var documentation_tree + +# emited when an item is selceted +signal _page_selected(path) + +################################################################################ +## PUBLIC FUNCTIONS ## +################################################################################ + +func select_item(path): + #DocsHelper.search_and_select_docs(documentation_tree, path) + pass + +################################################################################ +## PRIVATE FUNCTIONS ## +################################################################################ + +func _ready(): + connect('item_selected', self, '_on_item_selected') + #documentation_tree = DocsHelper.build_documentation_tree(self) + # have to do this here, because the DocsHelpe has no access to the theme... + documentation_tree.set_icon(0, get_icon("Folder", "EditorIcons")) + + +func _on_item_selected(): + var item = get_selected() + var metadata = item.get_metadata(0) + if metadata.has('path'): + emit_signal("_page_selected", metadata['path']) diff --git a/project/addons/dialogic/Documentation/Nodes/DocumentationTree.tscn b/project/addons/dialogic/Documentation/Nodes/DocumentationTree.tscn new file mode 100644 index 0000000..cf2cca5 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocumentationTree.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocumentationTree.gd" type="Script" id=1] + + +[node name="DocumentationTree" type="Tree"] +margin_right = 506.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Documentation/Nodes/DocumentationViewer.gd b/project/addons/dialogic/Documentation/Nodes/DocumentationViewer.gd new file mode 100644 index 0000000..3368d42 --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocumentationViewer.gd @@ -0,0 +1,21 @@ +tool +extends Control + +onready var DocTree = $HSplit/VBoxContainer/DocumentationTree +onready var DocPageViewer = $HSplit/DocsPageViewer + + +func _on_DocsPageViewer_open_non_html_link(link, section): + DocTree.select_item(link) + DocPageViewer.scroll_to_section(section) + +func _on_DocumentationTree_page_selected(path): + DocPageViewer.load_page(path) + +func _on_FilterEntry_text_changed(new_text): + var child = DocTree.documentation_tree.get_children() + while child: + child.call_recursive("call_deferred", "free") + child = child.get_next() + #DocsHelper.build_documentation_tree(DocTree, DocTree.documentation_tree,{},{}, new_text) + DocTree.call_deferred("update") diff --git a/project/addons/dialogic/Documentation/Nodes/DocumentationViewer.tscn b/project/addons/dialogic/Documentation/Nodes/DocumentationViewer.tscn new file mode 100644 index 0000000..6a6228d --- /dev/null +++ b/project/addons/dialogic/Documentation/Nodes/DocumentationViewer.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocsPageViewer.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocumentationTree.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocumentationViewer.gd" type="Script" id=3] + +[node name="DocumentationViewer" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HSplit" type="HSplitContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="HSplit"] +margin_right = 230.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FilterEntry" type="LineEdit" parent="HSplit/VBoxContainer"] +margin_right = 230.0 +margin_bottom = 24.0 +placeholder_text = "Filter Documentation" +placeholder_alpha = 0.502 + +[node name="DocumentationTree" parent="HSplit/VBoxContainer" instance=ExtResource( 2 )] +margin_top = 28.0 +margin_right = 230.0 + +[node name="DocsPageViewer" parent="HSplit" instance=ExtResource( 1 )] +margin_left = 242.0 +size_flags_horizontal = 3 + +[connection signal="text_changed" from="HSplit/VBoxContainer/FilterEntry" to="." method="_on_FilterEntry_text_changed"] +[connection signal="open_non_html_link" from="HSplit/DocsPageViewer" to="." method="_on_DocsPageViewer_open_non_html_link"] diff --git a/project/addons/dialogic/Documentation/Theme/DocumentationH1.tres b/project/addons/dialogic/Documentation/Theme/DocumentationH1.tres new file mode 100644 index 0000000..71794b0 --- /dev/null +++ b/project/addons/dialogic/Documentation/Theme/DocumentationH1.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf" type="DynamicFontData" id=1] + +[resource] +size = 30 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Documentation/Theme/DocumentationH2.tres b/project/addons/dialogic/Documentation/Theme/DocumentationH2.tres new file mode 100644 index 0000000..e667335 --- /dev/null +++ b/project/addons/dialogic/Documentation/Theme/DocumentationH2.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf" type="DynamicFontData" id=1] + +[resource] +size = 24 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Documentation/Theme/DocumentationH3.tres b/project/addons/dialogic/Documentation/Theme/DocumentationH3.tres new file mode 100644 index 0000000..c12f722 --- /dev/null +++ b/project/addons/dialogic/Documentation/Theme/DocumentationH3.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf" type="DynamicFontData" id=1] + +[resource] +size = 20 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Documentation/Theme/DocumentationH4.tres b/project/addons/dialogic/Documentation/Theme/DocumentationH4.tres new file mode 100644 index 0000000..1326b0d --- /dev/null +++ b/project/addons/dialogic/Documentation/Theme/DocumentationH4.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-BoldItalic.ttf" type="DynamicFontData" id=1] + +[resource] +size = 20 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Documentation/Theme/DocumentationH5.tres b/project/addons/dialogic/Documentation/Theme/DocumentationH5.tres new file mode 100644 index 0000000..122fcab --- /dev/null +++ b/project/addons/dialogic/Documentation/Theme/DocumentationH5.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Documentation/Theme/Font/NotoSans-Italic.ttf" type="DynamicFontData" id=1] + +[resource] +size = 18 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Documentation/Theme/Font/LICENSE.txt b/project/addons/dialogic/Documentation/Theme/Font/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/project/addons/dialogic/Documentation/Theme/Font/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf new file mode 100644 index 0000000..54ad879 Binary files /dev/null and b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Bold.ttf differ diff --git a/project/addons/dialogic/Documentation/Theme/Font/NotoSans-BoldItalic.ttf b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-BoldItalic.ttf new file mode 100644 index 0000000..530a828 Binary files /dev/null and b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-BoldItalic.ttf differ diff --git a/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Italic.ttf b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Italic.ttf new file mode 100644 index 0000000..27ff1ed Binary files /dev/null and b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Italic.ttf differ diff --git a/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Regular.ttf b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Regular.ttf new file mode 100644 index 0000000..10589e2 Binary files /dev/null and b/project/addons/dialogic/Documentation/Theme/Font/NotoSans-Regular.ttf differ diff --git a/project/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd b/project/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd new file mode 100644 index 0000000..564b83a --- /dev/null +++ b/project/addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd @@ -0,0 +1,374 @@ +tool +extends Control + +#################################################################################################### +## VARIABLES +#################################################################################################### +# references +var editor_reference +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +var portrait_entry = load("res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn") +onready var nodes = { + 'editor': $Split/EditorScroll/Editor, + 'name': $Split/EditorScroll/Editor/NameAndColor/NameLineEdit, + 'color': $Split/EditorScroll/Editor/NameAndColor/ColorPickerButton, + 'display_name_checkbox': $Split/EditorScroll/Editor/DisplayName/CheckBox, + 'display_name': $Split/EditorScroll/Editor/DisplayName/LineEdit, + 'nickname_checkbox': $Split/EditorScroll/Editor/DisplayNickname/CheckBox, + 'nickname': $Split/EditorScroll/Editor/DisplayNickname/LineEdit, + 'description': $Split/EditorScroll/Editor/Description/TextEdit, + 'theme':$Split/EditorScroll/Editor/Theme/ThemeButton, + + 'file': $Split/EditorScroll/Editor/FileName/LineEdit, + + 'mirror_portraits_checkbox' : $Split/EditorScroll/Editor/HBoxContainer/MirrorOption/MirrorPortraitsCheckBox, + 'scale': $Split/EditorScroll/Editor/HBoxContainer/Scale, + 'offset_x': $Split/EditorScroll/Editor/HBoxContainer/OffsetX, + 'offset_y': $Split/EditorScroll/Editor/HBoxContainer/OffsetY, + + 'portrait_search':$Split/EditorScroll/Editor/Portraits/Search, + 'portrait_list': $Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/ScrollContainer/VBoxContainer/PortraitList, + 'new_portrait_button': $Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels/HBoxContainer/NewPortrait, + 'import_from_folder_button': $Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels/HBoxContainer/ImportFromFolder, + + 'portrait_preview_full': $Split/Preview/Background/FullTextureRect, + 'portrait_preview_real': $Split/Preview/Background/Positioner/RealSizedRect, + 'image_label': $Split/Preview/Background/TLabel10, +} + +# data +var opened_character_data +var selected_theme_file = '' + +#################################################################################################### +## SCRIPT +#################################################################################################### + +# connect functions; translate buttons; update styles, etc... +func _ready(): + editor_reference = find_parent('EditorView') + + nodes['new_portrait_button'].text = " "+editor_reference.dialogicTranslator.translate("New portrait") + nodes['import_from_folder_button'].text = " "+editor_reference.dialogicTranslator.translate("Import folder") + + # connecting signals + nodes['name'].connect('text_changed', self, '_on_name_changed') + nodes['name'].connect('focus_exited', self, '_update_name_on_tree') + nodes['color'].connect('color_changed', self, '_on_color_changed') + nodes['display_name_checkbox'].connect('toggled', self, '_on_display_name_toggled') + nodes['nickname_checkbox'].connect('toggled', self, '_on_nickname_toggled') + nodes['theme'].connect("about_to_show", self, "build_ThemePickerMenu") + + nodes['portrait_search'].connect('text_changed', self, '_on_PortraitSearch_text_changed') + nodes['portrait_search'].right_icon = get_icon("Search", "EditorIcons") + nodes['import_from_folder_button'].connect('pressed', self, '_on_Import_Portrait_Folder_Button_pressed') + nodes['new_portrait_button'].connect('pressed', self, '_on_New_Portrait_Button_pressed') + + # updating styles + var style = $Split/EditorScroll.get('custom_styles/bg') + style.set('bg_color', get_color("base_color", "Editor")) + nodes['new_portrait_button'].icon = get_icon("Add", "EditorIcons") + nodes['import_from_folder_button'].icon = get_icon("Folder", "EditorIcons") + $Split/EditorScroll/Editor/Portraits/Title.set('custom_fonts/font', get_font("doc_title", "EditorFonts")) + $Split/EditorScroll/Editor/PortraitPanel.set('custom_styles/panel', get_stylebox("Background", "EditorStyles")) + + # loading default setup + _on_PreviewMode_item_selected(DialogicResources.get_settings_value('editor', 'character_preview_mode', 1)) + $Split/Preview/Background/PreviewMode.select(DialogicResources.get_settings_value('editor', 'character_preview_mode', 1)) + $Split/Preview/Background/PreviewMode.set_item_text(0, editor_reference.dialogicTranslator.translate("Full View")) + $Split/Preview/Background/PreviewMode.set_item_text(1, editor_reference.dialogicTranslator.translate("Actual Size")) + +# removes all input for a new character +func clear_character_editor(): + nodes['file'].text = '' + nodes['name'].text = '' + nodes['color'].color = Color('#ffffff') + nodes['display_name_checkbox'].pressed = false + nodes['display_name'].text = '' + nodes['nickname_checkbox'].pressed = false + nodes['nickname'].text = '' + nodes['description'].text = '' + nodes['theme'].text = 'No custom theme' + selected_theme_file = '' + + nodes['portrait_search'].text = '' + nodes['portraits'] = [] + nodes['scale'].value = 100 + nodes['mirror_portraits_checkbox'].pressed = false + nodes['offset_x'].value = 0 + nodes['offset_y'].value = 0 + + # Clearing portraits + for p in nodes['portrait_list'].get_children(): + p.queue_free() + nodes['portrait_preview_full'].texture = null + nodes['portrait_preview_real'].texture = null + nodes['portrait_preview_real'].rect_scale = Vector2(1, 1) + +# creates new character data +func create_character(): + var character_file = 'character-' + str(OS.get_unix_time()) + '.json' + var character = { + 'color': '#ffffff', + 'id': character_file, + 'portraits': [], + 'mirror_portraits' :false + } + DialogicResources.set_character(character) + character['metadata'] = {'file': character_file} + return character + +#################################################################################################### +## SAVING AND LOADING +#################################################################################################### + +# returns all of the current data in the format it's saved as +func generate_character_data_to_save(): + var portraits = [] + for p in nodes['portrait_list'].get_children(): + var entry = {} + entry['name'] = p.get_node("NameEdit").text + entry['path'] = p.get_node("PathEdit").text + portraits.append(entry) + var info_to_save = { + 'id': nodes['file'].text, + 'color': '#' + nodes['color'].color.to_html(), + 'display_name_bool': nodes['display_name_checkbox'].pressed, + 'display_name': nodes['display_name'].text, + 'nickname_bool': nodes['nickname_checkbox'].pressed, + 'nickname': nodes['nickname'].text, + 'description': nodes['description'].text, + 'theme': selected_theme_file, + + 'portraits': portraits, + 'scale': nodes['scale'].value, + 'mirror_portraits': nodes["mirror_portraits_checkbox"].pressed, + 'offset_x': nodes['offset_x'].value, + 'offset_y': nodes['offset_y'].value, + } + # Adding name later for cases when no name is provided + if nodes['name'].text != '': + info_to_save['name'] = nodes['name'].text + + return info_to_save + +# save the currently opened data +func save_character(): + var info_to_save = generate_character_data_to_save() + if info_to_save['id']: + DialogicResources.set_character(info_to_save) + opened_character_data = info_to_save + +# load data in +func load_character(filename: String): + clear_character_editor() + var data = DialogicResources.get_character_json(filename) + opened_character_data = data + nodes['file'].text = data['id'] + nodes['name'].text = data.get('name', '') + nodes['color'].color = Color(data.get('color','#ffffffff')) + nodes['display_name_checkbox'].pressed = data.get('display_name_bool', false) + nodes['display_name'].text = data.get('display_name', '') + nodes['nickname_checkbox'].pressed = data.get('nickname_bool', false) + nodes['nickname'].text = data.get('nickname', '') + nodes['description'].text = data.get('description', '') + refresh_themes_and_select(data.get('theme', '')) + + nodes['scale'].value = float(data.get('scale', 100)) + #nodes['nickname'].visible + nodes['offset_x'].value = data.get('offset_x', 0) + nodes['offset_y'].value = data.get('offset_y', 0) + nodes['mirror_portraits_checkbox'].pressed = data.get('mirror_portraits', false) + nodes['portrait_preview_full'].flip_h = data.get('mirror_portraits', false) + nodes['portrait_preview_real'].flip_h = data.get('mirror_portraits', false) + nodes['portrait_preview_real'].rect_scale = Vector2( + float(data.get('scale', 100))/100, float(data.get('scale', 100))/100) + + # Portraits + var default_portrait = create_portrait_entry() + default_portrait.get_node('NameEdit').text = 'Default' + default_portrait.get_node('NameEdit').editable = false + if opened_character_data.has('portraits'): + for p in opened_character_data['portraits']: + var current_item + if p['name'] == 'Default': + default_portrait.get_node('PathEdit').text = p['path'] + default_portrait.update_preview(p['path']) + current_item = default_portrait + else: + current_item = create_portrait_entry(p['name'], p['path']) + + +#################################################################################################### +## UI FUNCTIONS +#################################################################################################### + + +func _on_PortraitSearch_text_changed(text): + for portrait_item in nodes['portrait_list'].get_children(): + if text.empty() or text.to_lower() in portrait_item.get_node("NameEdit").text.to_lower() or text.to_lower() in portrait_item.get_node("PathEdit").text.to_lower(): + portrait_item.show() + else: + portrait_item.hide() + +func refresh_themes_and_select(file): + selected_theme_file = file + + if file == '' or file == 'No custom theme': + nodes['theme'].text = "No custom theme" + nodes['theme'].custom_icon = get_icon("GuiRadioUnchecked", "EditorIcons") + else: + nodes['theme'].text = DialogicUtil.get_theme_dict()[file]['name'] + nodes['theme'].custom_icon = editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").theme_icon + +func build_ThemePickerMenu(): + nodes['theme'].get_popup().clear() + var folder_structure = DialogicUtil.get_theme_folder_structure() + + ## building the root level + build_PickerMenuFolder(nodes['theme'].get_popup(), folder_structure, "MenuButton") + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + + if menu == nodes["theme"].get_popup(): + menu.add_item('No custom theme') + menu.set_item_icon(index, get_icon("GuiRadioUnchecked", "EditorIcons")) + menu.set_item_metadata(index, {"file":""}) + index += 1 + + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + index += 1 + + # give it the right style + nodes['theme'].update_submenu_style(submenu) + + var files_info = DialogicUtil.get_theme_dict() + for file in folder_structure['files']: + menu.add_item(files_info[file]['name']) + menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").theme_icon) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_theme_selected"): + menu.connect("index_pressed", self, '_on_theme_selected', [menu]) + + return current_folder_name + + +func _on_theme_selected(index, menu): + refresh_themes_and_select(menu.get_item_metadata(index).get('file', '')) + + +func _on_display_name_toggled(button_pressed): + nodes['display_name'].visible = button_pressed + if button_pressed: nodes['display_name'].grab_focus() + + +func _on_nickname_toggled(button_pressed): + nodes['nickname'].visible = button_pressed + if button_pressed: nodes['nickname'].grab_focus() + +func is_selected(file: String): + return nodes['file'].text == file + + +func _on_name_changed(value): + save_character() + + +func _update_name_on_tree(): + var item = master_tree.get_selected() + item.set_text(0, nodes['name'].text) + master_tree.build_characters(nodes['file'].text) + + +func _input(event): + if event is InputEventKey and event.pressed: + if nodes['name'].has_focus(): + if event.scancode == KEY_ENTER: + nodes['name'].release_focus() + + +func _on_color_changed(color): + var item = master_tree.get_selected() + item.set_icon_modulate(0, color) + + + +# Portraits +func _on_New_Portrait_Button_pressed(): + create_portrait_entry('', '', true) + + +func create_portrait_entry(p_name = '', path = '', grab_focus = false): + if grab_focus and nodes['portrait_list'].get_child_count() == 1 and nodes['portrait_list'].get_child(0).get_node("PathEdit").text == '': + nodes['portrait_list'].get_child(0)._on_ButtonSelect_pressed() + return + + var p = portrait_entry.instance() + p.editor_reference = editor_reference + p.image_node = nodes['portrait_preview_full'] + p.image_node2 = nodes['portrait_preview_real'] + p.image_label = nodes['image_label'] + var p_list = nodes['portrait_list'] + p_list.add_child(p) + if p_name != '': + p.get_node("NameEdit").text = p_name + if path != '': + p.get_node("PathEdit").text = path + if grab_focus: + p.get_node("NameEdit").grab_focus() + p._on_ButtonSelect_pressed() + return p + + +func _on_Import_Portrait_Folder_Button_pressed(): + editor_reference.godot_dialog("*", EditorFileDialog.MODE_OPEN_DIR) + editor_reference.godot_dialog_connect(self, "_on_dir_selected", "dir_selected") + + +func _on_dir_selected(path, target): + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if not dir.current_is_dir(): + var file_lower = file_name.to_lower() + if '.svg' in file_lower or '.png' in file_lower: + if not '.import' in file_lower: + var final_name = path+ "/" + file_name + create_portrait_entry(DialogicResources.get_filename_from_path(file_name), final_name) + file_name = dir.get_next() + else: + print("An error occurred when trying to access the path.") + + +func _on_MirrorPortraitsCheckBox_toggled(button_pressed): + nodes['portrait_preview_full'].flip_h = button_pressed + nodes['portrait_preview_real'].flip_h = button_pressed + + +func _on_Scale_value_changed(value): + #nodes['portrait_preview_real'].rect_position = ($Split/Preview/Background/Positioner.rect_position-nodes['portrait_preview_real'].rect_size*Vector2(0.5,1)) + nodes['portrait_preview_real'].rect_size = Vector2() + nodes['portrait_preview_real'].rect_scale = Vector2( + float(value)/100, float(value)/100) + +func _on_PreviewMode_item_selected(index): + if index == 0: + nodes['portrait_preview_real'].hide() + nodes['portrait_preview_full'].show() + if index == 1: + nodes['portrait_preview_real'].show() + nodes['portrait_preview_full'].hide() + DialogicResources.set_settings_value('editor', 'character_preview_mode', index) + diff --git a/project/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn b/project/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn new file mode 100644 index 0000000..a6fbd2a --- /dev/null +++ b/project/addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn @@ -0,0 +1,547 @@ +[gd_scene load_steps=16 format=2] + +[ext_resource path="res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/CharacterEditor/CharacterEditor.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Example Assets/portraits/df-3.png" type="Texture" id=4] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=5] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=6] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.2, 0.23, 0.31, 1 ) + +[sub_resource type="Image" id=10] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 254, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 255, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 254, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 255, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 72, 255, 255, 255, 205, 255, 255, 255, 249, 255, 255, 255, 218, 255, 255, 255, 73, 255, 255, 255, 92, 255, 255, 255, 218, 255, 255, 255, 246, 255, 255, 255, 199, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 194, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 203, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 152, 255, 255, 255, 193, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 202, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 98, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 219, 255, 255, 255, 217, 255, 255, 255, 12, 0, 0, 0, 0, 255, 255, 255, 94, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 217, 255, 255, 255, 55, 255, 255, 255, 20, 255, 255, 255, 156, 255, 255, 255, 243, 255, 255, 255, 201, 255, 255, 255, 44, 255, 255, 255, 23, 255, 255, 255, 179, 255, 255, 255, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 0, 0, 0, 0, 255, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 74, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 89, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 176, 255, 255, 255, 160, 255, 255, 255, 78, 0, 0, 0, 0, 255, 255, 255, 153, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 255, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 46, 255, 255, 255, 254, 255, 255, 255, 25, 0, 0, 0, 0, 255, 255, 255, 39, 255, 255, 255, 226, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 27, 0, 0, 0, 0, 255, 255, 255, 29, 255, 255, 255, 255, 255, 255, 255, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 227, 255, 255, 255, 4, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 213, 0, 0, 0, 0, 255, 255, 255, 143, 255, 255, 255, 106, 255, 255, 255, 96, 255, 255, 255, 151, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 97, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 96, 0, 0, 0, 0, 255, 255, 255, 103, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 250, 255, 255, 255, 15, 255, 255, 255, 219, 255, 255, 255, 30, 255, 255, 255, 26, 255, 255, 255, 222, 255, 255, 255, 16, 255, 255, 255, 250, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 170, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 85, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 164, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 50, 255, 255, 255, 243, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 95, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 97, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 239, 255, 255, 255, 9, 255, 255, 255, 242, 255, 255, 255, 17, 0, 0, 0, 0, 255, 255, 255, 23, 255, 255, 255, 230, 255, 255, 255, 5, 255, 255, 255, 242, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 196, 255, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 139, 255, 255, 255, 199, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 239, 255, 255, 255, 103, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 91, 255, 255, 255, 234, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 250, 255, 255, 255, 42, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 255, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 166, 255, 255, 255, 201, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 199, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 255, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 244, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 251, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 251, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 214, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 214, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 223, 255, 255, 255, 219, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 228, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 161, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 228, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 249, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 235, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 233, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 235, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 243, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 240, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 44, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 91, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 200, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 198, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 242, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 232, 255, 255, 255, 25, 255, 255, 255, 19, 255, 255, 255, 225, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 235, 255, 255, 255, 100, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 220, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 220, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 120, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 109, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 153, 255, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 194, 255, 255, 255, 182, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 237, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 255, 255, 255, 223, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 204, 255, 255, 255, 66, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 233, 255, 255, 255, 3, 255, 255, 255, 3, 255, 255, 255, 234, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 228, 255, 255, 255, 234, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 29, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 227, 255, 255, 255, 69, 255, 255, 255, 205, 255, 255, 255, 1, 255, 255, 255, 91, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 205, 255, 255, 255, 127, 255, 255, 255, 216, 255, 255, 255, 225, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 131, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 108, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 229, 255, 255, 255, 66, 255, 255, 255, 65, 255, 255, 255, 228, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 241, 255, 255, 255, 245, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 219, 255, 255, 255, 211, 255, 255, 255, 77, 255, 255, 255, 205, 255, 255, 255, 68, 255, 255, 255, 38, 255, 255, 255, 160, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 1, 255, 255, 255, 205, 255, 255, 255, 68, 255, 255, 255, 57, 255, 255, 255, 9, 255, 255, 255, 16, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 37, 255, 255, 255, 225, 255, 255, 255, 2, 255, 255, 255, 1, 255, 255, 255, 213, 255, 255, 255, 17, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 139, 255, 255, 255, 143, 255, 255, 255, 145, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 215, 255, 255, 255, 107, 255, 255, 255, 117, 255, 255, 255, 223, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 185, 255, 255, 255, 7, 255, 255, 255, 188, 255, 255, 255, 24, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 198, 255, 255, 255, 67, 255, 255, 255, 64, 255, 255, 255, 168, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 47, 255, 255, 255, 214, 255, 255, 255, 217, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 187, 255, 255, 255, 1, 255, 255, 255, 3, 255, 255, 255, 203, 255, 255, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 220, 255, 255, 255, 48, 255, 255, 255, 149, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 220, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 191, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 104, 255, 255, 255, 161, 255, 255, 255, 163, 255, 255, 255, 69, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 238, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 46, 255, 255, 255, 249, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 163, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 255, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 163, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 169, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 237, 255, 255, 255, 215, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 11, 255, 255, 255, 221, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 222, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 229, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 229, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 219, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 171, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 221, 255, 255, 255, 218, 255, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 225, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 66, 255, 255, 255, 73, 255, 255, 255, 193, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 158, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 241, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 218, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 242, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 161, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 228, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 180, 255, 255, 255, 187, 255, 255, 255, 187, 255, 255, 255, 180, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 210, 255, 255, 255, 126, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 249, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 250, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 66, 255, 255, 255, 73, 255, 255, 255, 197, 255, 255, 255, 64, 255, 255, 255, 204, 255, 255, 255, 65, 255, 255, 255, 221, 255, 255, 255, 218, 255, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 91, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 155, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 155, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 180, 255, 255, 255, 187, 255, 255, 255, 187, 255, 255, 255, 180, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 217, 255, 255, 255, 248, 255, 255, 255, 217, 255, 255, 255, 71, 255, 255, 255, 113, 255, 255, 255, 232, 255, 255, 255, 234, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 43, 255, 255, 255, 165, 255, 255, 255, 229, 255, 255, 255, 235, 255, 255, 255, 220, 255, 255, 255, 137, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 32, 255, 255, 255, 79, 255, 255, 255, 205, 255, 255, 255, 202, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 249, 255, 255, 255, 224, 255, 255, 255, 158, 255, 255, 255, 244, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 151, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 219, 255, 255, 255, 220, 255, 255, 255, 61, 255, 255, 255, 202, 255, 255, 255, 66, 255, 255, 255, 202, 255, 255, 255, 66, 255, 255, 255, 73, 255, 255, 255, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 220, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 168, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 230, 255, 255, 255, 117, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 155, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 155, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 53, 255, 255, 255, 17, 255, 255, 255, 102, 255, 255, 255, 246, 255, 255, 255, 216, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 219, 255, 255, 255, 86, 255, 255, 255, 8, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 152, 255, 255, 255, 210, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 222, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 175, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 51, 255, 255, 255, 242, 255, 255, 255, 226, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 239, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 182, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 20, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255, 255, 37, 255, 255, 255, 254, 255, 255, 255, 10, 255, 255, 255, 21, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 168, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 192, 255, 255, 255, 239, 255, 255, 255, 178, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 253, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 226, 255, 255, 255, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 216, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 221, 255, 255, 255, 213, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 222, 255, 255, 255, 94, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 230, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 218, 255, 255, 255, 46, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 205, 255, 255, 255, 1, 255, 255, 255, 91, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 83, 255, 255, 255, 119, 255, 255, 255, 223, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 20, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 139, 255, 255, 255, 2, 255, 255, 255, 32, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 166, 255, 255, 255, 225, 255, 255, 255, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 119, 0, 0, 0, 0, 255, 255, 255, 37, 255, 255, 255, 198, 255, 255, 255, 228, 255, 255, 255, 224, 255, 255, 255, 28, 255, 255, 255, 39, 255, 255, 255, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 247, 255, 255, 255, 62, 255, 255, 255, 119, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 190, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 111, 255, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 197, 255, 255, 255, 65, 255, 255, 255, 73, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 1, 255, 255, 255, 205, 255, 255, 255, 68, 255, 255, 255, 38, 255, 255, 255, 160, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 183, 255, 255, 255, 234, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 189, 255, 255, 255, 173, 255, 255, 255, 14, 255, 255, 255, 2, 255, 255, 255, 255, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 42, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 106, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 23, 255, 255, 255, 2, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 204, 255, 255, 255, 143, 0, 0, 0, 0, 255, 255, 255, 85, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 250, 255, 255, 255, 43, 255, 255, 255, 251, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 227, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 219, 255, 255, 255, 220, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 185, 255, 255, 255, 7, 255, 255, 255, 188, 255, 255, 255, 24, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 19, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255, 255, 95, 255, 255, 255, 153, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 31, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 6, 255, 255, 255, 17, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 130, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 85, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 217, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 186, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 220, 255, 255, 255, 48, 255, 255, 255, 149, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 167, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255, 255, 1, 255, 255, 255, 194, 255, 255, 255, 56, 255, 255, 255, 155, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 19, 0, 0, 0, 0, 255, 255, 255, 177, 255, 255, 255, 138, 255, 255, 255, 2, 255, 255, 255, 20, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 139, 255, 255, 255, 23, 255, 255, 255, 166, 255, 255, 255, 198, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 33, 255, 255, 255, 59, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 15, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 62, 255, 255, 255, 70, 255, 255, 255, 249, 255, 255, 255, 22, 255, 255, 255, 103, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 232, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 120, 255, 255, 255, 45, 255, 255, 255, 246, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 163, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 255, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 167, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 168, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 167, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 187, 255, 255, 255, 239, 255, 255, 255, 215, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 225, 255, 255, 255, 241, 255, 255, 255, 148, 255, 255, 255, 4, 255, 255, 255, 114, 255, 255, 255, 225, 255, 255, 255, 251, 255, 255, 255, 224, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 64, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 224, 255, 255, 255, 216, 255, 255, 255, 71, 255, 255, 255, 207, 255, 255, 255, 213, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 9, 255, 255, 255, 28, 255, 255, 255, 92, 255, 255, 255, 222, 255, 255, 255, 190, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 143, 255, 255, 255, 214, 255, 255, 255, 205, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 245, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 229, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 183, 255, 255, 255, 188, 255, 255, 255, 188, 255, 255, 255, 183, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 167, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 168, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 202, 255, 255, 255, 112, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 230, 255, 255, 255, 247, 255, 255, 255, 53, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 216, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 12, 255, 255, 255, 39, 255, 255, 255, 212, 255, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 183, 255, 255, 255, 188, 255, 255, 255, 188, 255, 255, 255, 183, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 190, 255, 255, 255, 172, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 240, 255, 255, 255, 171, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 148, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 248, 255, 255, 255, 240, 255, 255, 255, 158, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 113, 255, 255, 255, 204, 255, 255, 255, 239, 255, 255, 255, 237, 255, 255, 255, 221, 255, 255, 255, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 250, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 249, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 173, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 150, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 234, 255, 255, 255, 4, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 237, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 59, 255, 255, 255, 206, 255, 255, 255, 246, 255, 255, 255, 209, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 229, 255, 255, 255, 75, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 225, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 249, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 250, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 136, 255, 255, 255, 18, 255, 255, 255, 139, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 166, 0, 0, 0, 0, 255, 255, 255, 175, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 151, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 249, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 250, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 239, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 238, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 75, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 37, 255, 255, 255, 241, 255, 255, 255, 19, 255, 255, 255, 246, 255, 255, 255, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 239, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 151, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 212, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 162, 255, 255, 255, 194, 255, 255, 255, 71, 255, 255, 255, 230, 255, 255, 255, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 152, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 222, 255, 255, 255, 94, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 230, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 239, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 238, 255, 255, 255, 77, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 236, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 252, 255, 255, 255, 254, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 252, 255, 255, 255, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 190, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 222, 255, 255, 255, 94, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 230, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 196, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 59, 255, 255, 255, 238, 255, 255, 255, 145, 255, 255, 255, 221, 255, 255, 255, 166, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 250, 255, 255, 255, 43, 255, 255, 255, 251, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 190, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 236, 255, 255, 255, 121, 255, 255, 255, 233, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 130, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 224, 255, 255, 255, 158, 255, 255, 255, 26, 255, 255, 255, 230, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 186, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 250, 255, 255, 255, 43, 255, 255, 255, 251, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 119, 255, 255, 255, 255, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 227, 255, 255, 255, 243, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 186, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 200, 255, 255, 255, 50, 255, 255, 255, 33, 255, 255, 255, 91, 255, 255, 255, 223, 255, 255, 255, 248, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 245, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 170, 255, 255, 255, 235, 255, 255, 255, 247, 255, 255, 255, 207, 255, 255, 255, 95, 255, 255, 255, 38, 255, 255, 255, 229, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 12, 255, 255, 255, 39, 255, 255, 255, 212, 255, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 245, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 221, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 248, 255, 255, 255, 240, 255, 255, 255, 158, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 12, 255, 255, 255, 39, 255, 255, 255, 212, 255, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 248, 255, 255, 255, 240, 255, 255, 255, 158, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 239, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 238, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 116, 255, 255, 255, 206, 255, 255, 255, 245, 255, 255, 255, 244, 255, 255, 255, 213, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 212, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 193, 255, 255, 255, 205, 255, 255, 255, 70, 255, 255, 255, 16, 255, 255, 255, 23, 255, 255, 255, 78, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 234, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 210, 255, 255, 255, 126, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 193, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 211, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 238, 255, 255, 255, 77, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 236, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 119, 255, 255, 255, 235, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 183, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 32, 255, 255, 255, 79, 255, 255, 255, 205, 255, 255, 255, 202, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 133, 255, 255, 255, 206, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 173, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 196, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 133, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 222, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 104, 255, 255, 255, 217, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 206, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 236, 255, 255, 255, 121, 255, 255, 255, 233, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 240, 255, 255, 255, 252, 255, 255, 255, 243, 255, 255, 255, 240, 255, 255, 255, 252, 255, 255, 255, 243, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 79, 255, 255, 255, 225, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 241, 255, 255, 255, 177, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 119, 255, 255, 255, 255, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 73, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 28, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 114, 255, 255, 255, 245, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 175, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 73, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 227, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 160, 255, 255, 255, 79, 255, 255, 255, 235, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 227, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 243, 255, 255, 255, 252, 255, 255, 255, 240, 255, 255, 255, 243, 255, 255, 255, 252, 255, 255, 255, 240, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 130, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 148, 255, 255, 255, 189, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 216, 255, 255, 255, 194, 255, 255, 255, 61, 255, 255, 255, 15, 255, 255, 255, 13, 255, 255, 255, 95, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 122, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 232, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 219, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 147, 255, 255, 255, 226, 255, 255, 255, 252, 255, 255, 255, 246, 255, 255, 255, 218, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 71, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 9, 255, 255, 255, 28, 255, 255, 255, 92, 255, 255, 255, 222, 255, 255, 255, 190, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 247, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 231, 255, 255, 255, 21, 0, 0, 0, 0, 255, 255, 255, 231, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 202, 255, 255, 255, 112, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 217, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 213, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 155, 255, 255, 255, 232, 255, 255, 255, 230, 255, 255, 255, 154, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 228, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 180, 255, 255, 255, 18, 255, 255, 255, 15, 255, 255, 255, 165, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 244, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 189, 255, 255, 255, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 255, 255, 255, 242, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 156, 255, 255, 255, 181, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 161, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 195, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 222, 255, 255, 255, 98, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 221, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 142, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 231, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 39, 255, 255, 255, 221, 255, 255, 255, 7, 255, 255, 255, 211, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 243, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 235, 255, 255, 255, 165, 255, 255, 255, 208, 255, 255, 255, 165, 255, 255, 255, 234, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 234, 255, 255, 255, 48, 255, 255, 255, 234, 255, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 255, 255, 255, 12, 255, 255, 255, 227, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 158, 255, 255, 255, 177, 255, 255, 255, 16, 255, 255, 255, 13, 255, 255, 255, 162, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 172, 255, 255, 255, 101, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 204, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 40, 255, 255, 255, 116, 255, 255, 255, 244, 255, 255, 255, 114, 255, 255, 255, 40, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 246, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 229, 255, 255, 255, 13, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 157, 255, 255, 255, 234, 255, 255, 255, 232, 255, 255, 255, 159, 255, 255, 255, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 213, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 221, 255, 255, 255, 4, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 23, 255, 255, 255, 228, 255, 255, 255, 85, 255, 255, 255, 227, 255, 255, 255, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 228, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 145, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 228, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 255, 255, 255, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 237, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 78, 255, 255, 255, 178, 0, 0, 0, 0, 255, 255, 255, 172, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 227, 255, 255, 255, 25, 255, 255, 255, 228, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 242, 255, 255, 255, 102, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 255, 255, 255, 242, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 231, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 85, 255, 255, 255, 231, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 121, 255, 255, 255, 232, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 142, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 249, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 213, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 255, 255, 255, 12, 255, 255, 255, 227, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 229, 255, 255, 255, 13, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 229, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 145, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 242, 255, 255, 255, 102, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 121, 255, 255, 255, 232, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 213, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 35, 255, 255, 255, 235, 255, 255, 255, 70, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 234, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 39, 255, 255, 255, 255, 255, 255, 255, 42, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 235, 255, 255, 255, 123, 255, 255, 255, 235, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 199, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 255, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 37, 255, 255, 255, 188, 255, 255, 255, 244, 255, 255, 255, 231, 255, 255, 255, 167, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 255, 255, 255, 2, 255, 255, 255, 175, 255, 255, 255, 179, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 235, 255, 255, 255, 119, 255, 255, 255, 235, 255, 255, 255, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 198, 255, 255, 255, 169, 255, 255, 255, 22, 255, 255, 255, 40, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 224, 255, 255, 255, 149, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 147, 255, 255, 255, 228, 255, 255, 255, 248, 255, 255, 255, 223, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 92, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 53, 255, 255, 255, 146, 255, 255, 255, 199, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 234, 255, 255, 255, 66, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 234, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 54, 255, 255, 255, 211, 255, 255, 255, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 217, 255, 255, 255, 188, 255, 255, 255, 50, 255, 255, 255, 17, 255, 255, 255, 61, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 163, 255, 255, 255, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 191, 255, 255, 255, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 15, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 132, 255, 255, 255, 229, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 255, 255, 255, 24, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 244, 255, 255, 255, 19, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 234, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 172, 255, 255, 255, 166, 255, 255, 255, 183, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 249, 255, 255, 255, 193, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 131, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 214, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 255, 255, 255, 13, 255, 255, 255, 223, 255, 255, 255, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 175, 255, 255, 255, 253, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 55, 255, 255, 255, 212, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 15, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 239, 255, 255, 255, 14, 255, 255, 255, 207, 255, 255, 255, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 246, 255, 255, 255, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 139, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 179, 255, 255, 255, 228, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 134, 255, 255, 255, 216, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 78, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 176, 255, 255, 255, 13, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 95, 255, 255, 255, 21, 255, 255, 255, 28, 255, 255, 255, 180, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 235, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 223, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 47, 255, 255, 255, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 15, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 195, 255, 255, 255, 243, 255, 255, 255, 240, 255, 255, 255, 174, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 213, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 227, 255, 255, 255, 197, 255, 255, 255, 53, 255, 255, 255, 14, 255, 255, 255, 33, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 51, 255, 255, 255, 52, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 227, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 238, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 157, 255, 255, 255, 230, 255, 255, 255, 253, 255, 255, 255, 242, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 192, 255, 255, 255, 230, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 249, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 75, 255, 255, 255, 209, 255, 255, 255, 246, 255, 255, 255, 201, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 143, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 217, 255, 255, 255, 52, 255, 255, 255, 22, 255, 255, 255, 176, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 67, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 227, 255, 255, 255, 170, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 202, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 239, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 147, 255, 255, 255, 18, 255, 255, 255, 147, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 15, 255, 255, 255, 50, 255, 255, 255, 189, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 239, 255, 255, 255, 251, 255, 255, 255, 206, 255, 255, 255, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 212, 255, 255, 255, 242, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 204, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 141, 255, 255, 255, 246, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 37, 255, 255, 255, 182, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 243, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 231, 255, 255, 255, 20, 255, 255, 255, 254, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 163, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 161, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 158, 255, 255, 255, 35, 255, 255, 255, 35, 255, 255, 255, 127, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 162, 255, 255, 255, 124, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 12, 255, 255, 255, 63, 255, 255, 255, 217, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 179, 255, 255, 255, 241, 255, 255, 255, 236, 255, 255, 255, 169, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 230, 255, 255, 255, 11, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 131, 255, 255, 255, 34, 255, 255, 255, 38, 255, 255, 255, 191, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 147, 255, 255, 255, 228, 255, 255, 255, 248, 255, 255, 255, 223, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 75, 255, 255, 255, 209, 255, 255, 255, 246, 255, 255, 255, 201, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 110, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 164, 255, 255, 255, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 134, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 255, 255, 255, 255, 77, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 217, 255, 255, 255, 188, 255, 255, 255, 50, 255, 255, 255, 17, 255, 255, 255, 61, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 217, 255, 255, 255, 52, 255, 255, 255, 22, 255, 255, 255, 176, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 205, 255, 255, 255, 229, 255, 255, 255, 223, 255, 255, 255, 155, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 15, 255, 255, 255, 62, 255, 255, 255, 220, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 132, 255, 255, 255, 229, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 221, 255, 255, 255, 131, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 219, 255, 255, 255, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 176, 255, 255, 255, 175, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 106, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 228, 255, 255, 255, 228, 255, 255, 255, 236, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 161, 255, 255, 255, 193, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 182, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 161, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 154, 255, 255, 255, 197, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 168, 255, 255, 255, 230, 255, 255, 255, 249, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 146, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 244, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 160, 255, 255, 255, 237, 255, 255, 255, 232, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 218, 255, 255, 255, 50, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 223, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 227, 255, 255, 255, 167, 255, 255, 255, 45, 255, 255, 255, 24, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 166, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 116, 255, 255, 255, 217, 255, 255, 255, 246, 255, 255, 255, 165, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 206, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 152, 255, 255, 255, 195, 255, 255, 255, 37, 255, 255, 255, 60, 255, 255, 255, 226, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 227, 255, 255, 255, 197, 255, 255, 255, 53, 255, 255, 255, 14, 255, 255, 255, 33, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 210, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 243, 255, 255, 255, 250, 255, 255, 255, 230, 255, 255, 255, 150, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 208, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 219, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 104, 255, 255, 255, 219, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 230, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 101, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 157, 255, 255, 255, 230, 255, 255, 255, 253, 255, 255, 255, 242, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 36, 255, 255, 255, 22, 255, 255, 255, 65, 255, 255, 255, 216, 255, 255, 255, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 237, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 129, 255, 255, 255, 211, 255, 255, 255, 243, 255, 255, 255, 183, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 152, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 168, 255, 255, 255, 14, 255, 255, 255, 31, 255, 255, 255, 189, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 194, 255, 255, 255, 36, 255, 255, 255, 16, 255, 255, 255, 174, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 238, 255, 255, 255, 228, 255, 255, 255, 228, 255, 255, 255, 228, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 184, 255, 255, 255, 244, 255, 255, 255, 211, 255, 255, 255, 129, 255, 255, 255, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 44, 255, 255, 255, 21, 255, 255, 255, 63, 255, 255, 255, 219, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 235, 255, 255, 255, 198, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 121, 255, 255, 255, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 231, 255, 255, 255, 146, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 173, 255, 255, 255, 238, 255, 255, 255, 249, 255, 255, 255, 216, 255, 255, 255, 123, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 211, 255, 255, 255, 40, 255, 255, 255, 41, 255, 255, 255, 222, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 89, 255, 255, 255, 255, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 56, 255, 255, 255, 213, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 177, 255, 255, 255, 240, 255, 255, 255, 240, 255, 255, 255, 176, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 229, 255, 255, 255, 62, 255, 255, 255, 37, 255, 255, 255, 196, 255, 255, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 118, 255, 255, 255, 220, 255, 255, 255, 247, 255, 255, 255, 156, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 188, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 5, 255, 255, 255, 19, 255, 255, 255, 142, 255, 255, 255, 228, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 92, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 166, 255, 255, 255, 33, 255, 255, 255, 35, 255, 255, 255, 168, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 140, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 234, 255, 255, 255, 237, 255, 255, 255, 159, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 255, 255, 255, 66, 255, 255, 255, 204, 255, 255, 255, 76, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 250, 255, 255, 255, 233, 255, 255, 255, 174, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 224, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 206, 255, 255, 255, 247, 255, 255, 255, 228, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 73, 255, 255, 255, 198, 255, 255, 255, 72, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 16, 255, 255, 255, 63, 255, 255, 255, 219, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 173, 255, 255, 255, 12, 255, 255, 255, 12, 255, 255, 255, 179, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 227, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 232, 255, 255, 255, 101, 255, 255, 255, 15, 255, 255, 255, 47, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 203, 255, 255, 255, 181, 255, 255, 255, 195, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 223, 255, 255, 255, 132, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 187, 255, 255, 255, 238, 255, 255, 255, 237, 255, 255, 255, 153, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 156, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 111, 255, 255, 255, 255, 255, 255, 255, 91, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 232, 255, 255, 255, 68, 255, 255, 255, 111, 255, 255, 255, 238, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 246, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 251, 255, 255, 255, 241, 255, 255, 255, 135, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 96, 255, 255, 255, 203, 255, 255, 255, 238, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 137, 255, 255, 255, 239, 255, 255, 255, 236, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 175, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 206, 255, 255, 255, 246, 255, 255, 255, 211, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 96, 255, 255, 255, 42, 255, 255, 255, 201, 255, 255, 255, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 231, 255, 255, 255, 49, 255, 255, 255, 52, 255, 255, 255, 234, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 35, 255, 255, 255, 252, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 147, 255, 255, 255, 17, 255, 255, 255, 134, 255, 255, 255, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 73, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 180, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 176, 255, 255, 255, 33, 255, 255, 255, 37, 255, 255, 255, 185, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 64, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 234, 255, 255, 255, 97, 255, 255, 255, 127, 255, 255, 255, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 244, 255, 255, 255, 96, 255, 255, 255, 28, 255, 255, 255, 39, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 193, 255, 255, 255, 244, 255, 255, 255, 239, 255, 255, 255, 181, 255, 255, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 247, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 176, 255, 255, 255, 239, 255, 255, 255, 236, 255, 255, 255, 164, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 244, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 196, 255, 255, 255, 255, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 109, 255, 255, 255, 40, 255, 255, 255, 35, 255, 255, 255, 175, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 208, 255, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 29, 255, 255, 255, 156, 255, 255, 255, 224, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 107, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 231, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 242, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 156, 255, 255, 255, 45, 255, 255, 255, 241, 255, 255, 255, 48, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 90, 255, 255, 255, 25, 255, 255, 255, 17, 255, 255, 255, 122, 255, 255, 255, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 59, 255, 255, 255, 211, 255, 255, 255, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 232, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 225, 255, 255, 255, 84, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 242, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 232, 255, 255, 255, 107, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 194, 255, 255, 255, 243, 255, 255, 255, 244, 255, 255, 255, 194, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 149, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 208, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 176, 255, 255, 255, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 226, 255, 255, 255, 227, 255, 255, 255, 246, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 242, 255, 255, 255, 92, 255, 255, 255, 27, 255, 255, 255, 37, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 29, 255, 255, 255, 80, 255, 255, 255, 225, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 247, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 236, 255, 255, 255, 50, 255, 255, 255, 59, 255, 255, 255, 238, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 62, 255, 255, 255, 252, 255, 255, 255, 241, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 180, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 238, 255, 255, 255, 239, 255, 255, 255, 138, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 111, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 76, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 242, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 59, 255, 255, 255, 23, 255, 255, 255, 242, 255, 255, 255, 143, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 221, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 48, 255, 255, 255, 24, 255, 255, 255, 66, 255, 255, 255, 220, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 227, 255, 255, 255, 250, 255, 255, 255, 254, 255, 255, 255, 196, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 205, 255, 255, 255, 247, 255, 255, 255, 228, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 190, 255, 255, 255, 243, 255, 255, 255, 218, 255, 255, 255, 101, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 234, 255, 255, 255, 249, 255, 255, 255, 221, 255, 255, 255, 133, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 123, 255, 255, 255, 16, 255, 255, 255, 51, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 234, 255, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 246, 255, 255, 255, 189, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 81, 255, 255, 255, 217, 255, 255, 255, 246, 255, 255, 255, 165, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 24, 255, 255, 255, 137, 255, 255, 255, 248, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 219, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 161, 255, 255, 255, 246, 255, 255, 255, 215, 255, 255, 255, 78, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 93, 255, 255, 255, 25, 255, 255, 255, 18, 255, 255, 255, 142, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 223, 255, 255, 255, 42, 255, 255, 255, 44, 255, 255, 255, 214, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 161, 255, 255, 255, 246, 255, 255, 255, 217, 255, 255, 255, 113, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 193, 255, 255, 255, 243, 255, 255, 255, 244, 255, 255, 255, 193, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 106, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 223, 255, 255, 255, 42, 255, 255, 255, 44, 255, 255, 255, 215, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 170, 255, 255, 255, 214, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 106, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 152, 255, 255, 255, 212, 255, 255, 255, 91, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 242, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 211, 255, 255, 255, 40, 255, 255, 255, 41, 255, 255, 255, 222, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 180, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 101, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 118, 255, 255, 255, 220, 255, 255, 255, 247, 255, 255, 255, 156, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 242, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 171, 255, 255, 255, 216, 255, 255, 255, 92, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 218, 255, 255, 255, 40, 255, 255, 255, 37, 255, 255, 255, 205, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 242, 255, 255, 255, 207, 255, 255, 255, 88, 255, 255, 255, 18, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 101, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 181, 255, 255, 255, 216, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 165, 255, 255, 255, 247, 255, 255, 255, 220, 255, 255, 255, 116, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 19, 255, 255, 255, 88, 255, 255, 255, 211, 255, 255, 255, 244, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 218, 255, 255, 255, 40, 255, 255, 255, 37, 255, 255, 255, 206, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 214, 255, 255, 255, 169, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 165, 255, 255, 255, 247, 255, 255, 255, 220, 255, 255, 255, 82, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 91, 255, 255, 255, 211, 255, 255, 255, 152, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 110, 255, 255, 255, 209, 255, 255, 255, 246, 255, 255, 255, 201, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 177, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 218, 255, 255, 255, 52, 255, 255, 255, 22, 255, 255, 255, 176, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 92, 255, 255, 255, 215, 255, 255, 255, 171, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 92, 255, 255, 255, 216, 255, 255, 255, 180, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 104, 255, 255, 255, 85, 255, 255, 255, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 253, 255, 255, 255, 240, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 194, 255, 255, 255, 245, 255, 255, 255, 219, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 231, 255, 255, 255, 146, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 73, 255, 255, 255, 181, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 189, 255, 255, 255, 176, 255, 255, 255, 28, 255, 255, 255, 61, 255, 255, 255, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 56, 255, 255, 255, 213, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 227, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 114, 255, 255, 255, 217, 255, 255, 255, 246, 255, 255, 255, 165, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 161, 255, 255, 255, 238, 255, 255, 255, 220, 255, 255, 255, 191, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 219, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 210, 255, 255, 255, 39, 255, 255, 255, 42, 255, 255, 255, 214, 255, 255, 255, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 16, 255, 255, 255, 63, 255, 255, 255, 219, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 224, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 96, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 252, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 223, 255, 255, 255, 132, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 218, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 109, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 255, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 217, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 210, 255, 255, 255, 40, 255, 255, 255, 41, 255, 255, 255, 222, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 210, 255, 255, 255, 39, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 142, 255, 255, 255, 231, 255, 255, 255, 239, 255, 255, 255, 137, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 75, 255, 255, 255, 220, 255, 255, 255, 247, 255, 255, 255, 156, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 133, 255, 255, 255, 224, 255, 255, 255, 244, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 233, 255, 255, 255, 71, 255, 255, 255, 35, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 201, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 234, 255, 255, 255, 131, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 157, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 156, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 52, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 180, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 51, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 52, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 183, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 95, 255, 255, 255, 251, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 157, 255, 255, 255, 62, 0, 0, 0, 0, 255, 255, 255, 156, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 230, 255, 255, 255, 67, 255, 255, 255, 36, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 43, 255, 255, 255, 248, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 237, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 133, 255, 255, 255, 224, 255, 255, 255, 244, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 139, 255, 255, 255, 228, 255, 255, 255, 246, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 117, 255, 255, 255, 238, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 233, 255, 255, 255, 71, 255, 255, 255, 35, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 216, 255, 255, 255, 225, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 255, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 61, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 9, 255, 255, 255, 16, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 111, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 43, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 225, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 255, 255, 255, 172, 255, 255, 255, 36, 255, 255, 255, 65, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 25, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 191, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 228, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 190, 255, 255, 255, 245, 255, 255, 255, 221, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 143, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 169, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 51, 255, 255, 255, 192, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 230, 255, 255, 255, 67, 255, 255, 255, 36, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 219, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 139, 255, 255, 255, 228, 255, 255, 255, 246, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 254, 255, 255, 255, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 202, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 194, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 142, 255, 255, 255, 14, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 200, 255, 255, 255, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 0, 0, 0, 0, 255, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 216, 255, 255, 255, 251, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 133, 255, 255, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 193, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 251, 255, 255, 255, 95, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 218, 255, 255, 255, 249, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 226, 255, 255, 255, 127, 255, 255, 255, 15, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 217, 255, 255, 255, 245, 255, 255, 255, 195, 255, 255, 255, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 18, 255, 255, 255, 238, 255, 255, 255, 117, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 254, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 109, 255, 255, 255, 68, 255, 255, 255, 36, 255, 255, 255, 158, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 198, 255, 255, 255, 207, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 198, 255, 255, 255, 197, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 255, 255, 255, 255, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 17, 255, 255, 255, 19, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 242, 255, 255, 255, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 16, 255, 255, 255, 127, 255, 255, 255, 229, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 18, 255, 255, 255, 146, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 201, 255, 255, 255, 193, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 244, 255, 255, 255, 194, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 191, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 233, 255, 255, 255, 8, 255, 255, 255, 16, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 18, 255, 255, 255, 20, 255, 255, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 202, 255, 255, 255, 179, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 198, 255, 255, 255, 198, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 218, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 219, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 252, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 220, 255, 255, 255, 249, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 239, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 166, 255, 255, 255, 35, 255, 255, 255, 251, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 223, 255, 255, 255, 219, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 202, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 44, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 235, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 226, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 46, 255, 255, 255, 208, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 29, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 83, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 219, 255, 255, 255, 211, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 225, 255, 255, 255, 223, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 226, 255, 255, 255, 61, 255, 255, 255, 40, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 57, 255, 255, 255, 36, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 109, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 225, 255, 255, 255, 223, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 242, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 219, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 205, 255, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 64, 255, 255, 255, 253, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 236, 255, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 239, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 70, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 161, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 150, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 91, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 205, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 205, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 242, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 70, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 218, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 219, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 256, +"mipmaps": false, +"width": 128 +} + +[sub_resource type="ImageTexture" id=3] +image = SubResource( 10 ) +size = Vector2( 128, 256 ) + +[sub_resource type="BitmapFont" id=4] +textures = [ SubResource( 3 ) ] +chars = PoolIntArray( 32, 0, 0, 0, 0, 0, 0, 11, 4, 160, 0, 1734439808, 0, 0, 0, 0, 11, 4, 96, 0, 2, 216, 3, 2, 3, 0, 8, 192, 0, 32, 16, 11, 13, -1, -2, 9, 224, 0, 85, 180, 5, 11, 1, 0, 7, 64, 0, 72, 34, 10, 11, 1, 1, 12, 97, 0, 76, 188, 5, 8, 1, 3, 7, 65, 0, 2, 16, 11, 10, -1, 1, 9, 161, 0, 2, 222, 2, 11, 1, 3, 4, 193, 0, 17, 16, 11, 13, -1, -2, 9, 225, 0, 112, 169, 5, 11, 1, 0, 7, 33, 0, 65, 234, 2, 10, 1, 1, 4, 34, 0, 49, 187, 5, 4, 1, 1, 6, 162, 0, 12, 136, 6, 10, 1, 1, 8, 66, 0, 46, 109, 7, 10, 1, 1, 9, 194, 0, 113, 2, 11, 13, -1, -2, 9, 226, 0, 72, 143, 6, 11, 1, 0, 7, 98, 0, 102, 165, 6, 11, 1, 0, 8, 99, 0, 40, 179, 5, 8, 1, 3, 7, 67, 0, 68, 115, 7, 10, 1, 1, 8, 227, 0, 2, 155, 6, 12, 1, -1, 7, 195, 0, 53, 2, 11, 14, -1, -3, 9, 163, 0, 22, 167, 6, 10, 1, 1, 8, 35, 0, 78, 66, 8, 10, 0, 1, 9, 164, 0, 14, 79, 8, 7, 0, 3, 8, 68, 0, 90, 66, 8, 10, 1, 1, 10, 100, 0, 82, 150, 6, 11, 1, 0, 8, 36, 0, 102, 137, 6, 12, 1, 0, 8, 196, 0, 98, 2, 11, 13, -1, -2, 9, 228, 0, 121, 169, 5, 11, 1, 0, 7, 101, 0, 32, 124, 6, 8, 1, 3, 8, 197, 0, 83, 2, 11, 12, -1, -1, 9, 229, 0, 20, 196, 5, 12, 1, -1, 7, 165, 0, 79, 98, 7, 10, 0, 1, 8, 69, 0, 29, 191, 5, 10, 1, 1, 7, 37, 0, 2, 30, 10, 10, 1, 1, 12, 230, 0, 58, 34, 10, 8, 1, 3, 12, 102, 0, 2, 201, 5, 11, 0, 0, 4, 166, 0, 95, 228, 2, 14, 3, 0, 7, 198, 0, 21, 2, 12, 10, -1, 1, 12, 70, 0, 101, 105, 6, 10, 1, 1, 7, 38, 0, 67, 49, 9, 10, 1, 1, 10, 39, 0, 119, 219, 2, 4, 1, 1, 3, 167, 0, 112, 131, 6, 11, 0, 0, 7, 103, 0, 13, 107, 7, 11, 1, 3, 7, 199, 0, 57, 97, 7, 13, 1, 1, 8, 231, 0, 2, 186, 5, 11, 1, 3, 7, 71, 0, 66, 65, 8, 10, 1, 1, 10, 168, 0, 77, 217, 4, 2, 2, 0, 8, 104, 0, 72, 158, 6, 11, 1, 0, 8, 40, 0, 93, 212, 4, 12, 1, 1, 4, 200, 0, 47, 195, 5, 13, 1, -2, 7, 232, 0, 62, 143, 6, 11, 1, 0, 8, 72, 0, 54, 65, 8, 10, 1, 1, 10, 105, 0, 109, 213, 3, 11, 0, 0, 4, 41, 0, 51, 226, 3, 12, 0, 1, 4, 201, 0, 56, 197, 5, 13, 1, -2, 7, 233, 0, 52, 142, 6, 11, 1, 0, 8, 169, 0, 44, 34, 10, 10, 1, 1, 12, 73, 0, 38, 191, 5, 10, 0, 1, 5, 170, 0, 29, 205, 4, 5, 0, 1, 5, 42, 0, 108, 80, 7, 6, 0, 0, 8, 202, 0, 65, 202, 5, 13, 1, -2, 7, 74, 0, 92, 195, 5, 13, -2, 1, 3, 106, 0, 101, 213, 4, 14, -1, 0, 4, 234, 0, 12, 181, 6, 11, 1, 0, 8, 171, 0, 22, 181, 5, 6, 1, 4, 7, 43, 0, 101, 94, 7, 7, 0, 3, 8, 107, 0, 112, 92, 7, 11, 1, 0, 7, 203, 0, 83, 200, 5, 13, 1, -2, 7, 235, 0, 2, 171, 6, 11, 1, 0, 8, 75, 0, 102, 66, 8, 10, 1, 1, 8, 44, 0, 107, 231, 2, 3, 1, 9, 4, 172, 0, 2, 104, 7, 4, 0, 6, 8, 108, 0, 113, 228, 2, 11, 1, 0, 4, 204, 0, 101, 196, 5, 13, 0, -2, 5, 236, 0, 30, 214, 3, 11, 0, 0, 4, 76, 0, 22, 124, 6, 10, 1, 1, 7, 173, 0, 16, 229, 3, 2, 1, 7, 5, 45, 0, 123, 201, 3, 2, 1, 7, 5, 109, 0, 68, 2, 11, 8, 1, 3, 13, 205, 0, 11, 211, 5, 13, 0, -2, 5, 237, 0, 37, 214, 3, 11, 1, 0, 4, 77, 0, 62, 20, 10, 10, 1, 1, 12, 46, 0, 101, 231, 2, 2, 1, 9, 4, 110, 0, 111, 107, 6, 8, 1, 3, 8, 206, 0, 20, 212, 5, 13, 0, -2, 5, 238, 0, 11, 196, 5, 11, -1, 0, 4, 174, 0, 30, 33, 10, 10, 1, 1, 12, 78, 0, 2, 79, 8, 10, 1, 1, 10, 175, 0, 35, 111, 7, 1, 0, -1, 7, 111, 0, 102, 153, 6, 8, 1, 3, 8, 207, 0, 119, 184, 5, 13, 0, -2, 5, 239, 0, 69, 219, 4, 11, 0, 0, 4, 79, 0, 41, 66, 9, 10, 1, 1, 11, 47, 0, 90, 105, 7, 10, -1, 1, 5, 176, 0, 61, 219, 4, 4, 1, 1, 6, 112, 0, 32, 150, 6, 11, 1, 3, 8, 240, 0, 82, 165, 6, 11, 1, 0, 8, 208, 0, 86, 33, 9, 10, 0, 1, 10, 80, 0, 52, 128, 6, 10, 1, 1, 8, 48, 0, 42, 135, 6, 10, 1, 1, 8, 177, 0, 46, 97, 7, 8, 0, 3, 8, 113, 0, 22, 152, 6, 11, 1, 3, 8, 241, 0, 2, 112, 6, 12, 1, -1, 8, 81, 0, 15, 59, 9, 13, 1, 1, 11, 209, 0, 74, 80, 8, 14, 1, -3, 10, 49, 0, 45, 212, 4, 10, 2, 1, 8, 178, 0, 58, 187, 5, 6, 0, 1, 5, 114, 0, 85, 217, 4, 8, 1, 3, 5, 210, 0, 2, 62, 9, 13, 1, -2, 11, 242, 0, 62, 165, 6, 11, 1, 0, 8, 82, 0, 35, 97, 7, 10, 1, 1, 8, 50, 0, 57, 114, 7, 10, 1, 1, 8, 179, 0, 53, 214, 4, 6, 0, 1, 5, 115, 0, 112, 146, 6, 8, 0, 3, 7, 211, 0, 106, 49, 9, 13, 1, -2, 11, 243, 0, 52, 172, 6, 11, 1, 0, 8, 83, 0, 24, 96, 7, 10, 0, 1, 7, 51, 0, 22, 138, 6, 10, 1, 1, 8, 180, 0, 9, 228, 3, 2, 3, 0, 8, 116, 0, 67, 188, 5, 10, 0, 1, 5, 212, 0, 93, 49, 9, 13, 1, -2, 11, 244, 0, 42, 164, 6, 11, 1, 0, 8, 84, 0, 13, 93, 7, 10, 0, 1, 7, 52, 0, 24, 110, 7, 10, 1, 1, 8, 245, 0, 12, 165, 6, 12, 1, -1, 8, 181, 0, 2, 140, 6, 11, 1, 3, 8, 117, 0, 42, 123, 6, 8, 1, 3, 8, 53, 0, 92, 119, 6, 10, 1, 1, 8, 85, 0, 114, 66, 8, 10, 1, 1, 10, 213, 0, 2, 44, 9, 14, 1, -3, 11, 118, 0, 15, 47, 9, 8, -1, 3, 7, 182, 0, 68, 98, 7, 13, 1, 0, 9, 214, 0, 80, 49, 9, 13, 1, -2, 11, 246, 0, 72, 173, 6, 11, 1, 0, 8, 86, 0, 76, 18, 10, 10, -1, 1, 8, 54, 0, 82, 121, 6, 10, 1, 1, 8, 183, 0, 77, 223, 2, 2, 1, 5, 4, 215, 0, 2, 93, 7, 7, 0, 3, 8, 247, 0, 90, 94, 7, 7, 0, 3, 8, 119, 0, 37, 2, 12, 8, -1, 3, 10, 87, 0, 2, 2, 15, 10, -1, 1, 13, 55, 0, 72, 129, 6, 10, 1, 1, 8, 184, 0, 116, 212, 3, 3, 0, 11, 3, 120, 0, 119, 80, 7, 8, 0, 3, 7, 248, 0, 2, 128, 6, 8, 1, 3, 8, 216, 0, 99, 33, 9, 12, 1, 0, 11, 88, 0, 90, 19, 10, 10, -1, 1, 8, 56, 0, 62, 129, 6, 10, 1, 1, 8, 185, 0, 23, 229, 3, 6, 0, 1, 5, 57, 0, 12, 122, 6, 10, 1, 1, 8, 121, 0, 112, 33, 9, 11, -1, 3, 7, 249, 0, 52, 157, 6, 11, 1, 0, 8, 217, 0, 38, 80, 8, 13, 1, -2, 10, 89, 0, 28, 65, 9, 10, -1, 1, 7, 186, 0, 37, 205, 4, 5, 0, 1, 5, 58, 0, 89, 229, 2, 8, 1, 3, 4, 122, 0, 112, 119, 6, 8, 1, 3, 7, 90, 0, 32, 136, 6, 10, 1, 1, 8, 250, 0, 42, 149, 6, 11, 1, 0, 8, 218, 0, 26, 79, 8, 13, 1, -2, 10, 187, 0, 31, 181, 5, 6, 1, 4, 7, 59, 0, 71, 234, 2, 9, 1, 3, 4, 251, 0, 12, 150, 6, 11, 1, 0, 8, 123, 0, 103, 180, 5, 12, 0, 1, 5, 91, 0, 58, 227, 3, 12, 1, 1, 4, 219, 0, 50, 80, 8, 13, 1, -2, 10, 60, 0, 92, 153, 6, 7, 1, 3, 8, 92, 0, 97, 80, 7, 10, -1, 1, 5, 252, 0, 92, 133, 6, 11, 1, 0, 8, 220, 0, 62, 79, 8, 13, 1, -2, 10, 124, 0, 83, 229, 2, 14, 3, 0, 7, 188, 0, 16, 33, 10, 10, 0, 1, 10, 61, 0, 79, 112, 7, 5, 0, 4, 8, 125, 0, 110, 196, 5, 12, 0, 1, 5, 93, 0, 44, 226, 3, 12, 0, 1, 4, 221, 0, 54, 48, 9, 13, -1, -2, 7, 253, 0, 28, 47, 9, 14, -1, 0, 7, 189, 0, 47, 20, 11, 10, 0, 1, 10, 126, 0, 62, 158, 6, 3, 1, 5, 8, 94, 0, 86, 80, 7, 6, 0, 1, 7, 62, 0, 112, 158, 6, 7, 1, 3, 8, 254, 0, 102, 119, 6, 14, 1, 0, 8, 222, 0, 32, 165, 6, 10, 1, 1, 8, 190, 0, 104, 19, 10, 10, 0, 1, 10, 95, 0, 92, 148, 6, 1, 0, 12, 6, 63, 0, 74, 202, 5, 10, 0, 1, 6, 191, 0, 94, 180, 5, 11, 0, 3, 6, 255, 0, 41, 48, 9, 14, -1, 0, 7, 223, 0, 82, 135, 6, 11, 1, 0, 8 ) +height = 14.0 +ascent = 11.0 + +[sub_resource type="Image" id=11] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=6] +flags = 4 +flags = 4 +image = SubResource( 11 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxTexture" id=7] +texture = SubResource( 6 ) +region_rect = Rect2( 0, 0, 16, 16 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 + +[sub_resource type="Image" id=12] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=9] +flags = 4 +flags = 4 +image = SubResource( 12 ) +size = Vector2( 16, 16 ) + +[node name="CharacterEditor" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -25.0 +theme = ExtResource( 5 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Split" type="HSplitContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="EditorScroll" type="ScrollContainer" parent="Split"] +margin_right = 581.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/bg = SubResource( 1 ) +scroll_horizontal_enabled = false + +[node name="Editor" type="VBoxContainer" parent="Split/EditorScroll"] +margin_right = 581.0 +margin_bottom = 600.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 11 + +[node name="NameAndColor" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_right = 581.0 +margin_bottom = 24.0 + +[node name="TLabel" parent="Split/EditorScroll/Editor/NameAndColor" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 130.0 +margin_bottom = 19.0 +rect_min_size = Vector2( 130, 0 ) +text = "Name: " +text_key = "Name: " + +[node name="ColorPickerButton" type="ColorPickerButton" parent="Split/EditorScroll/Editor/NameAndColor"] +margin_left = 134.0 +margin_right = 164.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 30, 0 ) +color = Color( 1, 1, 1, 1 ) +edit_alpha = false + +[node name="NameLineEdit" type="LineEdit" parent="Split/EditorScroll/Editor/NameAndColor"] +margin_left = 168.0 +margin_right = 308.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 140, 0 ) +expand_to_text_length = true +caret_blink = true +caret_blink_speed = 0.5 + +[node name="Spacer" type="Control" parent="Split/EditorScroll/Editor/NameAndColor"] +margin_left = 312.0 +margin_right = 322.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 10, 0 ) + +[node name="DisplayName" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_top = 28.0 +margin_right = 581.0 +margin_bottom = 52.0 +__meta__ = { +"_editor_description_": "Display name is the name that will +show up on the dialogs in game." +} + +[node name="TLabel2" parent="Split/EditorScroll/Editor/DisplayName" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 130.0 +margin_bottom = 19.0 +rect_min_size = Vector2( 130, 0 ) +text = "Display Name: " +text_key = "Display Name: " + +[node name="CheckBox" type="CheckBox" parent="Split/EditorScroll/Editor/DisplayName"] +margin_left = 134.0 +margin_right = 164.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 30, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineEdit" type="LineEdit" parent="Split/EditorScroll/Editor/DisplayName"] +visible = false +margin_left = 168.0 +margin_right = 308.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 140, 0 ) +expand_to_text_length = true +caret_blink = true +caret_blink_speed = 0.5 + +[node name="DisplayNickname" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_top = 56.0 +margin_right = 581.0 +margin_bottom = 80.0 +__meta__ = { +"_editor_description_": "Display name is the name that will +show up on the dialogs in game." +} + +[node name="TLabel3" parent="Split/EditorScroll/Editor/DisplayNickname" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 130.0 +margin_bottom = 19.0 +rect_min_size = Vector2( 130, 0 ) +text = "Nicknames: " +text_key = "Nicknames: " + +[node name="CheckBox" type="CheckBox" parent="Split/EditorScroll/Editor/DisplayNickname"] +margin_left = 134.0 +margin_right = 164.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 30, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="LineEdit" type="LineEdit" parent="Split/EditorScroll/Editor/DisplayNickname"] +visible = false +margin_left = 162.0 +margin_right = 527.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 140, 0 ) +size_flags_horizontal = 3 +caret_blink = true +caret_blink_speed = 0.5 + +[node name="Description" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_top = 84.0 +margin_right = 581.0 +margin_bottom = 134.0 + +[node name="TLabel5" parent="Split/EditorScroll/Editor/Description" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 130.0 +margin_bottom = 14.0 +rect_min_size = Vector2( 130, 0 ) +size_flags_vertical = 0 +text = "Description: " +text_key = "Description: " + +[node name="TextEdit" type="TextEdit" parent="Split/EditorScroll/Editor/Description"] +margin_left = 134.0 +margin_right = 581.0 +margin_bottom = 50.0 +rect_min_size = Vector2( 100, 50 ) +size_flags_horizontal = 3 +wrap_enabled = true + +[node name="Theme" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_top = 138.0 +margin_right = 581.0 +margin_bottom = 162.0 + +[node name="TLabel5" parent="Split/EditorScroll/Editor/Theme" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 130.0 +margin_bottom = 14.0 +rect_min_size = Vector2( 130, 0 ) +size_flags_vertical = 0 +text = "Theme: " +text_key = "Theme: " + +[node name="ThemeButton" parent="Split/EditorScroll/Editor/Theme" instance=ExtResource( 6 )] +margin_left = 134.0 +margin_right = 248.0 +custom_colors/font_color = Color( 0.8, 0.807843, 0.827451, 1 ) + +[node name="Separator" type="HSeparator" parent="Split/EditorScroll/Editor"] +margin_top = 166.0 +margin_right = 581.0 +margin_bottom = 184.0 +rect_min_size = Vector2( 0, 10 ) +custom_constants/separation = 18 + +[node name="Portraits" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_top = 188.0 +margin_right = 581.0 +margin_bottom = 212.0 + +[node name="Title" parent="Split/EditorScroll/Editor/Portraits" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 457.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +custom_fonts/font = SubResource( 4 ) +text = "Portraits" +valign = 1 +text_key = "Portraits" + +[node name="Search" type="LineEdit" parent="Split/EditorScroll/Editor/Portraits"] +margin_left = 461.0 +margin_right = 581.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 120, 0 ) +size_flags_vertical = 4 +expand_to_text_length = true +clear_button_enabled = true +placeholder_text = "Search" + +[node name="HBoxContainer" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +margin_top = 216.0 +margin_right = 581.0 +margin_bottom = 240.0 + +[node name="TLabel11" parent="Split/EditorScroll/Editor/HBoxContainer" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 33.0 +margin_bottom = 19.0 +text = "Scale" +text_key = "Scale" + +[node name="Scale" type="SpinBox" parent="Split/EditorScroll/Editor/HBoxContainer"] +margin_left = 37.0 +margin_right = 113.0 +margin_bottom = 24.0 +value = 100.0 +allow_greater = true +align = 2 +suffix = "%" + +[node name="TLabel12" parent="Split/EditorScroll/Editor/HBoxContainer" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 117.0 +margin_top = 5.0 +margin_right = 156.0 +margin_bottom = 19.0 +text = "Offset" +text_key = "Offset" + +[node name="OffsetX" type="SpinBox" parent="Split/EditorScroll/Editor/HBoxContainer"] +margin_left = 160.0 +margin_right = 236.0 +margin_bottom = 24.0 +allow_greater = true +allow_lesser = true +suffix = "X" + +[node name="OffsetY" type="SpinBox" parent="Split/EditorScroll/Editor/HBoxContainer"] +margin_left = 240.0 +margin_right = 316.0 +margin_bottom = 24.0 +allow_greater = true +allow_lesser = true +suffix = "Y" + +[node name="MirrorOption" type="HBoxContainer" parent="Split/EditorScroll/Editor/HBoxContainer"] +margin_left = 320.0 +margin_right = 445.0 +margin_bottom = 24.0 + +[node name="TLabel11" parent="Split/EditorScroll/Editor/HBoxContainer/MirrorOption" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 97.0 +margin_bottom = 19.0 +text = "Mirror portraits" +text_key = "Mirror portraits" + +[node name="MirrorPortraitsCheckBox" type="CheckBox" parent="Split/EditorScroll/Editor/HBoxContainer/MirrorOption"] +margin_left = 101.0 +margin_right = 125.0 +margin_bottom = 24.0 + +[node name="PortraitPanel" type="PanelContainer" parent="Split/EditorScroll/Editor"] +margin_top = 244.0 +margin_right = 581.0 +margin_bottom = 600.0 +size_flags_vertical = 3 +custom_styles/panel = SubResource( 7 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="Split/EditorScroll/Editor/PortraitPanel"] +margin_left = 2.0 +margin_top = 2.0 +margin_right = 579.0 +margin_bottom = 354.0 + +[node name="Labels" type="HBoxContainer" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer"] +margin_right = 577.0 +margin_bottom = 22.0 + +[node name="TLabel7" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 4.0 +margin_right = 160.0 +margin_bottom = 18.0 +rect_min_size = Vector2( 160, 0 ) +text = "Name" +text_key = "Name" + +[node name="TLabel8" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 164.0 +margin_top = 4.0 +margin_right = 329.0 +margin_bottom = 18.0 +size_flags_horizontal = 3 +text = "Path" +text_key = "Path" + +[node name="HBoxContainer" type="HBoxContainer" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels"] +margin_left = 333.0 +margin_right = 577.0 +margin_bottom = 22.0 + +[node name="NewPortrait" type="Button" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels/HBoxContainer"] +margin_right = 117.0 +margin_bottom = 22.0 +text = " New portrait" +icon = SubResource( 9 ) + +[node name="ImportFromFolder" type="Button" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/Labels/HBoxContainer"] +margin_left = 121.0 +margin_right = 244.0 +margin_bottom = 22.0 +text = " Import folder" +icon = SubResource( 9 ) + +[node name="ScrollContainer" type="ScrollContainer" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer"] +margin_top = 26.0 +margin_right = 577.0 +margin_bottom = 352.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/ScrollContainer"] +margin_right = 577.0 +margin_bottom = 326.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PortraitList" type="VBoxContainer" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/ScrollContainer/VBoxContainer"] +margin_right = 577.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="PortraitEntry" parent="Split/EditorScroll/Editor/PortraitPanel/VBoxContainer/ScrollContainer/VBoxContainer/PortraitList" instance=ExtResource( 1 )] +margin_right = 577.0 + +[node name="FileName" type="HBoxContainer" parent="Split/EditorScroll/Editor"] +visible = false +margin_top = 625.0 +margin_right = 527.0 +margin_bottom = 649.0 + +[node name="TLabel9" parent="Split/EditorScroll/Editor/FileName" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 27.0 +margin_bottom = 19.0 +text = "File:" +text_key = "File:" + +[node name="LineEdit" type="LineEdit" parent="Split/EditorScroll/Editor/FileName"] +margin_left = 31.0 +margin_right = 527.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 140, 0 ) +size_flags_horizontal = 3 +editable = false +caret_blink = true +caret_blink_speed = 0.5 + +[node name="Preview" type="VBoxContainer" parent="Split"] +margin_left = 593.0 +margin_right = 999.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +size_flags_stretch_ratio = 0.7 + +[node name="Background" type="Panel" parent="Split/Preview"] +margin_right = 406.0 +margin_bottom = 600.0 +rect_clip_content = true +size_flags_vertical = 3 + +[node name="FullTextureRect" type="TextureRect" parent="Split/Preview/Background"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 30.0 +margin_top = 30.0 +margin_right = -30.0 +margin_bottom = -30.0 +rect_min_size = Vector2( 100, 100 ) +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Positioner" type="Control" parent="Split/Preview/Background"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 11.0 +margin_top = 50.0 +margin_right = -10.0 +margin_bottom = -15.0 +rect_clip_content = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RealSizedRect" type="TextureRect" parent="Split/Preview/Background/Positioner"] +visible = false +margin_left = 3.0 +margin_right = 402.0 +margin_bottom = 756.0 +mouse_filter = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel10" parent="Split/Preview/Background" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 50.0 +margin_bottom = 14.0 +text = "Preview" +text_key = "Preview" + +[node name="PreviewMode" type="OptionButton" parent="Split/Preview/Background"] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -110.0 +margin_top = 6.0 +margin_right = -8.0 +margin_bottom = 26.0 +grow_horizontal = 0 +text = "Full View" +items = [ "Full View", null, false, 0, null, "Actual Size", null, false, 1, null ] +selected = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[connection signal="value_changed" from="Split/EditorScroll/Editor/HBoxContainer/Scale" to="." method="_on_Scale_value_changed"] +[connection signal="toggled" from="Split/EditorScroll/Editor/HBoxContainer/MirrorOption/MirrorPortraitsCheckBox" to="." method="_on_MirrorPortraitsCheckBox_toggled"] +[connection signal="item_selected" from="Split/Preview/Background/PreviewMode" to="." method="_on_PreviewMode_item_selected"] +[connection signal="item_selected" from="Split/Preview/Background/PreviewMode" to="." method="_on_OptionButton_item_selected"] diff --git a/project/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd b/project/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd new file mode 100644 index 0000000..0393fd7 --- /dev/null +++ b/project/addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd @@ -0,0 +1,55 @@ +tool +extends HBoxContainer + +var editor_reference +var image_node +var image_node2 +var image_label + +func _ready(): + $ButtonDelete.icon = get_icon("Remove", "EditorIcons") + + +func _on_ButtonDelete_pressed(): + if $NameEdit.text == 'Default': + $PathEdit.text = '' + update_preview('') + else: + queue_free() + + +func _on_ButtonSelect_pressed(): + editor_reference.godot_dialog("*.png, *.svg, *.tscn") + editor_reference.godot_dialog_connect(self, "_on_file_selected") + + +func _on_file_selected(path, target): + update_preview(path) + $PathEdit.text = path + if $NameEdit.text == '': + $NameEdit.text = DialogicResources.get_filename_from_path(path) + + +func _on_focus_entered(): + if $PathEdit.text == '': + image_label.text = editor_reference.dialogicTranslator.translate('NoImagePreview') + image_node.texture = null + image_node2.texture = null + else: + update_preview($PathEdit.text) + + +func update_preview(path): + image_label.text = editor_reference.dialogicTranslator.translate('Preview of')+' "'+$NameEdit.text+'"' + var l_path = path.to_lower() + if '.png' in l_path or '.svg' in l_path: + image_node.texture = load(path) + image_node2.texture = load(path) + image_label.text += ' (' + str(image_node.texture.get_width()) + 'x' + str(image_node.texture.get_height())+')' + elif '.tscn' in l_path: + image_node.texture = null + image_node2.texture = null + image_label.text = editor_reference.dialogicTranslator.translate('CustomScenePreview') + else: + image_node.texture = null + image_node2.texture = null diff --git a/project/addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn b/project/addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn new file mode 100644 index 0000000..461fcb3 --- /dev/null +++ b/project/addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn @@ -0,0 +1,61 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.gd" type="Script" id=2] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[node name="PortraitEntry" type="HBoxContainer"] +margin_right = 451.0 +margin_bottom = 24.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NameEdit" type="LineEdit" parent="."] +margin_right = 160.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 160, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PathEdit" type="LineEdit" parent="."] +margin_left = 164.0 +margin_right = 391.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 150, 0 ) +size_flags_horizontal = 3 +editable = false +selecting_enabled = false + +[node name="ButtonSelect" type="Button" parent="."] +margin_left = 395.0 +margin_right = 419.0 +margin_bottom = 24.0 +text = "..." + +[node name="ButtonDelete" type="Button" parent="."] +margin_left = 423.0 +margin_right = 451.0 +margin_bottom = 24.0 +icon = SubResource( 3 ) +flat = true + +[connection signal="focus_entered" from="NameEdit" to="." method="_on_focus_entered"] +[connection signal="focus_entered" from="PathEdit" to="." method="_on_focus_entered"] +[connection signal="pressed" from="ButtonSelect" to="." method="_on_ButtonSelect_pressed"] +[connection signal="pressed" from="ButtonDelete" to="." method="_on_ButtonDelete_pressed"] diff --git a/project/addons/dialogic/Editor/Common/SectionTitle.gd b/project/addons/dialogic/Editor/Common/SectionTitle.gd new file mode 100644 index 0000000..b5b840c --- /dev/null +++ b/project/addons/dialogic/Editor/Common/SectionTitle.gd @@ -0,0 +1,12 @@ +tool +extends Label +export var text_key : String = "" +var editor_reference + +func set_text_from_key(value): + text = editor_reference.dialogicTranslator.translate(value) + +func _ready(): + editor_reference = find_parent('EditorView') + if text_key != '': + set_text_from_key(text_key) diff --git a/project/addons/dialogic/Editor/Common/SectionTitle.tscn b/project/addons/dialogic/Editor/Common/SectionTitle.tscn new file mode 100644 index 0000000..8d19bf6 --- /dev/null +++ b/project/addons/dialogic/Editor/Common/SectionTitle.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Common/SectionTitle.gd" type="Script" id=1] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 4.0 +content_margin_right = 4.0 +content_margin_top = 4.0 +content_margin_bottom = 4.0 +bg_color = Color( 0.252, 0.2718, 0.3246, 1 ) + +[node name="SectionTitle" type="Label"] +margin_right = 270.0 +margin_bottom = 22.0 +custom_styles/normal = SubResource( 1 ) +text = "Visuals" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Common/TLabel.gd b/project/addons/dialogic/Editor/Common/TLabel.gd new file mode 100644 index 0000000..3e339ff --- /dev/null +++ b/project/addons/dialogic/Editor/Common/TLabel.gd @@ -0,0 +1,11 @@ +tool +extends Label +export var text_key : String = "" +var editor_reference + +func set_text_from_key(value): + text = editor_reference.dialogicTranslator.translate(value) + +func _ready(): + editor_reference = find_parent('EditorView') + set_text_from_key(text_key) diff --git a/project/addons/dialogic/Editor/Common/TLabel.tscn b/project/addons/dialogic/Editor/Common/TLabel.tscn new file mode 100644 index 0000000..4d066f3 --- /dev/null +++ b/project/addons/dialogic/Editor/Common/TLabel.tscn @@ -0,0 +1,11 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.gd" type="Script" id=1] + +[node name="TLabel" type="Label"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd b/project/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd new file mode 100644 index 0000000..386f3ed --- /dev/null +++ b/project/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd @@ -0,0 +1,65 @@ +tool +extends Control + +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +var current_page : String = "" + +var previous_pages = [] +var next_pages = [] + +signal open_link(link) + +onready var nodes = { + 'DocsViewer': $DocsViewer, + 'Next': null, + 'Previous':null, +} + +func _ready(): + set("custom_styles/panel", get_stylebox("Background", "EditorStyles")) + + var _scale = get_constant("inspector_margin", "Editor") + _scale = _scale * 0.125 + nodes['DocsViewer'].MarkdownParser.editor_scale = _scale + nodes['Next'] = find_parent("EditorView").get_node("ToolBar/DocumentationNavigation/Next") + nodes['Next'].connect('pressed',self, 'open_next_page') + nodes['Previous'] = find_parent("EditorView").get_node("ToolBar/DocumentationNavigation/Previous") + nodes['Previous'].connect('pressed',self, 'open_previous_page') + + + +func load_page(page): + if current_page: + previous_pages.push_back(current_page) + nodes['Previous'].disabled = false + next_pages = [] + current_page = page + nodes['DocsViewer'].load_page(current_page) + nodes['Next'].disabled = true + + +func open_previous_page(): + if len(previous_pages): + next_pages.push_front(current_page) + current_page = previous_pages.pop_back() + nodes['DocsViewer'].load_page(current_page) + nodes['Previous'].disabled = len(previous_pages) == 0 + nodes['Next'].disabled = false + + +func open_next_page(): + if len(next_pages): + previous_pages.push_back(current_page) + current_page = next_pages.pop_front() + nodes['DocsViewer'].load_page(current_page) + nodes['Next'].disabled = len(next_pages) == 0 + nodes['Previous'].disabled = false + + +func toggle_editing(): + nodes['DocsViewer'].toggle_editing() + + +func _on_DocsViewer_open_non_html_link(link, section): + #print(link, " ", section) + master_tree.select_documentation_item(link) diff --git a/project/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.tscn b/project/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.tscn new file mode 100644 index 0000000..9827a8e --- /dev/null +++ b/project/addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocsPageViewer.tscn" type="PackedScene" id=2] + +[sub_resource type="Image" id=6] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=4] +flags = 4 +flags = 4 +image = SubResource( 6 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxTexture" id=5] +texture = SubResource( 4 ) +region_rect = Rect2( 0, 0, 16, 16 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 + +[node name="DocumentationViewer" type="Panel"] +anchor_right = 1.0 +anchor_bottom = 1.0 +custom_styles/panel = SubResource( 5 ) +script = ExtResource( 1 ) + +[node name="DocsViewer" parent="." instance=ExtResource( 2 )] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = 0.0 +margin_bottom = 0.0 +rect_min_size = Vector2( 50, 0 ) + +[connection signal="open_non_html_link" from="DocsViewer" to="." method="_on_DocsViewer_open_non_html_link"] diff --git a/project/addons/dialogic/Editor/EditorView.gd b/project/addons/dialogic/Editor/EditorView.gd new file mode 100644 index 0000000..bead114 --- /dev/null +++ b/project/addons/dialogic/Editor/EditorView.gd @@ -0,0 +1,196 @@ +tool +extends Control + +var editor_file_dialog # EditorFileDialog +var file_picker_data: Dictionary = {'method': '', 'node': self} +var version_string: String + +var dialogicTranslator = load("res://addons/dialogic/Localization/translation_service.gd").new() + +# this is set when the plugins main-view is instanced in dialogic.gd +var editor_interface = null + +func _ready(): + # Adding file dialog to get used by Events + editor_file_dialog = EditorFileDialog.new() + add_child(editor_file_dialog) + + $ToolBar/Docs.text = dialogicTranslator.translate('Help') + $ToolBar/Web.text = dialogicTranslator.translate('Website') + + $MainPanel/MasterTreeContainer/MasterTree.connect("editor_selected", self, 'on_master_tree_editor_selected') + + # Updating the folder structure + DialogicUtil.update_resource_folder_structure() + + # Sizes + # This part of the code is a bit terrible. But there is no better way + # of doing this in Godot at the moment. I'm sorry. + var separation = get_constant("separation", "BoxContainer") + $MainPanel.margin_left = separation + $MainPanel.margin_right = separation * -1 + $MainPanel.margin_bottom = separation * -1 + $MainPanel.margin_top = 38 + var modifier = '' + var _scale = get_constant("inspector_margin", "Editor") + _scale = _scale * 0.125 + if _scale == 1: + $MainPanel.margin_top = 30 + if _scale == 1.25: + modifier = '-1.25' + $MainPanel.margin_top = 37 + if _scale == 1.5: + modifier = '-1.25' + $MainPanel.margin_top = 46 + if _scale == 1.75: + modifier = '-1.25' + $MainPanel.margin_top = 53 + if _scale == 2: + $MainPanel.margin_top = 59 + modifier = '-2' + $ToolBar/NewTimelineButton.icon = load("res://addons/dialogic/Images/Toolbar/add-timeline" + modifier + ".svg") + $ToolBar/NewTimelineButton.hint_tooltip = dialogicTranslator.translate('Add Timeline') + $ToolBar/NewCharactersButton.icon = load("res://addons/dialogic/Images/Toolbar/add-character" + modifier + ".svg") + $ToolBar/NewCharactersButton.hint_tooltip = dialogicTranslator.translate('Add Character') + $ToolBar/NewValueButton.icon = load("res://addons/dialogic/Images/Toolbar/add-definition" + modifier + ".svg") + $ToolBar/NewValueButton.hint_tooltip = dialogicTranslator.translate('Add Value') + $ToolBar/NewGlossaryEntryButton.icon = load("res://addons/dialogic/Images/Toolbar/add-glossary" + modifier + ".svg") + $ToolBar/NewGlossaryEntryButton.hint_tooltip = dialogicTranslator.translate('Add Glossary Entry') + $ToolBar/NewThemeButton.icon = load("res://addons/dialogic/Images/Toolbar/add-theme" + modifier + ".svg") + $ToolBar/NewThemeButton.hint_tooltip = dialogicTranslator.translate('Add Theme') + + var modulate_color = Color.white + if not get_constant("dark_theme", "Editor"): + modulate_color = get_color("property_color", "Editor") + $ToolBar/NewTimelineButton.modulate = modulate_color + $ToolBar/NewCharactersButton.modulate = modulate_color + $ToolBar/NewValueButton.modulate = modulate_color + $ToolBar/NewGlossaryEntryButton.modulate = modulate_color + $ToolBar/NewThemeButton.modulate = modulate_color + + $ToolBar/FoldTools/ButtonFold.icon = get_icon("GuiTreeArrowRight", "EditorIcons") + $ToolBar/FoldTools/ButtonUnfold.icon = get_icon("GuiTreeArrowDown", "EditorIcons") + $ToolBar/FoldTools/PlayTimeline.icon = get_icon("PlayScene", "EditorIcons") + + # Toolbar + $ToolBar/NewTimelineButton.connect('pressed', $MainPanel/MasterTreeContainer/MasterTree, 'new_timeline') + $ToolBar/NewCharactersButton.connect('pressed', $MainPanel/MasterTreeContainer/MasterTree, 'new_character') + $ToolBar/NewThemeButton.connect('pressed', $MainPanel/MasterTreeContainer/MasterTree, 'new_theme') + $ToolBar/NewValueButton.connect('pressed', $MainPanel/MasterTreeContainer/MasterTree, 'new_value_definition') + $ToolBar/NewGlossaryEntryButton.connect('pressed', $MainPanel/MasterTreeContainer/MasterTree, 'new_glossary_entry') + $ToolBar/Web.icon = get_icon("Instance", "EditorIcons") + $ToolBar/Web.connect('pressed', OS, "shell_open", ["https://dialogic.coppolaemilio.com"]) + $ToolBar/Docs.icon = get_icon("HelpSearch", "EditorIcons") + $ToolBar/DocumentationNavigation/Previous.icon = get_icon("Back", "EditorIcons") + $ToolBar/DocumentationNavigation/Next.icon = get_icon("Forward", "EditorIcons") + $ToolBar/Docs.connect('pressed', + $MainPanel/MasterTreeContainer/MasterTree, + "select_documentation_item", + ['/']) + $ToolBar/FoldTools/ButtonFold.connect('pressed', $MainPanel/TimelineEditor, 'fold_all_nodes') + $ToolBar/FoldTools/ButtonUnfold.connect('pressed', $MainPanel/TimelineEditor, 'unfold_all_nodes') + $ToolBar/FoldTools/PlayTimeline.connect('pressed', $MainPanel/TimelineEditor, 'play_timeline') + + + #Connecting confirmation + $RemoveFolderConfirmation.connect('confirmed', self, '_on_RemoveFolderConfirmation_confirmed') + $RemoveConfirmation.window_title = dialogicTranslator.translate("RemoveResourcePopupTitle") + $RemoveFolderConfirmation.window_title = dialogicTranslator.translate("RemoveFolderPopupTitle") + $RemoveFolderConfirmation.dialog_text = dialogicTranslator.translate("RemoveFolderPopupText") + + # Loading the version number + var config = ConfigFile.new() + var err = config.load("res://addons/dialogic/plugin.cfg") + if err == OK: + version_string = config.get_value("plugin", "version", "?") + $ToolBar/Version.text = 'Dialogic v' + version_string + + $MainPanel/MasterTreeContainer/FilterMasterTreeEdit.right_icon = get_icon("Search", "EditorIcons") + + +func on_master_tree_editor_selected(editor: String): + $ToolBar/FoldTools.visible = editor == 'timeline' + $ToolBar/DocumentationNavigation.visible = editor == 'documentation' + + +func popup_remove_confirmation(what): + # disconnect previous signals + if $RemoveConfirmation.is_connected( + 'confirmed', self, '_on_RemoveConfirmation_confirmed'): + $RemoveConfirmation.disconnect( + 'confirmed', self, '_on_RemoveConfirmation_confirmed') + + # the last theme should not be deleteded!!! + if what == "Theme" and len(DialogicUtil.get_theme_list()) == 1: + print("[D] You cannot delete the last theme!") + $RemoveConfirmation.dialog_text = dialogicTranslator.translate("CantDeleteLastTheme") + # otherwise we're ok + else: + var remove_text = dialogicTranslator.translate('DeleteResourceText') + $RemoveConfirmation.dialog_text = remove_text.replace('[resource]', what) + $RemoveConfirmation.connect('confirmed', self, '_on_RemoveConfirmation_confirmed', [what]) + + # popup time! + $RemoveConfirmation.popup_centered() + + +func _on_RemoveFolderConfirmation_confirmed(): + var item_path = $MainPanel/MasterTreeContainer/MasterTree.get_item_path($MainPanel/MasterTreeContainer/MasterTree.get_selected()) + DialogicUtil.remove_folder(item_path) + $MainPanel/MasterTreeContainer/MasterTree.build_full_tree() + + +func _on_RemoveConfirmation_confirmed(what: String = ''): + if what == 'Timeline': + var target = $MainPanel/TimelineEditor.timeline_file + DialogicResources.delete_timeline(target) + elif what == 'GlossaryEntry': + var target = $MainPanel/GlossaryEntryEditor.current_definition['id'] + DialogicResources.delete_default_definition(target) + elif what == 'Value': + var target = $MainPanel/ValueEditor.current_definition['id'] + DialogicResources.delete_default_definition(target) + elif what == 'Theme': + var filename = $MainPanel/MasterTreeContainer/MasterTree.get_selected().get_metadata(0)['file'] + DialogicResources.delete_theme(filename) + elif what == 'Character': + var filename = $MainPanel/CharacterEditor.opened_character_data['id'] + DialogicResources.delete_character(filename) + DialogicUtil.update_resource_folder_structure() + $MainPanel/MasterTreeContainer/MasterTree.remove_selected() + $MainPanel/MasterTreeContainer/MasterTree.hide_all_editors() + + +# Godot dialog +func godot_dialog(filter, mode = EditorFileDialog.MODE_OPEN_FILE): + editor_file_dialog.mode = mode + editor_file_dialog.clear_filters() + editor_file_dialog.popup_centered_ratio(0.75) + editor_file_dialog.add_filter(filter) + return editor_file_dialog + + +func godot_dialog_connect(who, method_name, signal_name = "file_selected"): + # You can pass multiple signal_name using an array + + # Checking if previous connections exist, if they do, disconnect them. + for test_signal in editor_file_dialog.get_signal_list(): + if not file_picker_data['node'] or not is_instance_valid(file_picker_data['node']): + continue + + if editor_file_dialog.is_connected( + test_signal.name, + file_picker_data['node'], + file_picker_data['method'] + ): + editor_file_dialog.disconnect( + test_signal.name, + file_picker_data['node'], + file_picker_data['method'] + ) + # Connect new signals + for new_signal_name in signal_name if typeof(signal_name) == TYPE_ARRAY else [signal_name]: + editor_file_dialog.connect(new_signal_name, who, method_name, [who]) + + file_picker_data['method'] = method_name + file_picker_data['node'] = who diff --git a/project/addons/dialogic/Editor/EditorView.tscn b/project/addons/dialogic/Editor/EditorView.tscn new file mode 100644 index 0000000..ad58ca3 --- /dev/null +++ b/project/addons/dialogic/Editor/EditorView.tscn @@ -0,0 +1,330 @@ +[gd_scene load_steps=22 format=2] + +[ext_resource path="res://addons/dialogic/Editor/EditorView.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Images/Toolbar/add-character.svg" type="Texture" id=3] +[ext_resource path="res://addons/dialogic/Images/Toolbar/add-timeline.svg" type="Texture" id=4] +[ext_resource path="res://addons/dialogic/Images/Toolbar/add-definition.svg" type="Texture" id=5] +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/SettingsEditor.tscn" type="PackedScene" id=6] +[ext_resource path="res://addons/dialogic/Editor/CharacterEditor/CharacterEditor.tscn" type="PackedScene" id=7] +[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn" type="PackedScene" id=8] +[ext_resource path="res://addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.tscn" type="PackedScene" id=9] +[ext_resource path="res://addons/dialogic/Images/Toolbar/add-glossary.svg" type="Texture" id=10] +[ext_resource path="res://addons/dialogic/Editor/DocumentationViewer/DocumentationViewer.tscn" type="PackedScene" id=11] +[ext_resource path="res://addons/dialogic/Editor/ValueEditor/ValueEditor.tscn" type="PackedScene" id=12] +[ext_resource path="res://addons/dialogic/Images/Toolbar/add-theme.svg" type="Texture" id=13] +[ext_resource path="res://addons/dialogic/Editor/MasterTree/MasterTree.tscn" type="PackedScene" id=35] + +[sub_resource type="Image" id=9] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 9 ) +size = Vector2( 16, 16 ) + +[sub_resource type="InputEventKey" id=7] +scancode = 16777252 + +[sub_resource type="ShortCut" id=8] +shortcut = SubResource( 7 ) + +[sub_resource type="Image" id=10] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=4] +flags = 4 +flags = 4 +image = SubResource( 10 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxTexture" id=5] +texture = SubResource( 4 ) +region_rect = Rect2( 0, 0, 16, 16 ) +margin_left = 2.0 +margin_right = 2.0 +margin_top = 2.0 +margin_bottom = 2.0 + +[node name="EditorView" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +rect_min_size = Vector2( 0, 200 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ToolBar" type="HBoxContainer" parent="."] +anchor_right = 1.0 +margin_bottom = 24.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NewTimelineButton" type="Button" parent="ToolBar"] +modulate = Color( 0, 0, 0, 1 ) +margin_right = 28.0 +margin_bottom = 24.0 +hint_tooltip = "Add Timeline" +icon = ExtResource( 4 ) +flat = true + +[node name="NewCharactersButton" type="ToolButton" parent="ToolBar"] +modulate = Color( 0, 0, 0, 1 ) +self_modulate = Color( 0.870588, 0.870588, 0.870588, 1 ) +margin_left = 32.0 +margin_right = 60.0 +margin_bottom = 24.0 +hint_tooltip = "Add Character" +icon = ExtResource( 3 ) + +[node name="NewValueButton" type="Button" parent="ToolBar"] +modulate = Color( 0, 0, 0, 1 ) +margin_left = 64.0 +margin_right = 92.0 +margin_bottom = 24.0 +hint_tooltip = "Add Value" +icon = ExtResource( 5 ) +flat = true + +[node name="NewGlossaryEntryButton" type="Button" parent="ToolBar"] +modulate = Color( 0, 0, 0, 1 ) +margin_left = 96.0 +margin_right = 124.0 +margin_bottom = 24.0 +hint_tooltip = "Add Glossary Entry" +icon = ExtResource( 10 ) +flat = true +__meta__ = { +"_editor_description_": "" +} + +[node name="NewThemeButton" type="Button" parent="ToolBar"] +modulate = Color( 0, 0, 0, 1 ) +margin_left = 128.0 +margin_right = 156.0 +margin_bottom = 24.0 +hint_tooltip = "Add Theme" +icon = ExtResource( 13 ) +flat = true + +[node name="FoldTools" type="HBoxContainer" parent="ToolBar"] +visible = false +margin_left = 160.0 +margin_right = 348.0 +margin_bottom = 24.0 + +[node name="Label" type="Label" parent="ToolBar/FoldTools"] +visible = false +margin_top = 5.0 +margin_right = 59.0 +margin_bottom = 19.0 +text = " Fold " + +[node name="ButtonFold" type="ToolButton" parent="ToolBar/FoldTools"] +margin_left = 63.0 +margin_right = 91.0 +margin_bottom = 24.0 +icon = SubResource( 2 ) +align = 0 + +[node name="ButtonUnfold" type="ToolButton" parent="ToolBar/FoldTools"] +margin_left = 95.0 +margin_right = 123.0 +margin_bottom = 24.0 +icon = SubResource( 2 ) +align = 0 + +[node name="PlayTimeline" type="ToolButton" parent="ToolBar/FoldTools"] +self_modulate = Color( 0.870588, 0.870588, 0.870588, 1 ) +margin_left = 127.0 +margin_right = 188.0 +margin_bottom = 24.0 +mouse_default_cursor_shape = 2 +shortcut = SubResource( 8 ) +text = "Play Timeline" +icon = SubResource( 2 ) + +[node name="Spacer" type="Control" parent="ToolBar"] +margin_left = 160.0 +margin_right = 747.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="Web" type="ToolButton" parent="ToolBar"] +self_modulate = Color( 0.870588, 0.870588, 0.870588, 1 ) +margin_left = 751.0 +margin_right = 835.0 +margin_bottom = 24.0 +mouse_default_cursor_shape = 2 +text = "Website" +icon = SubResource( 2 ) + +[node name="Docs" type="ToolButton" parent="ToolBar"] +self_modulate = Color( 0.870588, 0.870588, 0.870588, 1 ) +margin_left = 839.0 +margin_right = 900.0 +margin_bottom = 24.0 +mouse_default_cursor_shape = 2 +text = "Help" +icon = SubResource( 2 ) + +[node name="Version" type="Label" parent="ToolBar"] +self_modulate = Color( 1, 1, 1, 0.631373 ) +margin_left = 904.0 +margin_top = 5.0 +margin_right = 1024.0 +margin_bottom = 19.0 +text = "Dialogic v1.4 - DEV" + +[node name="DocumentationNavigation" type="HBoxContainer" parent="ToolBar"] +visible = false +margin_left = 980.0 +margin_right = 1024.0 +margin_bottom = 32.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VSeparator" type="VSeparator" parent="ToolBar/DocumentationNavigation"] +margin_right = 4.0 +margin_bottom = 40.0 + +[node name="Previous" type="Button" parent="ToolBar/DocumentationNavigation"] +margin_right = 22.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 22, 22 ) +focus_mode = 0 +disabled = true +icon = SubResource( 2 ) +flat = true +expand_icon = true + +[node name="Next" type="Button" parent="ToolBar/DocumentationNavigation"] +margin_left = 22.0 +margin_right = 44.0 +margin_bottom = 32.0 +rect_min_size = Vector2( 22, 22 ) +focus_mode = 0 +disabled = true +icon = SubResource( 2 ) +flat = true +expand_icon = true + +[node name="MainPanel" type="HSplitContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_top = 38.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MasterTreeContainer" type="VBoxContainer" parent="MainPanel"] +margin_right = 150.0 +margin_bottom = 562.0 + +[node name="FilterMasterTreeEdit" type="LineEdit" parent="MainPanel/MasterTreeContainer"] +margin_right = 150.0 +margin_bottom = 26.0 +clear_button_enabled = true +right_icon = SubResource( 2 ) +placeholder_text = "Filter" + +[node name="MasterTree" parent="MainPanel/MasterTreeContainer" instance=ExtResource( 35 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 30.0 +margin_right = 150.0 +margin_bottom = 562.0 +size_flags_vertical = 3 + +[node name="TimelineEditor" parent="MainPanel" instance=ExtResource( 2 )] +visible = false + +[node name="CharacterEditor" parent="MainPanel" instance=ExtResource( 7 )] +visible = false + +[node name="GlossaryEntryEditor" parent="MainPanel" instance=ExtResource( 9 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 162.0 +margin_right = 1024.0 +margin_bottom = 562.0 + +[node name="ValueEditor" parent="MainPanel" instance=ExtResource( 12 )] +visible = false + +[node name="ThemeEditor" parent="MainPanel" instance=ExtResource( 8 )] +visible = false + +[node name="SettingsEditor" parent="MainPanel" instance=ExtResource( 6 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 192.0 +margin_right = 1253.0 +margin_bottom = 661.0 + +[node name="DocumentationViewer" parent="MainPanel" instance=ExtResource( 11 )] +visible = false +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 162.0 +margin_right = 1024.0 +margin_bottom = 562.0 +custom_styles/panel = SubResource( 5 ) + +[node name="Empty" type="CenterContainer" parent="MainPanel"] +margin_left = 162.0 +margin_right = 1024.0 +margin_bottom = 562.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="MainPanel/Empty"] +margin_left = 291.0 +margin_top = 274.0 +margin_right = 571.0 +margin_bottom = 288.0 + +[node name="Label" type="Label" parent="MainPanel/Empty/VBoxContainer"] +margin_right = 280.0 +margin_bottom = 14.0 +text = "Select or create an element to start working" + +[node name="RemoveConfirmation" type="ConfirmationDialog" parent="."] +margin_right = 325.0 +margin_bottom = 88.0 +rect_min_size = Vector2( 250, 87.5 ) +window_title = "Be sure you want to delete!" +dialog_text = "Are you sure you want to remove this [resource]? +(Can't be restored)" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RemoveFolderConfirmation" type="ConfirmationDialog" parent="."] +margin_right = 325.0 +margin_bottom = 88.0 +rect_min_size = Vector2( 250, 87.5 ) +window_title = "Be sure you want to delete this folder!" +dialog_text = "Are you sure you want to remove this folder and all the items contained in it? +(Can't be restored)" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/AudioEvent.tscn b/project/addons/dialogic/Editor/Events/AudioEvent.tscn new file mode 100644 index 0000000..985d25d --- /dev/null +++ b/project/addons/dialogic/Editor/Events/AudioEvent.tscn @@ -0,0 +1,129 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioFilePicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioPicker.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg" type="Texture" id=5] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=6] + +[node name="AudioEvent" instance=ExtResource( 1 )] +margin_right = -705.0 +margin_bottom = 44.0 +event_name = "Audio Event" +event_data = { +"audio": "play", +"audio_bus": "Master", +"event_id": "dialogic_030", +"event_name": "AudioEvent", +"file": "", +"volume": 0.0 +} +event_color = Color( 0.988235, 0.396078, 0.0784314, 1 ) +event_icon = ExtResource( 5 ) +header_scene = ExtResource( 2 ) +body_scene = ExtResource( 3 ) +expand_on_default = false +help_page_path = "res://addons/dialogic/Documentation/Content/Events/030.md" +event_category = 3 +sorting_index = 0 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 404.0 +margin_bottom = 44.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 404.0 +margin_bottom = 44.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 398.0 +margin_bottom = 38.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 388.0 +margin_bottom = 32.0 + +[node name="CenterContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="0"] +margin_bottom = 32.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.988235, 0.396078, 0.0784314, 1 ) +margin_top = 16.0 +margin_bottom = 16.0 + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 5 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_top = 9.0 +margin_right = 76.0 +margin_bottom = 23.0 +text = "Audio Event" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 76.0 +margin_right = 344.0 +margin_bottom = 32.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 344.0 +margin_top = 1.0 +margin_right = 388.0 +margin_bottom = 31.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 388.0 +margin_right = 388.0 +margin_bottom = 32.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +margin_left = 401.0 +margin_right = 431.0 +icon = SubResource( 2 ) + +[node name="Body" parent="PanelContainer/MarginContainer/VBoxContainer" index="1"] +margin_bottom = 62.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +margin_bottom = 28.0 +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 6 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/BackgroundMusic.tscn b/project/addons/dialogic/Editor/Events/BackgroundMusic.tscn new file mode 100644 index 0000000..61dfffa --- /dev/null +++ b/project/addons/dialogic/Editor/Events/BackgroundMusic.tscn @@ -0,0 +1,113 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioPickerComplex.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/background-music.svg" type="Texture" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioFilePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=6] + +[node name="BackgroundMusic" instance=ExtResource( 2 )] +event_name = "Background Music" +event_data = { +"audio_bus": "Master", +"background-music": "play", +"event_id": "dialogic_031", +"event_name": "BackgroundMusic", +"fade_length": 1.0, +"file": "", +"volume": 0 +} +event_color = Color( 0.988235, 0.396078, 0.0784314, 1 ) +event_icon = ExtResource( 3 ) +header_scene = ExtResource( 4 ) +body_scene = ExtResource( 1 ) +expand_on_default = false +help_page_path = "res://addons/dialogic/Documentation/Content/Events/030.md" +event_category = 3 +sorting_index = 1 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 444.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 444.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 438.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 428.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.988235, 0.396078, 0.0784314, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 3 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 116.0 +text = "Background Music" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 116.0 +margin_right = 384.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 384.0 +margin_top = 17.0 +margin_right = 428.0 +margin_bottom = 47.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 428.0 +margin_right = 428.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +icon = SubResource( 2 ) + +[node name="Body" parent="PanelContainer/MarginContainer/VBoxContainer" index="1"] +margin_bottom = 66.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +margin_bottom = 32.0 +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 6 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/CallNode.tscn b/project/addons/dialogic/Editor/Events/CallNode.tscn new file mode 100644 index 0000000..198c2ea --- /dev/null +++ b/project/addons/dialogic/Editor/Events/CallNode.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/call-node.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/CallNode/CallNodePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="CallNode" instance=ExtResource( 2 )] +event_name = "Call Node" +event_data = { +"call_node": { +"arguments": [ ], +"method_name": "", +"target_node_path": "" +}, +"event_id": "dialogic_042" +} +event_color = Color( 0.0470588, 0.647059, 0.921569, 1 ) +event_icon = ExtResource( 1 ) +body_scene = ExtResource( 4 ) +expand_on_default = false +help_page_path = "res://addons/dialogic/Documentation/Content/Events/042.md" +event_category = 4 +sorting_index = 2 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 131.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 131.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 125.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 115.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0470588, 0.647059, 0.921569, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 61.0 +text = "Call Node" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 61.0 +margin_right = 71.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 71.0 +margin_top = 17.0 +margin_right = 115.0 +margin_bottom = 47.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 115.0 +margin_right = 115.0 + +[node name="Body" parent="PanelContainer/MarginContainer/VBoxContainer" index="1"] +margin_bottom = 88.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +margin_bottom = 54.0 +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/ChangeBackground.tscn b/project/addons/dialogic/Editor/Events/ChangeBackground.tscn new file mode 100644 index 0000000..3309e7a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/ChangeBackground.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Images/BackgroundPreview.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-background.svg" type="Texture" id=6] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Images/BackgroundPicker.tscn" type="PackedScene" id=7] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="ChangeBackground" instance=ExtResource( 4 )] +event_name = "Change Background" +event_data = { +"background": "", +"event_id": "dialogic_021" +} +event_color = Color( 0.964706, 0.239216, 0.403922, 1 ) +event_icon = ExtResource( 6 ) +header_scene = ExtResource( 7 ) +body_scene = ExtResource( 1 ) +expand_on_default = false +event_category = 3 +sorting_index = 3 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 395.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 395.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 389.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 379.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.964706, 0.239216, 0.403922, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 6 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 124.0 +text = "Change Background" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 124.0 +margin_right = 379.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +margin_left = 535.0 +margin_right = 587.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 379.0 +margin_right = 379.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +margin_left = 924.0 +margin_right = 954.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/ChangeScene.tscn b/project/addons/dialogic/Editor/Events/ChangeScene.tscn new file mode 100644 index 0000000..ec83b33 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/ChangeScene.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg" type="Texture" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/ScenePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="ChangeScene" instance=ExtResource( 1 )] +event_name = "Change Scene" +event_data = { +"change_scene": "", +"event_id": "dialogic_041" +} +event_color = Color( 0.0470588, 0.647059, 0.921569, 1 ) +event_icon = ExtResource( 3 ) +header_scene = ExtResource( 4 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/041.md" +event_category = 4 +sorting_index = 1 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 355.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 355.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 349.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 339.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0470588, 0.647059, 0.921569, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 3 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 88.0 +text = "Change Scene" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 88.0 +margin_right = 339.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 339.0 +margin_right = 339.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/ChangeTimeline.tscn b/project/addons/dialogic/Editor/Events/ChangeTimeline.tscn new file mode 100644 index 0000000..0f577bf --- /dev/null +++ b/project/addons/dialogic/Editor/Events/ChangeTimeline.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg" type="Texture" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/TimelinePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[node name="ChangeTimeline" instance=ExtResource( 1 )] +event_name = "Change Timeline" +event_data = { +"change_timeline": "", +"event_id": "dialogic_020" +} +event_color = Color( 0.0705882, 0.717647, 0.415686, 1 ) +event_icon = ExtResource( 3 ) +header_scene = ExtResource( 4 ) +event_category = 2 +sorting_index = 0 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 361.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 361.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 355.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 345.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0705882, 0.717647, 0.415686, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 106.0 +text = "Change Timeline" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 106.0 +margin_right = 345.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 345.0 +margin_right = 345.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 4 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/Character.tscn b/project/addons/dialogic/Editor/Events/Character.tscn new file mode 100644 index 0000000..9b2e0fd --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Character.tscn @@ -0,0 +1,123 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/CharacterAction.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/CharacterActionSettings.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/character.svg" type="Texture" id=5] + +[sub_resource type="Image" id=1] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 1 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=3] + +[node name="Character" instance=ExtResource( 2 )] +event_name = "Character" +event_data = { +"animation": "[Default]", +"animation_length": 0.0, +"change_mirror_portrait": false, +"change_z_index": false, +"character": "", +"event_id": "dialogic_002", +"mirror_portrait": false, +"portrait": "", +"portrait_definition": "", +"position": { +"0": false, +"1": false, +"2": false, +"3": false, +"4": false +}, +"type": 0, +"z_index": 0 +} +event_color = Color( 0.0705882, 0.717647, 0.415686, 1 ) +event_icon = ExtResource( 5 ) +header_scene = ExtResource( 3 ) +body_scene = ExtResource( 4 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/002.md" +sorting_index = 1 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 370.0 +margin_bottom = 104.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 370.0 +margin_bottom = 104.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 364.0 +margin_bottom = 98.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 354.0 +margin_bottom = 32.0 + +[node name="CenterContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="0"] +margin_bottom = 32.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0470588, 0.647059, 0.921569, 1 ) +margin_top = 16.0 +margin_bottom = 16.0 + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 5 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 2 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_top = 9.0 +margin_right = 60.0 +margin_bottom = 23.0 +text = "Character" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 60.0 +margin_right = 310.0 +margin_bottom = 32.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 310.0 +margin_top = 1.0 +margin_right = 354.0 +margin_bottom = 31.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 354.0 +margin_right = 354.0 +margin_bottom = 32.0 + +[node name="Body" parent="PanelContainer/MarginContainer/VBoxContainer" index="1"] +visible = true +margin_left = 0.0 +margin_top = 36.0 +margin_right = 354.0 +margin_bottom = 92.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +margin_top = 0.0 +margin_right = 354.0 +margin_bottom = 56.0 +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 3 ) +items = [ "Documentation", SubResource( 2 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 2 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 2 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 2 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/Choice.tscn b/project/addons/dialogic/Editor/Events/Choice.tscn new file mode 100644 index 0000000..02e2687 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Choice.tscn @@ -0,0 +1,97 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/choice.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/ChoicePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[sub_resource type="Image" id=6] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 6 ) +size = Vector2( 16, 16 ) + +[node name="Choice" instance=ExtResource( 2 )] +event_name = "Choice" +event_data = { +"choice": "", +"condition": "", +"definition": "", +"event_id": "dialogic_011", +"value": "" +} +event_color = Color( 0.619608, 0.466667, 0.92549, 1 ) +event_icon = ExtResource( 1 ) +header_scene = ExtResource( 4 ) +expand_on_default = false +needs_indentation = true +help_page_path = "res://addons/dialogic/Documentation/Content/Events/011.md" +event_category = 1 +sorting_index = 1 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 320.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 320.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 314.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 304.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.619608, 0.466667, 0.92549, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +visible = true +hint_tooltip = "This event needs a question event around it!" + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 43.0 +text = "Choice" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 43.0 +margin_right = 304.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 304.0 +margin_right = 304.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +icon = SubResource( 2 ) + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/CloseDialog.tscn b/project/addons/dialogic/Editor/Events/CloseDialog.tscn new file mode 100644 index 0000000..4388e3a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/CloseDialog.tscn @@ -0,0 +1,69 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg" type="Texture" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Numbers/TransitonLengthPicker.tscn" type="PackedScene" id=4] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[node name="CloseDialog" instance=ExtResource( 1 )] +event_name = "Close Dialog" +event_data = { +"event_id": "dialogic_022", +"transition_duration": 1.0 +} +event_color = Color( 0.941176, 0.266667, 0.219608, 1 ) +event_icon = ExtResource( 2 ) +header_scene = ExtResource( 4 ) +event_category = 2 +sorting_index = 4 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 300.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 300.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 294.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 284.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.941176, 0.266667, 0.219608, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 2 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 79.0 +text = "Close Dialog" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 79.0 +margin_right = 284.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 284.0 +margin_right = 284.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 4 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/Condition.tscn b/project/addons/dialogic/Editor/Events/Condition.tscn new file mode 100644 index 0000000..348beb6 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Condition.tscn @@ -0,0 +1,90 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/condition.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/ConditionPicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[sub_resource type="Image" id=6] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 6 ) +size = Vector2( 16, 16 ) + +[node name="Condition" instance=ExtResource( 2 )] +event_name = "Condition" +event_data = { +"condition": "", +"definition": "", +"event_id": "dialogic_012", +"value": "" +} +event_color = Color( 0.619608, 0.466667, 0.92549, 1 ) +event_icon = ExtResource( 1 ) +header_scene = ExtResource( 4 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/012.md" +show_name_in_timeline = false +event_category = 1 +sorting_index = 2 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 370.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 370.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 364.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 354.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.619608, 0.466667, 0.92549, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 354.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 146.0 +margin_right = 210.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +margin_left = 354.0 +margin_right = 354.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +icon = SubResource( 2 ) + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/DummyEvent.tscn b/project/addons/dialogic/Editor/Events/DummyEvent.tscn new file mode 100644 index 0000000..3427a0f --- /dev/null +++ b/project/addons/dialogic/Editor/Events/DummyEvent.tscn @@ -0,0 +1,75 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/DummyEventDataShower.tscn" type="PackedScene" id=2] + +[sub_resource type="StyleBoxEmpty" id=7] + +[sub_resource type="Image" id=8] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=6] +flags = 4 +flags = 4 +image = SubResource( 8 ) +size = Vector2( 16, 16 ) + +[node name="DummyEvent" instance=ExtResource( 1 )] +event_name = "Event couldn't be found. The data will be preserved in this dummy." +event_data = { +"event_id": "" +} +event_color = Color( 1, 0.278431, 0.447059, 1 ) +body_scene = ExtResource( 2 ) +expand_on_default = false + +[node name="PanelContainer" parent="." index="1"] +margin_right = 497.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 497.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 491.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 481.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 1, 0.278431, 0.447059, 1 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 427.0 +text = "Event couldn't be found. The data will be preserved in this dummy." + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 427.0 +margin_right = 437.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 437.0 +margin_top = 17.0 +margin_right = 481.0 +margin_bottom = 47.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 481.0 +margin_right = 481.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +margin_left = 924.0 +margin_right = 954.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 7 ) +items = [ "Documentation", SubResource( 6 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 6 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 6 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 6 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/EmitSignal.tscn b/project/addons/dialogic/Editor/Events/EmitSignal.tscn new file mode 100644 index 0000000..18c72ac --- /dev/null +++ b/project/addons/dialogic/Editor/Events/EmitSignal.tscn @@ -0,0 +1,73 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/SignalArgumentPicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=3] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="EmitSignal" instance=ExtResource( 3 )] +event_name = "Emit Signal" +event_data = { +"emit_signal": "", +"event_id": "dialogic_040" +} +event_color = Color( 0.0470588, 0.647059, 0.921569, 1 ) +event_icon = ExtResource( 1 ) +header_scene = ExtResource( 2 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/040.md" +event_category = 4 +sorting_index = 0 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 457.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 457.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 451.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 441.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0470588, 0.647059, 0.921569, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 70.0 +text = "Emit Signal" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 70.0 +margin_right = 441.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 441.0 +margin_right = 441.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/EndBranch.tscn b/project/addons/dialogic/Editor/Events/EndBranch.tscn new file mode 100644 index 0000000..9477115 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/EndBranch.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg" type="Texture" id=5] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[sub_resource type="Image" id=6] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 6 ) +size = Vector2( 16, 16 ) + +[node name="EndBranch" instance=ExtResource( 1 )] +event_name = "End Branch" +event_data = { +"event_id": "dialogic_013" +} +event_color = Color( 0.619608, 0.466667, 0.92549, 1 ) +event_icon = ExtResource( 5 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/013.md" +event_category = 1 +sorting_index = 3 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.619608, 0.466667, 0.92549, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 5 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 71.0 +text = "End Branch" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 71.0 +margin_right = 81.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 81.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +margin_left = 924.0 +margin_right = 954.0 +icon = SubResource( 2 ) + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/GoTo Event.tscn b/project/addons/dialogic/Editor/Events/GoTo Event.tscn new file mode 100644 index 0000000..365a7cc --- /dev/null +++ b/project/addons/dialogic/Editor/Events/GoTo Event.tscn @@ -0,0 +1,70 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/GoTo Selector.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/go-to.svg" type="Texture" id=5] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[node name="GoTo Event" instance=ExtResource( 1 )] +event_name = "Go to" +event_data = { +"anchor_id": "", +"event_id": "dialogic_016" +} +event_color = Color( 0.0705882, 0.717647, 0.415686, 1 ) +event_icon = ExtResource( 5 ) +header_scene = ExtResource( 4 ) +expand_on_default = false +event_category = 2 +sorting_index = 2 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 209.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 209.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 203.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 193.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0705882, 0.717647, 0.415686, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 5 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 35.0 +text = "Go to" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 35.0 +margin_right = 193.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 193.0 +margin_right = 193.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 4 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/LabelEvent.tscn b/project/addons/dialogic/Editor/Events/LabelEvent.tscn new file mode 100644 index 0000000..4e13b1a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/LabelEvent.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/LabelSetter.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/label.svg" type="Texture" id=5] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[node name="LabelEvent" instance=ExtResource( 2 )] +event_name = "Label" +event_data = { +"event_id": "dialogic_015", +"id": "anchor-1634488067", +"index": 0, +"name": "" +} +event_color = Color( 0.0705882, 0.717647, 0.415686, 1 ) +event_icon = ExtResource( 5 ) +header_scene = ExtResource( 3 ) +expand_on_default = false +event_category = 2 +sorting_index = 1 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 274.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 274.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 268.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 258.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0705882, 0.717647, 0.415686, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 5 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 34.0 +text = "Label" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 34.0 +margin_right = 258.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 258.0 +margin_right = 258.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 4 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/NoSkipEvent.tscn b/project/addons/dialogic/Editor/Events/NoSkipEvent.tscn new file mode 100644 index 0000000..aa87cd3 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/NoSkipEvent.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/NoSkip/NoSkipPart.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg" type="Texture" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=3] + +[node name="NoSkipEvent" instance=ExtResource( 4 )] +event_name = "No Skip" +event_data = { +"block_input": true, +"event_id": "dialogic_050", +"wait_time": 0.0 +} +event_color = Color( 0.92549, 0.0941176, 0.756863, 1 ) +event_icon = ExtResource( 3 ) +body_scene = ExtResource( 2 ) +expand_on_default = false +event_category = 2 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 358.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 358.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 352.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 342.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.92549, 0.0941176, 0.756863, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 3 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 2 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 48.0 +text = "No Skip" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 48.0 +margin_right = 58.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 58.0 +margin_top = 17.0 +margin_right = 102.0 +margin_bottom = 47.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 102.0 +margin_right = 342.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 3 ) +items = [ "Documentation", SubResource( 2 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 2 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 2 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 2 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/AudioFilePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Audio/AudioFilePicker.tscn new file mode 100644 index 0000000..4bb4e62 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/AudioFilePicker.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/FilePicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioFilePicker.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres" type="StyleBox" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres" type="StyleBox" id=4] + +[sub_resource type="StyleBoxEmpty" id=3] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[node name="AudioFilePicker" type="HBoxContainer"] +margin_right = 181.0 +margin_bottom = 22.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FilePicker" parent="." instance=ExtResource( 1 )] +margin_top = 0.0 +margin_right = 162.0 +margin_bottom = 22.0 +Mode = "Audio" + +[node name="ButtonPreviewPlay" type="Button" parent="."] +margin_left = 166.0 +margin_right = 188.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +custom_styles/hover = ExtResource( 3 ) +custom_styles/pressed = ExtResource( 3 ) +custom_styles/focus = SubResource( 3 ) +custom_styles/normal = ExtResource( 4 ) +icon = SubResource( 2 ) + +[node name="AudioPreview" type="AudioStreamPlayer" parent="."] diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/AudioPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Audio/AudioPicker.tscn new file mode 100644 index 0000000..155ba8e --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/AudioPicker.tscn @@ -0,0 +1,151 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SectionPanel.tres" type="StyleBox" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioFilePicker.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=4] + +[node name="AudioPicker" type="PanelContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -718.0 +margin_bottom = -580.0 +theme = ExtResource( 4 ) +custom_styles/panel = ExtResource( 2 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +event_name = "AudioEvent" + +[node name="VBox" type="VBoxContainer" parent="."] +margin_left = 6.0 +margin_top = 5.0 +margin_right = 300.0 +margin_bottom = 66.0 + +[node name="AudioFilePicker" parent="VBox" instance=ExtResource( 3 )] +visible = false +margin_right = 294.0 + +[node name="adv_settings" type="HBoxContainer" parent="VBox"] +margin_right = 294.0 +margin_bottom = 61.0 +custom_constants/separation = 8 + +[node name="AudioVolume" type="PanelContainer" parent="VBox/adv_settings"] +margin_right = 88.0 +margin_bottom = 61.0 +custom_styles/panel = ExtResource( 2 ) + +[node name="VBox" type="VBoxContainer" parent="VBox/adv_settings/AudioVolume"] +margin_left = 6.0 +margin_top = 5.0 +margin_right = 82.0 +margin_bottom = 57.0 + +[node name="Label" type="Label" parent="VBox/adv_settings/AudioVolume/VBox"] +margin_right = 76.0 +margin_bottom = 14.0 +text = "Volume:" + +[node name="Volume" type="SpinBox" parent="VBox/adv_settings/AudioVolume/VBox"] +margin_top = 18.0 +margin_right = 76.0 +margin_bottom = 52.0 +min_value = -80.0 +max_value = 24.0 +step = 0.01 +suffix = "dB" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AudioBus" type="PanelContainer" parent="VBox/adv_settings"] +margin_left = 96.0 +margin_right = 181.0 +margin_bottom = 61.0 +custom_styles/panel = ExtResource( 2 ) + +[node name="VBox" type="VBoxContainer" parent="VBox/adv_settings/AudioBus"] +margin_left = 6.0 +margin_top = 5.0 +margin_right = 79.0 +margin_bottom = 57.0 + +[node name="Label" type="Label" parent="VBox/adv_settings/AudioBus/VBox"] +margin_right = 73.0 +margin_bottom = 14.0 +text = "AudioBus:" + +[node name="BusSelector" type="OptionButton" parent="VBox/adv_settings/AudioBus/VBox"] +margin_top = 18.0 +margin_right = 73.0 +margin_bottom = 38.0 +size_flags_vertical = 5 +text = "Master" +items = [ "Master", null, false, 0, null ] +selected = 0 + +[node name="AudioRegion" type="PanelContainer" parent="VBox/adv_settings"] +visible = false +margin_left = 187.0 +margin_right = 419.0 +margin_bottom = 51.0 +custom_styles/panel = ExtResource( 2 ) + +[node name="VBox" type="VBoxContainer" parent="VBox/adv_settings/AudioRegion"] +margin_left = 6.0 +margin_top = 5.0 +margin_right = 226.0 +margin_bottom = 47.0 + +[node name="Label" type="Label" parent="VBox/adv_settings/AudioRegion/VBox"] +margin_right = 220.0 +margin_bottom = 14.0 +text = "Audio-region:" + +[node name="HBox" type="HBoxContainer" parent="VBox/adv_settings/AudioRegion/VBox"] +margin_top = 18.0 +margin_right = 220.0 +margin_bottom = 42.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="StartAtLabel" type="Label" parent="VBox/adv_settings/AudioRegion/VBox/HBox"] +margin_top = 5.0 +margin_right = 33.0 +margin_bottom = 19.0 +text = "Start:" + +[node name="StartAt" type="SpinBox" parent="VBox/adv_settings/AudioRegion/VBox/HBox"] +margin_left = 37.0 +margin_right = 111.0 +margin_bottom = 24.0 +hint_tooltip = "Leave both at 0 to use the whole file." +max_value = 9999.0 +step = 0.1 +suffix = "sec" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="StopAtLabel" type="Label" parent="VBox/adv_settings/AudioRegion/VBox/HBox"] +margin_left = 115.0 +margin_top = 5.0 +margin_right = 142.0 +margin_bottom = 19.0 +text = "End:" + +[node name="StopAt" type="SpinBox" parent="VBox/adv_settings/AudioRegion/VBox/HBox"] +margin_left = 146.0 +margin_right = 220.0 +margin_bottom = 24.0 +hint_tooltip = "Leave both at 0 to use the whole file." +max_value = 9999.0 +step = 0.1 +suffix = "sec" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/AudioPickerComplex.tscn b/project/addons/dialogic/Editor/Events/Parts/Audio/AudioPickerComplex.tscn new file mode 100644 index 0000000..218a872 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/AudioPickerComplex.tscn @@ -0,0 +1,43 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPickerComplex.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioPicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=3] + +[node name="AudioPickerComplex" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +theme = ExtResource( 3 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBox" type="VBoxContainer" parent="."] +margin_right = 193.0 +margin_bottom = 108.0 + +[node name="Fade" type="HBoxContainer" parent="VBox"] +margin_right = 193.0 +margin_bottom = 34.0 + +[node name="FadeLengthLabel" type="Label" parent="VBox/Fade"] +margin_top = 10.0 +margin_right = 87.0 +margin_bottom = 24.0 +text = " Fade-length:" + +[node name="FadeLength" type="SpinBox" parent="VBox/Fade"] +margin_left = 91.0 +margin_right = 167.0 +margin_bottom = 34.0 +step = 0.01 +suffix = "s" + +[node name="AudioPicker" parent="VBox" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 38.0 +margin_right = 193.0 +margin_bottom = 108.0 +event_name = "Background Music" diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioFilePicker.gd b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioFilePicker.gd new file mode 100644 index 0000000..4d50f6b --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioFilePicker.gd @@ -0,0 +1,59 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var file_picker = $FilePicker +onready var preview_button = $ButtonPreviewPlay +onready var audio_preview = $AudioPreview + +# used to connect the signals +func _ready(): + file_picker.connect("data_changed", self, "_on_FilePicker_data_changed") + preview_button.connect("pressed", self, "_on_PreviewButton_pressed") + audio_preview.connect("finished", self, '_on_AudioPreview_finished') + preview_button.icon = get_icon("Play", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + file_picker.load_data(event_data) + preview_button.visible = !event_data['file'].empty() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +func _on_FilePicker_data_changed(data): + event_data = data + + preview_button.visible = !event_data['file'].empty() + # informs the parent about the changes! + data_changed() + +func _on_PreviewButton_pressed(): + if audio_preview.is_playing(): + audio_preview.stop() + else: + audio_preview.stream = load(event_data['file']) + audio_preview.bus = event_data['audio_bus'] + audio_preview.volume_db = event_data.get('volume', 0) + if event_data.has('start_time'): + audio_preview.play(event_data['start_time']) + else: + audio_preview.play() + preview_button.icon = get_icon("Stop", "EditorIcons") + +func _on_AudioPreview_finished(): + preview_button.icon = get_icon("Play", "EditorIcons") + + +func _process(_delta): + #Will automatically stop playing when reaching stop_time + if(audio_preview.playing && event_data.has('stop_time') && audio_preview.get_playback_position() >= event_data['stop_time']): + audio_preview.stop() diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPicker.gd new file mode 100644 index 0000000..1524167 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPicker.gd @@ -0,0 +1,96 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +signal audio_loaded + +export (String) var event_name = "Audio Event" + +## node references +onready var file_picker := $VBox/AudioFilePicker + +onready var volume_input := $VBox/adv_settings/AudioVolume/VBox/Volume +onready var region_group := $VBox/adv_settings/AudioRegion +onready var start_at_input := $VBox/adv_settings/AudioRegion/VBox/HBox/StartAt +onready var stop_at_input := $VBox/adv_settings/AudioRegion/VBox/HBox/StopAt +onready var bus_selector := $VBox/adv_settings/AudioBus/VBox/BusSelector + +# used to connect the signals +func _ready(): + + # signals + file_picker.connect("data_changed", self, '_on_FilePicker_data_changed') + bus_selector.connect("item_selected", self, "_on_BusSelector_item_selected") + volume_input.connect("value_changed", self, "_on_Volume_value_changed") + start_at_input.connect("value_changed", self, "_on_StartAt_value_changed") + stop_at_input.connect("value_changed", self, "_on_StopAt_value_changed") + + # AudioBusPicker update + AudioServer.connect("bus_layout_changed", self, "update_bus_selector") + update_bus_selector() + + # file picker is here only used for text voice + file_picker.hide() + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + file_picker.load_data(data) + + # Now update the ui nodes to display the data. + if data.has('audio_bus'): + for idx in range(bus_selector.get_item_count()): + if bus_selector.get_item_text(idx) == data['audio_bus']: + bus_selector.select(idx) + + if data.has('volume'): + volume_input.value = data['volume'] + if data.has('start_time'): + start_at_input.value = data["start_time"] + if data.has('stop_time'): + stop_at_input.value = data["stop_time"] + + if not data.has("event_id"): + file_picker.show() + region_group.show() + + # TODO 2.0 delete this mess + if event_data.has('audio'): event_data['audio'] = 'play' + if event_data.has('background-music'): event_data['background-music'] = 'play' + +func get_preview(): + return '' + +func update_bus_selector(): + if bus_selector != null: + var previous_selected_bus_name = bus_selector.get_item_text(max(0, bus_selector.selected)) + + bus_selector.clear() + for i in range(AudioServer.bus_count): + var bus_name = AudioServer.get_bus_name(i) + bus_selector.add_item(bus_name) + + if previous_selected_bus_name == bus_name: + bus_selector.select(i) + +func _on_FilePicker_data_changed(data): + event_data['file'] = data['file'] + data_changed() + +func _on_BusSelector_item_selected(index): + event_data['audio_bus'] = bus_selector.get_item_text(index) + data_changed() + +func _on_Volume_value_changed(value): + event_data['volume'] = value + data_changed() + +func _on_StopAt_value_changed(value): + event_data['stop_time'] = value + data_changed() + +func _on_StartAt_value_changed(value): + event_data['start_time'] = value + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPickerComplex.gd b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPickerComplex.gd new file mode 100644 index 0000000..56f1a80 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_AudioPickerComplex.gd @@ -0,0 +1,42 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var audio_picker = $VBox/AudioPicker +onready var fade_length_input = $VBox/Fade/FadeLength + +# used to connect the signals +func _ready(): + audio_picker.connect("data_changed", self, "_on_AudioPicker_data_changed") + fade_length_input.connect("value_changed", self, "_on_FadeLength_value_changed") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + audio_picker.editor_reference = editor_reference + audio_picker.load_data(event_data) + + fade_length_input.value = event_data['fade_length'] + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return audio_picker.get_preview() + +func _on_AudioPicker_data_changed(data): + event_data = data + + # informs the parent about the changes! + data_changed() + +func _on_FadeLength_value_changed(value): + event_data['fade_length'] = value + audio_picker.load_data(event_data) + + # informs the parent about the changes! + data_changed() + diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_VoiceEditor.gd b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_VoiceEditor.gd new file mode 100644 index 0000000..48aff89 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/EventPart_VoiceEditor.gd @@ -0,0 +1,95 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + + +export(PackedScene) var audio_picker + +#onready var voices_container = $List/VoicesList +#onready var label_container = $List/Label +var audio_lines = 1 # how many lines does the text event has + + +func load_data(data): + .load_data(data) + + update_data() + +func repopulate() -> void: + for child in $List.get_children(): + child.queue_free() + + var settings = DialogicResources.get_settings_config() + #recraete audio pickers + for i in range(audio_lines): + var label = Label.new() + label.text = "Line "+str(i+1)+":" + label.size_flags_vertical = 0 + $List.add_child(label) + + var a_picker = audio_picker.instance() + a_picker.editor_reference = editor_reference + a_picker.event_name = "voice line" + a_picker.connect("data_changed", self, "_on_audio_picker_audio_loaded", [i]) + $List.add_child(a_picker) + + #loaded data + if event_data.has('voice_data'): + var voice_data = event_data['voice_data'] + if voice_data.has(str(i)): + var _d = voice_data[str(i)] + if _d.has('file'): + a_picker.load_data(_d) + continue + + a_picker.load_data({'file':'', 'audio_bus':settings.get_value("dialog", "text_event_audio_default_bus", "Master")}) + + +func _on_text_changed(text:String) -> void: + # This is called when the text has changed + # Are we adding new text events per new line ? + var settings_file = DialogicResources.get_settings_config() + + if not (settings_file.get_value("dialog", "new_lines", true)): + $Label.text = "Audio Picker:" + return + + var prev_lines = audio_lines + $Label.text = "Audio Pickers:" + audio_lines = max(1, len(text.split('\n'))) + + if prev_lines != audio_lines: + repopulate() + +#Since the nodes are now in a grid sharing indicies with lables, index must +#be multiplied by 2, then added an offset of 1 to get the requested node +func _get_audio_picker(index:int): + var data = $List.get_child(index * 2 + 1) + return data + +func _on_audio_picker_audio_loaded(data,index:int) -> void: + # update the data + if not event_data.has('voice_data'): + event_data['voice_data'] = {} + + event_data['voice_data'][str(index)] = data + + #load the data + load_data(event_data) + + # informs the parent about the data change + data_changed() + + +func update_data(): + if not event_data.has('voice_data'): + return + var keys = event_data['voice_data'].keys() + # This subroutine was already a hack before I got to it, so don't blame me. + # divide by two, again becouse the two merged nodes. + # reused _get_audio_picker wherein we multiply by two again :D + # - KvaGram + for i in range($List.get_child_count() / 2): + if keys.has(str(i)): + var data = event_data['voice_data'][str(i)] + #voices_container.get_child(i).load_data(data) + _get_audio_picker(i).load_data(data) diff --git a/project/addons/dialogic/Editor/Events/Parts/Audio/VoiceEditor.tscn b/project/addons/dialogic/Editor/Events/Parts/Audio/VoiceEditor.tscn new file mode 100644 index 0000000..2c67b9f --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Audio/VoiceEditor.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/EventPart_VoiceEditor.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/AudioPicker.tscn" type="PackedScene" id=2] + +[node name="VoiceEditor" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +audio_picker = ExtResource( 2 ) + +[node name="Label" type="Label" parent="."] +margin_right = 86.0 +margin_bottom = 14.0 +text = "Voice Picker :" + +[node name="List" type="GridContainer" parent="."] +margin_top = 18.0 +margin_right = 86.0 +margin_bottom = 18.0 +columns = 2 diff --git a/project/addons/dialogic/Editor/Events/Parts/CallNode/CallNodePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/CallNode/CallNodePicker.tscn new file mode 100644 index 0000000..b688272 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/CallNode/CallNodePicker.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/CallNode/EventPart_CallNodePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=4] + +[node name="CallNodePicker" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +theme = ExtResource( 4 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" parent="." instance=ExtResource( 2 )] +margin_top = 0.0 +margin_right = 782.0 +margin_bottom = 14.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "This event calls the function [Function Name] on the [Target Node] (use full path!). It also passes a number of arguments." + +[node name="Properties" type="HBoxContainer" parent="."] +margin_top = 18.0 +margin_right = 782.0 +margin_bottom = 45.0 +custom_constants/separation = 8 + +[node name="TargetNodeLabel" type="Label" parent="Properties"] +margin_top = 6.0 +margin_right = 81.0 +margin_bottom = 20.0 +text = "Target Node:" + +[node name="TargetNodeEdit" parent="Properties" instance=ExtResource( 3 )] +margin_left = 89.0 +margin_right = 329.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 240, 27 ) + +[node name="CallMethodLabel" type="Label" parent="Properties"] +margin_left = 337.0 +margin_top = 6.0 +margin_right = 432.0 +margin_bottom = 20.0 +text = "Method Name:" + +[node name="CallMethodEdit" parent="Properties" instance=ExtResource( 3 )] +margin_left = 440.0 +margin_right = 620.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 180, 27 ) + +[node name="ArgumentsLabel" type="Label" parent="Properties"] +margin_left = 628.0 +margin_top = 6.0 +margin_right = 698.0 +margin_bottom = 20.0 +text = "Arguments" + +[node name="ArgumentsSpinBox" type="SpinBox" parent="Properties"] +margin_left = 706.0 +margin_right = 782.0 +margin_bottom = 27.0 +max_value = 99.0 + +[node name="Arguments" type="VBoxContainer" parent="."] +margin_top = 49.0 +margin_right = 782.0 +margin_bottom = 49.0 +custom_constants/separation = 5 diff --git a/project/addons/dialogic/Editor/Events/Parts/CallNode/EventPart_CallNodePicker.gd b/project/addons/dialogic/Editor/Events/Parts/CallNode/EventPart_CallNodePicker.gd new file mode 100644 index 0000000..dda9f6d --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/CallNode/EventPart_CallNodePicker.gd @@ -0,0 +1,107 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var target_path_input = $Properties/TargetNodeEdit +onready var method_name_input = $Properties/CallMethodEdit +onready var argument_length = $Properties/ArgumentsSpinBox +onready var arguments_container = $Arguments + +# used to connect the signals +func _ready(): + target_path_input.connect("text_changed", self, "_on_TargetPathInput_text_changed") + method_name_input.connect("text_changed", self, "_on_MethodName_text_changed") + argument_length.connect("value_changed", self, "_on_AgrumentLength_value_changed") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + target_path_input.text = event_data['call_node']['target_node_path'] + method_name_input.text = event_data['call_node']['method_name'] + + for i in range(event_data['call_node']['arguments'].size()): + if (event_data['call_node']['arguments'][i] == null): + event_data['call_node']['arguments'][i] = '' + + argument_length.value = len(event_data['call_node']['arguments']) + + _create_argument_controls() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + if event_data['call_node']["target_node_path"] and event_data['call_node']['method_name']: + return 'Calls `'+event_data['call_node']['method_name']+ "` on node `"+event_data['call_node']["target_node_path"]+"` with an array with "+str(len( event_data['call_node']['arguments'])) +" items." + else: + return '' + +func _on_TargetPathInput_text_changed(text): + event_data['call_node']['target_node_path'] = text + + # informs the parent about the changes! + data_changed() + +func _on_MethodName_text_changed(text): + event_data['call_node']['method_name'] = text + + # informs the parent about the changes! + data_changed() + +func _on_AgrumentLength_value_changed(value): + event_data['call_node']['arguments'].resize(max(0, value)) + + for i in range(event_data['call_node']['arguments'].size()): + if (event_data['call_node']['arguments'][i] == null): + event_data['call_node']['arguments'][i] = '' + + _create_argument_controls() + + # informs the parent about the changes! + data_changed() + +func _on_argument_value_changed(value, arg_index): + if (arg_index < 0 or arg_index >= event_data['call_node']['arguments'].size()): + return + + event_data['call_node']['arguments'][arg_index] = str(value) + + # informs the parent about the changes! + data_changed() + + +# helpers +func _create_argument_controls(): + if (not event_data['call_node']['arguments'] is Array): + return + + # clear old + for c in arguments_container.get_children(): + arguments_container.remove_child(c) + c.queue_free() + + # create controls + var index = 0 + for a in event_data['call_node']['arguments']: + var container = HBoxContainer.new() + container.name = "Argument%s" % index + + var label = Label.new() + label.name = "IndexLabel" + label.text = "Argument %s:" % index + label.rect_min_size.x = 100 + container.add_child(label) + + var edit = LineEdit.new() + edit.name = "IndexValue" + edit.text = str(a) + edit.connect("text_changed", self, "_on_argument_value_changed", [ index ]) + edit.rect_min_size.x = 250 + container.add_child(edit) + + arguments_container.add_child(container) + + index += 1 diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/CharacterAction.tscn b/project/addons/dialogic/Editor/Events/Parts/Character/CharacterAction.tscn new file mode 100644 index 0000000..e036ce7 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/CharacterAction.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterAction.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/PositionPicker.tscn" type="PackedScene" id=4] + +[node name="CharacterAction" type="HBoxContainer"] +margin_right = 454.0 +margin_bottom = 30.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ActionTypePicker" parent="." instance=ExtResource( 1 )] +margin_top = 4.0 +margin_bottom = 26.0 + +[node name="CharacterAndPortraitPicker" parent="." instance=ExtResource( 3 )] +margin_left = 98.0 +margin_right = 193.0 +margin_bottom = 30.0 +size_flags_vertical = 4 + +[node name="PositionPicker" parent="." instance=ExtResource( 4 )] +margin_left = 197.0 +margin_right = 471.0 +size_flags_vertical = 4 diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/CharacterActionSettings.tscn b/project/addons/dialogic/Editor/Events/Parts/Character/CharacterActionSettings.tscn new file mode 100644 index 0000000..146b5c0 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/CharacterActionSettings.tscn @@ -0,0 +1,143 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterActionSettings.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=4] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="CharacterActionSettings" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +theme = ExtResource( 4 ) +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Animation" type="HBoxContainer" parent="."] +margin_right = 589.0 +margin_bottom = 24.0 + +[node name="Label" parent="Animation" instance=ExtResource( 2 )] +margin_top = 5.0 +margin_right = 70.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Animation:" + +[node name="AnimationPicker" parent="Animation" instance=ExtResource( 3 )] +margin_left = 74.0 +margin_right = 172.0 +margin_bottom = 24.0 + +[node name="Label2" parent="Animation" instance=ExtResource( 2 )] +margin_left = 176.0 +margin_top = 5.0 +margin_right = 223.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Length:" + +[node name="AnimationLength" type="SpinBox" parent="Animation"] +margin_left = 227.0 +margin_right = 303.0 +margin_bottom = 24.0 +step = 0.001 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label3" parent="Animation" instance=ExtResource( 2 )] +margin_left = 307.0 +margin_top = 5.0 +margin_right = 355.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Repeat:" + +[node name="Repeat" type="SpinBox" parent="Animation"] +margin_left = 359.0 +margin_right = 435.0 +margin_bottom = 24.0 +min_value = 1.0 +value = 1.0 +rounded = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label4" parent="Animation" instance=ExtResource( 2 )] +margin_left = 439.0 +margin_top = 5.0 +margin_right = 561.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Wait for animation:" + +[node name="WaitForAnimation" type="CheckBox" parent="Animation"] +margin_left = 565.0 +margin_right = 589.0 +margin_bottom = 24.0 + +[node name="Positioning" type="HBoxContainer" parent="."] +margin_top = 28.0 +margin_right = 589.0 +margin_bottom = 52.0 + +[node name="Label" parent="Positioning" instance=ExtResource( 2 )] +margin_top = 5.0 +margin_right = 52.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Z-index:" + +[node name="EnableZIndex" type="ToolButton" parent="Positioning"] +margin_left = 56.0 +margin_right = 84.0 +margin_bottom = 24.0 +toggle_mode = true +icon = SubResource( 2 ) + +[node name="Z_Index" type="SpinBox" parent="Positioning"] +margin_left = 88.0 +margin_right = 164.0 +margin_bottom = 24.0 +min_value = -100.0 +rounded = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label2" parent="Positioning" instance=ExtResource( 2 )] +margin_left = 168.0 +margin_top = 5.0 +margin_right = 227.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Mirrored:" + +[node name="EnableMirrored" type="ToolButton" parent="Positioning"] +margin_left = 231.0 +margin_right = 243.0 +margin_bottom = 24.0 +toggle_mode = true + +[node name="Mirrored" type="CheckBox" parent="Positioning"] +margin_left = 247.0 +margin_right = 271.0 +margin_bottom = 24.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/CharacterJoining.tscn b/project/addons/dialogic/Editor/Events/Parts/Character/CharacterJoining.tscn new file mode 100644 index 0000000..cc69e55 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/CharacterJoining.tscn @@ -0,0 +1,75 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterJoining.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/PositionPicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=3] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="CharacterJoining" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 389.0 +margin_bottom = 30.0 + +[node name="CharacterAndPortraitPicker" parent="HBox" instance=ExtResource( 3 )] +margin_right = 95.0 +margin_bottom = 30.0 + +[node name="PositionPicker" parent="HBox" instance=ExtResource( 2 )] +margin_left = 99.0 +margin_right = 357.0 +size_flags_vertical = 4 + +[node name="MirrorButton" type="ToolButton" parent="HBox"] +margin_left = 361.0 +margin_right = 389.0 +margin_bottom = 30.0 +hint_tooltip = "Mirrors the character" +toggle_mode = true +icon = SubResource( 2 ) + +[node name="NoCharacterContainer" type="HBoxContainer" parent="."] +visible = false +margin_top = 4.0 +margin_right = 399.0 +margin_bottom = 24.0 + +[node name="NoCharacterLabel1" type="Label" parent="NoCharacterContainer"] +margin_top = 3.0 +margin_right = 261.0 +margin_bottom = 17.0 +text = "You haven't created a character yet. Click" + +[node name="NoCharacterButton" type="Button" parent="NoCharacterContainer"] +margin_left = 265.0 +margin_right = 306.0 +margin_bottom = 20.0 +text = "here" + +[node name="NoCharacterLabel2" type="Label" parent="NoCharacterContainer"] +margin_left = 310.0 +margin_top = 3.0 +margin_right = 399.0 +margin_bottom = 17.0 +text = "to create one." diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterAction.gd b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterAction.gd new file mode 100644 index 0000000..af6ee80 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterAction.gd @@ -0,0 +1,84 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +## has an event_data variable that stores the current data!!! + +var join_icon = load("res://addons/dialogic/Images/Event Icons/character-join.svg") +var leave_icon = load("res://addons/dialogic/Images/Event Icons/character-leave.svg") +var update_icon = load("res://addons/dialogic/Images/Event Icons/character.svg") + +## node references +onready var action_picker = $ActionTypePicker +onready var character_portrait_picker = $CharacterAndPortraitPicker +onready var position_picker = $PositionPicker + +# used to connect the signals +func _ready(): + action_picker.connect("about_to_show", self, "_on_ActionTypePicker_about_to_show") + action_picker.get_popup().connect('index_pressed', self, "_on_ActionTypePicker_index_pressed") + character_portrait_picker.connect('data_changed', self, "_on_CharacterAndPortraitPicker_data_changed") + position_picker.connect('data_changed', self, "_on_PositionPicker_data_changed") + + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + match int(data.get('type', 0)): + 0: + action_picker.text = 'Join' + action_picker.custom_icon = join_icon + 1: + action_picker.text = 'Leave' + action_picker.custom_icon = leave_icon + 2: + action_picker.text = 'Update' + action_picker.custom_icon = update_icon + + position_picker.visible = data.get('type',0) != 1 and data.get('character', '') != '' + position_picker.load_data(data) + character_portrait_picker.load_data(data) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_ActionTypePicker_about_to_show(): + action_picker.get_popup().clear() + + action_picker.get_popup().add_icon_item(join_icon, "Join") + action_picker.get_popup().add_icon_item(leave_icon, "Leave") + action_picker.get_popup().add_icon_item(update_icon, "Update") + + +func _on_ActionTypePicker_index_pressed(index): + if index != event_data['type']: + if index == 0: + event_data['portrait'] = 'Default' + event_data['animation'] = '[Default]' + elif index == 1: + event_data['animation'] = '[Default]' + elif index == 2: + event_data['portrait'] = "(Don't change)" + event_data['type'] = index + + load_data(event_data) + + # informs the parent about the changes! + data_changed() + +func _on_CharacterAndPortraitPicker_data_changed(data): + event_data = data + + load_data(event_data) + + data_changed() + +func _on_PositionPicker_data_changed(data): + event_data = data + + data_changed() + diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterActionSettings.gd b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterActionSettings.gd new file mode 100644 index 0000000..20980ba --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterActionSettings.gd @@ -0,0 +1,163 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +var enable_icon = null +var disable_icon = null + + +## node references +onready var animation_picker = $Animation/AnimationPicker +onready var animation_length = $Animation/AnimationLength +onready var z_index_enable = $Positioning/EnableZIndex +onready var z_index = $Positioning/Z_Index +onready var mirrored_checkbox = $Positioning/Mirrored +onready var mirrored_checkbox_enable = $Positioning/EnableMirrored +onready var animation_repeat = $Animation/Repeat +onready var animation_wait_checkbox = $Animation/WaitForAnimation + +# used to connect the signals +func _ready(): + animation_picker.connect("about_to_show", self, "_on_AnimationPicker_about_to_show") + animation_picker.get_popup().connect("index_pressed", self, "_on_AnimationPicker_index_pressed") + animation_length.connect("value_changed", self, "_on_AnimationLength_value_changed") + z_index.connect("value_changed", self, "_on_ZIndex_value_changed") + z_index_enable.connect("toggled", self, "_on_ZIndexEnable_toggled") + mirrored_checkbox.connect('toggled', self, "_on_Mirrored_toggled") + mirrored_checkbox_enable.connect('toggled', self, "_on_MirroredEnabled_toggled") + animation_repeat.connect("value_changed", self, '_on_Repeat_value_changed') + animation_wait_checkbox.connect('toggled', self, 'on_WaitForAnimation_toggled') + enable_icon = get_icon("Edit", "EditorIcons") + disable_icon = get_icon("Reload", "EditorIcons") + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + $Positioning.visible = event_data.get('type',0) != 1 + if data['type'] == 0: + animation_picker.text = DialogicUtil.beautify_filename(event_data.get('animation', '[Default]')) + elif data['type'] == 1: + animation_picker.text = DialogicUtil.beautify_filename(event_data.get('animation', '[Default]')) + else: + animation_picker.text = DialogicUtil.beautify_filename(event_data.get('animation', '[No Animation]')) + + animation_picker.custom_icon = get_icon("Animation", "EditorIcons") if event_data['animation'] != "[No Animation]" else get_icon("GuiRadioUnchecked", "EditorIcons") + if event_data['animation'] == "[Default]": animation_picker.custom_icon = get_icon("Favorites", "EditorIcons") + animation_length.value = event_data.get('animation_length', 1) + animation_length.visible = event_data.get('animation', '') != "[Default]" + $Animation/Label2.visible = event_data.get('animation', '') != "[Default]" + animation_repeat.value = event_data.get('animation_repeat', 1) + animation_repeat.visible = int(data.get('type', 0)) == 2 + $Animation/Label3.visible = int(data.get('type', 0)) == 2 + animation_wait_checkbox.pressed = event_data.get('animation_wait', false) + + z_index.value = int(event_data.get('z_index', 0)) + mirrored_checkbox.pressed = event_data.get('mirror_portrait', false) + + # if the event is in UPDATE mode show the enablers + z_index_enable.visible = int(data.get('type', 0)) == 2 + mirrored_checkbox_enable.visible = int(data.get('type', 0)) == 2 + + z_index_enable.pressed = data.get('change_z_index', false) or int(data.get('type', 0)) != 2 + mirrored_checkbox_enable.pressed = data.get('change_mirror_portrait', false) or int(data.get('type', 0)) != 2 + + z_index.visible = z_index_enable.pressed + mirrored_checkbox.visible = mirrored_checkbox_enable.pressed + + z_index_enable.icon = enable_icon if not z_index_enable.pressed else disable_icon + mirrored_checkbox_enable.icon = enable_icon if not mirrored_checkbox_enable.pressed else disable_icon + + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_AnimationPicker_about_to_show(): + animation_picker.get_popup().clear() + var animations = DialogicAnimaResources.get_available_animations() + var idx = 0 + if event_data['type'] == 2: + animation_picker.get_popup().add_icon_item(get_icon("GuiRadioUnchecked", "EditorIcons"), "[No Animation]") + animation_picker.get_popup().set_item_metadata(idx, {'file': "[No Animation]"}) + idx += 1 + else: + animation_picker.get_popup().add_icon_item(get_icon("Favorites", "EditorIcons"), "[Default]") + animation_picker.get_popup().set_item_metadata(idx, {'file': "[Default]"}) + idx += 1 + for animation_name in animations: + if (event_data['type'] == 0 and '_in' in animation_name) \ + or (event_data['type'] == 1 and '_out' in animation_name) \ + or (event_data['type'] == 2 and not '_in' in animation_name and not '_out' in animation_name): + animation_picker.get_popup().add_icon_item(get_icon("Animation", "EditorIcons"), DialogicUtil.beautify_filename(animation_name)) + animation_picker.get_popup().set_item_metadata(idx, {'file': animation_name.get_file()}) + idx +=1 + + + +func _on_AnimationPicker_index_pressed(index): + event_data['animation'] = animation_picker.get_popup().get_item_metadata(index)['file'] + + animation_picker.custom_icon = get_icon("Animation", "EditorIcons") if event_data['animation'] != "[No Animation]" else get_icon("GuiRadioUnchecked", "EditorIcons") + if event_data['animation'] == "[Default]": animation_picker.custom_icon = get_icon("Favorites", "EditorIcons") + animation_picker.text = animation_picker.get_popup().get_item_text(index) + + animation_length.visible = event_data.get('animation', '') != "[Default]" + $Animation/Label2.visible = event_data.get('animation', '') != "[Default]" + + # informs the parent about the changes! + data_changed() + +func _on_AnimationLength_value_changed(value): + event_data['animation_length'] = value + + # informs the parent about the changes! + data_changed() + + +func _on_Repeat_value_changed(value): + event_data['animation_repeat'] = value + + # informs the parent about the changes! + data_changed() + +func on_WaitForAnimation_toggled(toggled): + event_data['animation_wait'] = toggled + + # informs the parent about the changes! + data_changed() + +func _on_ZIndexEnable_toggled(toggled): + if event_data['type'] != 2: return + event_data['change_z_index'] = toggled + + z_index.visible = z_index_enable.pressed + z_index_enable.icon = enable_icon if not z_index_enable.pressed else disable_icon + + # informs the parent about the changes! + data_changed() + +func _on_ZIndex_value_changed(value): + event_data['z_index'] = value + + # informs the parent about the changes! + data_changed() + +func _on_MirroredEnabled_toggled(toggled): + if event_data['type'] != 2: return + event_data['change_mirror_portrait'] = toggled + + mirrored_checkbox.visible = mirrored_checkbox_enable.pressed + mirrored_checkbox_enable.icon = enable_icon if not mirrored_checkbox_enable.pressed else disable_icon + + # informs the parent about the changes! + data_changed() + +func _on_Mirrored_toggled(toggled): + event_data['mirror_portrait'] = toggled + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterJoining.gd b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterJoining.gd new file mode 100644 index 0000000..ab1db6c --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_CharacterJoining.gd @@ -0,0 +1,71 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var character_portrait_picker = $HBox/CharacterAndPortraitPicker +onready var position_picker = $HBox/PositionPicker +onready var mirror_button = $HBox/MirrorButton +onready var no_character_button = $NoCharacterContainer/NoCharacterButton +onready var no_character_container = $NoCharacterContainer + +# used to connect the signals +func _ready(): + if DialogicUtil.get_character_list().size() > 0: + character_portrait_picker.show() + position_picker.show() + mirror_button.show() + no_character_container.hide() + else: + character_portrait_picker.hide() + position_picker.hide() + mirror_button.hide() + no_character_container.show() + var editor_reference = find_parent('EditorView') + no_character_button.connect('pressed', editor_reference.get_node('MainPanel/MasterTreeContainer/MasterTree'), 'new_character') + + + mirror_button.connect("toggled", self, "_on_MirrorButton_toggled") + character_portrait_picker.connect('data_changed', self, '_on_CharacterPortraitPicker_data_changed') + position_picker.connect('data_changed', self, '_on_PositionPicker_data_changed') + + # icons + mirror_button.icon = get_icon("MirrorX", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + character_portrait_picker.load_data(data) + position_picker.load_data(data) + mirror_button.pressed = data['mirror'] + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_MirrorButton_toggled(toggle): + event_data['mirror'] = toggle + + character_portrait_picker.load_data(event_data) + position_picker.load_data(event_data) + + # informs the parent about the changes! + data_changed() + +func _on_PositionPicker_data_changed(data): + event_data = data + + character_portrait_picker.load_data(event_data) + + # informs the parent about the changes! + data_changed() + +func _on_CharacterPortraitPicker_data_changed(data): + event_data = data + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_PositionPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_PositionPicker.gd new file mode 100644 index 0000000..46c5898 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/EventPart_PositionPicker.gd @@ -0,0 +1,94 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +var default_icon_color = Color("#65989898") +var enable_icon +var disable_icon + +## node references +onready var positions_container = $HBox/PositionsContainer +onready var enable_position = $HBox/EnablePosition +# used to connect the signals +func _ready(): + for p in positions_container.get_children(): + p.connect('pressed', self, "position_button_pressed", [p.name]) + enable_position.connect('toggled', self, 'on_EnablePosition_toggled') + enable_icon = get_icon("Edit", "EditorIcons") + disable_icon = get_icon("Reload", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + if data.get('type', 0) == 0: + $HBox/Label.text = 'at position' + elif data.get('type', 0) == 2: + if not data.get('change_position', false): + $HBox/Label.text = '(same position)' + else: + $HBox/Label.text = 'to position' + + enable_position.pressed = data.get('change_position', false) or data.get('type', 0) != 2 + enable_position.visible = data.get('type', 0) == 2 + enable_position.icon = enable_icon if not enable_position.pressed else disable_icon + positions_container.visible = enable_position.pressed + + # Now update the ui nodes to display the data. + check_active_position() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func get_character_color(): + for ch in DialogicUtil.get_character_list(): + if ch['file'] == event_data['character']: + return ch['color'] + return default_icon_color + +func position_button_pressed(name): + clear_all_positions() + var selected_index = name.split('-')[1] + var button = positions_container.get_node('position-' + selected_index) + button.set('self_modulate', get_character_color()) + button.pressed = true + + event_data['position'][selected_index] = true + + data_changed() + +func clear_all_positions(): + if not event_data.get('position', false): + event_data['position'] = {} + for i in range(5): + event_data['position'][str(i)] = false + for p in positions_container.get_children(): + p.set('self_modulate', default_icon_color) + p.pressed = false + + +func check_active_position(active_color = Color("#ffffff")): + if not event_data.get('position', false): return + var index = 0 + for p in positions_container.get_children(): + if event_data['position'][str(index)]: + p.pressed = true + p.set('self_modulate', get_character_color()) + index += 1 + +func on_EnablePosition_toggled(toggled): + if event_data['type'] != 2: return + event_data['change_position'] = toggled + + positions_container.visible = enable_position.pressed + enable_position.icon = enable_icon if not enable_position.pressed else disable_icon + + if !toggled: + $HBox/Label.text = '(same position)' + else: + $HBox/Label.text = 'to position' + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Character/PositionPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Character/PositionPicker.tscn new file mode 100644 index 0000000..8bf667d --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Character/PositionPicker.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Character/EventPart_PositionPicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/character.svg" type="Texture" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="PositionPicker" type="VBoxContainer"] +margin_right = 186.0 +margin_bottom = 30.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 274.0 +margin_bottom = 30.0 + +[node name="Label" parent="HBox" instance=ExtResource( 3 )] +margin_top = 8.0 +margin_right = 68.0 +margin_bottom = 22.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "at position" + +[node name="PositionsContainer" type="HBoxContainer" parent="HBox"] +margin_left = 72.0 +margin_right = 258.0 +margin_bottom = 30.0 + +[node name="position-0" type="ToolButton" parent="HBox/PositionsContainer"] +self_modulate = Color( 0.596078, 0.596078, 0.596078, 0.396078 ) +margin_right = 34.0 +margin_bottom = 30.0 +icon = ExtResource( 2 ) + +[node name="position-1" type="ToolButton" parent="HBox/PositionsContainer"] +self_modulate = Color( 0.596078, 0.596078, 0.596078, 0.396078 ) +margin_left = 38.0 +margin_right = 72.0 +margin_bottom = 30.0 +icon = ExtResource( 2 ) + +[node name="position-2" type="ToolButton" parent="HBox/PositionsContainer"] +self_modulate = Color( 0.596078, 0.596078, 0.596078, 0.396078 ) +margin_left = 76.0 +margin_right = 110.0 +margin_bottom = 30.0 +icon = ExtResource( 2 ) + +[node name="position-3" type="ToolButton" parent="HBox/PositionsContainer"] +self_modulate = Color( 0.596078, 0.596078, 0.596078, 0.396078 ) +margin_left = 114.0 +margin_right = 148.0 +margin_bottom = 30.0 +icon = ExtResource( 2 ) + +[node name="position-4" type="ToolButton" parent="HBox/PositionsContainer"] +self_modulate = Color( 0.596078, 0.596078, 0.596078, 0.396078 ) +margin_left = 152.0 +margin_right = 186.0 +margin_bottom = 30.0 +icon = ExtResource( 2 ) + +[node name="EnablePosition" type="ToolButton" parent="HBox"] +margin_left = 262.0 +margin_right = 274.0 +margin_bottom = 30.0 +toggle_mode = true +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/Parts/DummyEventDataShower.tscn b/project/addons/dialogic/Editor/Events/Parts/DummyEventDataShower.tscn new file mode 100644 index 0000000..8121dbd --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/DummyEventDataShower.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/EventPart_DummyEventDataShower.gd" type="Script" id=1] + +[node name="DummyEventDataShower" type="HBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Text" type="Label" parent="."] +margin_top = 13.0 +margin_right = 62.0 +margin_bottom = 27.0 +text = "Event ID: " + +[node name="EventId" type="Label" parent="."] +margin_left = 66.0 +margin_top = 13.0 +margin_right = 66.0 +margin_bottom = 27.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.gd b/project/addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.gd new file mode 100644 index 0000000..da26df0 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.gd @@ -0,0 +1,51 @@ +tool +extends HBoxContainer + +onready var visible_toggle = $VisibleToggle +onready var preview = $MarginContainer/Preview + +var enabled : bool +var expanded: bool + +var max_preview_characters = 50 + +signal state_changed(expanded) + +func _ready(): + $MarginContainer/Preview.set("custom_colors/font_color", get_color("disabled_font_color", "Editor")) + set_enabled(false) + visible_toggle.connect("toggled", self, "_on_VisibleToggle_toggled") + + +func set_preview(text: String): + if len(text) > 50: + text = text.substr(0, 50) + text += "..." + preview.text = text + + +func set_enabled(enabled: bool): + self.enabled = enabled + set_expanded(enabled) + if enabled: + show() + else: + hide() + + +func set_expanded(expanded: bool): + if not enabled: + return + self.expanded = expanded + visible_toggle.pressed = expanded + if expanded: + preview.hide() + else: + preview.show() + visible_toggle.release_focus() + emit_signal("state_changed", expanded) + + +func _on_VisibleToggle_toggled(button_pressed: bool): + if enabled: + set_expanded(button_pressed) diff --git a/project/addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.tscn b/project/addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.tscn new file mode 100644 index 0000000..650b6bc --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.tscn" type="PackedScene" id=4] + +[node name="ExpandControl" type="HBoxContainer"] +visible = false +margin_right = 62.0 +margin_bottom = 30.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VisibleToggle" parent="." instance=ExtResource( 4 )] +margin_left = 8.0 +margin_right = 38.0 +pressed = false +script = null + +[node name="MarginContainer" type="MarginContainer" parent="."] +margin_left = 42.0 +margin_right = 64.0 +margin_bottom = 30.0 +mouse_filter = 1 +custom_constants/margin_left = 10 + +[node name="Preview" type="Label" parent="MarginContainer"] +margin_left = 10.0 +margin_top = 8.0 +margin_right = 22.0 +margin_bottom = 22.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "..." diff --git a/project/addons/dialogic/Editor/Events/Parts/EventBlock/PopupMenu.gd b/project/addons/dialogic/Editor/Events/Parts/EventBlock/PopupMenu.gd new file mode 100644 index 0000000..c5da487 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventBlock/PopupMenu.gd @@ -0,0 +1,17 @@ +tool +extends PopupMenu + +func _ready(): + clear() + add_icon_item(get_icon("Help", "EditorIcons"), "Documentation") + add_separator() + add_icon_item(get_icon("ArrowUp", "EditorIcons"), "Move up") + add_icon_item(get_icon("ArrowDown", "EditorIcons"), "Move down") + add_separator() + add_icon_item(get_icon("Remove", "EditorIcons"), "Delete") + + var menu_background = load("res://addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres") + menu_background.bg_color = get_color("base_color", "Editor") + add_stylebox_override('panel', menu_background) + add_stylebox_override('hover', StyleBoxEmpty.new()) + add_color_override('font_color_hover', get_color("accent_color", "Editor")) diff --git a/project/addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.gd b/project/addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.gd new file mode 100644 index 0000000..5381a41 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.gd @@ -0,0 +1,49 @@ +tool +extends CheckBox + +var current_piece +var is_disabled = false + + +func _ready(): + # Gotta love the nodes system some times + # Praise the paths (っ´ω`c)♡ + current_piece = get_parent().get_parent().get_parent().get_parent() + connect("toggled", self, "_on_VisibleToggle_toggled") + + +func disabled(): + self_modulate = Color(0,0,0,0) + is_disabled = true + + +func set_visible(visible: bool): + pressed = visible + var current_rect_size = current_piece.get("rect_size") + if visible: + current_piece.get_node("PanelContainer/VBoxContainer/Header/Preview").hide() + + var index = 0 + for node in current_piece.get_node("PanelContainer/VBoxContainer").get_children(): + if index > 0: + node.show() + index += 1 + else: + if current_piece.has_node("PanelContainer/VBoxContainer/Header/Preview"): + current_piece.get_node("PanelContainer/VBoxContainer/Header/Preview").show() + + var index = 0 + for node in current_piece.get_node("PanelContainer/VBoxContainer").get_children(): + if index > 0: + node.hide() + index += 1 + if "preview" in current_piece: + current_piece.get_node("PanelContainer/VBoxContainer/Header/Preview").text = current_piece.preview + current_piece.set("rect_size", Vector2(current_rect_size.x,0)) + release_focus() + + +func _on_VisibleToggle_toggled(button_pressed): + if is_disabled: + return + set_visible(button_pressed) diff --git a/project/addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.tscn b/project/addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.tscn new file mode 100644 index 0000000..18bc939 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Images/Pieces/open-icon.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Images/Pieces/closed-icon.svg" type="Texture" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/EventBlock/VisibleToggle.gd" type="Script" id=3] + +[node name="VisibleToggle" type="CheckBox"] +margin_right = 30.0 +margin_bottom = 30.0 +custom_icons/checked = ExtResource( 1 ) +custom_icons/unchecked = ExtResource( 2 ) +pressed = true +flat = true +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/Parts/EventPart.gd b/project/addons/dialogic/Editor/Events/Parts/EventPart.gd new file mode 100644 index 0000000..9668d11 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventPart.gd @@ -0,0 +1,46 @@ +tool +extends Control + +# has to be set by the parent before adding it to the tree +var editor_reference + +var event_data = {} + +signal data_changed + +# emit this to set the enabling of the body +signal request_set_body_enabled(enabled) + +# emit these if you want the body to be closed/opened +signal request_open_body +signal request_close_body + +# emit these if you want the event to be selected +signal request_selection + +# emit this if you want a warning to be displayed/hidden +signal set_warning(text) +signal remove_warning() + + +# when the node is ready +func _ready(): + pass + +# to be overwritten by the subclasses +func load_data(data:Dictionary): + event_data = data + + +# to be overwritten by body-parts that provide a preview +func get_preview_text(): + return '' + +# to be overwritten by the body-parts if some kind of focus (on event creation) is wanted +func focus(): + pass + +# has to be called everytime the data got changed +func data_changed(): + emit_signal("data_changed", event_data) + diff --git a/project/addons/dialogic/Editor/Events/Parts/EventPart_DummyEventDataShower.gd b/project/addons/dialogic/Editor/Events/Parts/EventPart_DummyEventDataShower.gd new file mode 100644 index 0000000..43ef80b --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/EventPart_DummyEventDataShower.gd @@ -0,0 +1,23 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var text_field = $EventId + +# used to connect the signals +func _ready(): + pass + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + text_field.text = event_data['event_id'] + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' diff --git a/project/addons/dialogic/Editor/Events/Parts/ExampleEventPartScript.gd b/project/addons/dialogic/Editor/Events/Parts/ExampleEventPartScript.gd new file mode 100644 index 0000000..20400cc --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ExampleEventPartScript.gd @@ -0,0 +1,36 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +## BEFORE EDITING THIS MAKE SURE YOU HAVE CREATED A UNIQUE SCRIPT!!! + +# has an event_data variable that stores the current data!!! + +## node references +# e.g. +onready var input_field = $Box/InputField + +# used to connect the signals +func _ready(): + # e.g. + input_field.connect("text_changed", self, "_on_InputField_text_changed") + pass + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + # e.g. + input_field.text = event_data['my_text_key'] + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +## EXAMPLE CHANGE IN ONE OF THE NODES +func _on_InputField_text_changed(text): + event_data['my_text_key'] = text + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Images/BackgroundPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Images/BackgroundPicker.tscn new file mode 100644 index 0000000..06d521f --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Images/BackgroundPicker.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/FilePicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPicker.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/SpinBoxPreventDnD.gd" type="Script" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=4] + +[node name="BackgroundPicker" type="VBoxContainer"] +margin_top = 1.0 +margin_right = 331.0 +margin_bottom = 23.0 +size_flags_vertical = 4 +theme = ExtResource( 4 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 353.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FilePicker" parent="HBox" instance=ExtResource( 1 )] +margin_right = 149.0 + +[node name="FadeLabel" type="Label" parent="HBox"] +margin_left = 153.0 +margin_top = 5.0 +margin_right = 273.0 +margin_bottom = 19.0 +text = " Fade-in duration:" + +[node name="NumberBox" type="SpinBox" parent="HBox"] +margin_left = 277.0 +margin_right = 353.0 +margin_bottom = 24.0 +size_flags_vertical = 6 +step = 0.1 +value = 1.0 +allow_greater = true +align = 1 +script = ExtResource( 3 ) diff --git a/project/addons/dialogic/Editor/Events/Parts/Images/BackgroundPreview.tscn b/project/addons/dialogic/Editor/Events/Parts/Images/BackgroundPreview.tscn new file mode 100644 index 0000000..df4c172 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Images/BackgroundPreview.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPreview.gd" type="Script" id=1] + +[node name="BackgroundPreview" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_horizontal = 0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Box" type="CenterContainer" parent="."] +margin_right = 200.0 +margin_bottom = 200.0 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="Box"] +margin_right = 200.0 +margin_bottom = 200.0 +rect_min_size = Vector2( 200, 200 ) +size_flags_vertical = 5 +expand = true +stretch_mode = 6 diff --git a/project/addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPicker.gd new file mode 100644 index 0000000..a025dbd --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPicker.gd @@ -0,0 +1,73 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var file_picker = $HBox/FilePicker + +onready var fade_duration_label = $HBox/FadeLabel +onready var fade_duration = $HBox/NumberBox + +# used to connect the signals +func _ready(): + file_picker.connect("data_changed", self, "_on_FilePicker_data_changed") + fade_duration.connect('value_changed', self, '_on_fade_duration_changed') + + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + file_picker.load_data(data) + if event_data['background']: + fade_duration_label.visible = true + fade_duration.visible = true + emit_signal("request_close_body") + else: + fade_duration_label.visible = false + fade_duration.visible = false + emit_signal("request_close_body") + + fade_duration.value = event_data.get('fade_duration', 1) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_FilePicker_data_changed(data): + event_data = data + + fade_duration.visible = !data['background'].empty() + fade_duration_label.visible = !data['background'].empty() + + if !data['background'].empty(): + emit_signal("request_open_body") + else: + emit_signal("request_close_body") + + # informs the parent about the changes! + data_changed() + +#func _on_ClearButton_pressed(): +# event_data['background'] = '' +# +# clear_button.disabled = true +# name_label.text = 'No image (will clear previous background)' +# image_button.hint_tooltip = 'No background selected' +# fade_duration.visible = false +# fade_duration_label.visible = false +# fade_duration.value = 1 +# +# emit_signal("request_close_body") +# +# # informs the parent about the changes! +# data_changed() + +func _on_fade_duration_changed(value: float): + event_data['fade_duration'] = value + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPreview.gd b/project/addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPreview.gd new file mode 100644 index 0000000..b288043 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Images/EventPart_BackgroundPreview.gd @@ -0,0 +1,39 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var texture_rect = $Box/TextureRect + +# used to connect the signals +func _ready(): + pass + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + if event_data['background']: + if not event_data['background'].ends_with('.tscn'): + emit_signal("request_set_body_enabled", true) + texture_rect.texture = load(event_data['background']) + else: + emit_signal("request_set_body_enabled", false) + if editor_reference and editor_reference.editor_interface: + editor_reference.editor_interface.get_resource_previewer().queue_resource_preview(event_data['background'], self, "show_scene_preview", null) + else: + emit_signal("request_set_body_enabled", false) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func show_scene_preview(path:String, preview:Texture, user_data): + if preview: + texture_rect.texture = preview + emit_signal("request_set_body_enabled", true) + + diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/ChoicePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/ChoicePicker.tscn new file mode 100644 index 0000000..ec15923 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/ChoicePicker.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/ConditionPicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_ChoicePicker.gd" type="Script" id=3] + +[node name="ChoicePicker" type="HBoxContainer"] +margin_right = 437.0 +margin_bottom = 24.0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 158.0 +margin_bottom = 27.0 +size_flags_vertical = 3 + +[node name="Spacer2" type="Control" parent="HBox"] +margin_right = 10.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 10, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ChoiceText" parent="HBox" instance=ExtResource( 2 )] +margin_left = 14.0 +margin_right = 144.0 +margin_bottom = 27.0 + +[node name="Spacer" type="Control" parent="HBox"] +margin_left = 148.0 +margin_right = 158.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 10, 0 ) + +[node name="ConditionPicker" parent="." instance=ExtResource( 1 )] +margin_left = 162.0 +margin_right = 635.0 +margin_bottom = 27.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionPicker.tscn new file mode 100644 index 0000000..7c7de0b --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionPicker.tscn @@ -0,0 +1,95 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/DefinitionPicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/ConditionTypePicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionPicker.gd" type="Script" id=4] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=5] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 10.0 +content_margin_right = 10.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0.12549, 0.141176, 0.192157, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.0980392, 0.113725, 0.152941, 1 ) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 + +[node name="ConditionPicker" type="VBoxContainer"] +margin_left = -1.0 +margin_right = 430.0 +margin_bottom = 24.0 +size_flags_vertical = 4 +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 473.0 +margin_bottom = 27.0 +size_flags_vertical = 3 + +[node name="HasCondition" type="HBoxContainer" parent="HBox"] +margin_right = 89.0 +margin_bottom = 27.0 +size_flags_vertical = 3 + +[node name="UseCondition" type="CheckBox" parent="HBox/HasCondition"] +margin_right = 89.0 +margin_bottom = 27.0 +size_flags_vertical = 7 +text = "Condition" + +[node name="Values" type="HBoxContainer" parent="HBox"] +margin_left = 93.0 +margin_right = 473.0 +margin_bottom = 27.0 + +[node name="Label2" parent="HBox/Values" instance=ExtResource( 5 )] +margin_top = 6.0 +margin_right = 9.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "If" + +[node name="DefinitionPicker" parent="HBox/Values" instance=ExtResource( 1 )] +margin_left = 13.0 +margin_top = 1.0 +margin_right = 115.0 +margin_bottom = 25.0 + +[node name="Label" parent="HBox/Values" instance=ExtResource( 5 )] +margin_left = 119.0 +margin_top = 6.0 +margin_right = 130.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "is" + +[node name="ConditionTypePicker" parent="HBox/Values" instance=ExtResource( 2 )] +margin_left = 134.0 +margin_right = 232.0 +margin_bottom = 27.0 + +[node name="Control" type="Control" parent="HBox/Values"] +margin_left = 236.0 +margin_right = 246.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 10, 0 ) + +[node name="Value" parent="HBox/Values" instance=ExtResource( 3 )] +margin_left = 250.0 +margin_right = 380.0 +margin_bottom = 27.0 +custom_styles/read_only = SubResource( 1 ) +custom_styles/focus = SubResource( 1 ) +custom_styles/normal = SubResource( 1 ) +text = "text" diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionPickerOld.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionPickerOld.gd new file mode 100644 index 0000000..d8df8f4 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionPickerOld.gd @@ -0,0 +1,58 @@ +tool +extends MenuButton + +var options = [ + { + "text": "[ Equal to ]", + "condition": "==" + }, + { + "text": "[ Different from ]", + "condition": "!=" + }, + { + "text": "[ Greater than ]", + "condition": ">" + }, + { + "text": "[ Greater or equal to ]", + "condition": ">=" + }, + { + "text": "[ Less than ]", + "condition": "<" + }, + { + "text": "[ Less or equal to ]", + "condition": "<=" + } +] + +func _ready(): + get_popup().connect("index_pressed", self, '_on_entry_selected') + get_popup().clear() + connect("about_to_show", self, "_on_MenuButton_about_to_show") + + +func _on_MenuButton_about_to_show(): + get_popup().clear() + var index = 0 + for o in options: + get_popup().add_item(o['text']) + get_popup().set_item_metadata(index, o) + index += 1 + + +func _on_entry_selected(index): + var _text = get_popup().get_item_text(index) + var metadata = get_popup().get_item_metadata(index) + text = _text + + +func load_condition(condition): + if condition != '': + for o in options: + if (o['condition'] == condition): + text = o['text'] + else: + text = options[0]['text'] diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionTypePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionTypePicker.tscn new file mode 100644 index 0000000..91b1788 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/ConditionTypePicker.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionTypePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] + +[node name="ConditionTypePicker" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MenuButton" parent="." instance=ExtResource( 2 )] +margin_right = 98.0 +margin_bottom = 24.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ChoicePicker.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ChoicePicker.gd new file mode 100644 index 0000000..bd4a349 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ChoicePicker.gd @@ -0,0 +1,47 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var input_field = $HBox/ChoiceText +onready var condition_picker = $ConditionPicker + +# used to connect the signals +func _ready(): + # e.g. + input_field.connect("text_changed", self, "_on_ChoiceText_text_changed") + condition_picker.connect("data_changed", self, "_on_ConditionPicker_data_changed") + condition_picker.connect("remove_warning", self, "emit_signal", ["remove_warning"]) + condition_picker.connect("set_warning", self, "set_warning") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + input_field.text = event_data['choice'] + + # Loading the data on the selectors + condition_picker.load_data(event_data) + + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +func _on_ChoiceText_text_changed(text): + event_data['choice'] = text + + # informs the parent about the changes! + data_changed() + +func _on_ConditionPicker_data_changed(data): + event_data = data + + data_changed() + +func set_warning(text): + emit_signal("set_warning", text) diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionPicker.gd new file mode 100644 index 0000000..92e4129 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionPicker.gd @@ -0,0 +1,85 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +onready var enabled_view = $HBox/Values +onready var definition_picker = $HBox/Values/DefinitionPicker +onready var condition_type_picker = $HBox/Values/ConditionTypePicker +onready var value_input = $HBox/Values/Value + +onready var optional_view = $HBox/HasCondition +onready var use_condition_check = $HBox/HasCondition/UseCondition + +# used to connect the signals +func _ready(): + definition_picker.connect("data_changed", self, '_on_DefinitionPicker_data_changed') + + condition_type_picker.connect("data_changed", self, '_on_ConditionTypePicker_data_changed') + + value_input.connect("text_changed", self, "_on_Value_text_changed") + + use_condition_check.connect("toggled", self, "_on_UseCondition_toggled") + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Loading the data on the selectors + definition_picker.load_data(data) + condition_type_picker.load_data(data) + value_input.text = data['value'] + + if data['event_id'] == 'dialogic_011': + optional_view.show() + if data['definition'] == '': # Checking if definition is selected + use_condition_check.pressed = false + enabled_view.hide() + else: + use_condition_check.pressed = true + enabled_view.show() + else: + optional_view.hide() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +func _on_UseCondition_toggled(checkbox_value): + enabled_view.visible = checkbox_value + if checkbox_value == false: + event_data['definition'] = '' + event_data['condition'] = '' + event_data['value'] = '' + + data_changed() + +func _on_DefinitionPicker_data_changed(data): + event_data = data + + data_changed() + +func _on_ConditionTypePicker_data_changed(data): + event_data = data + check_data() + data_changed() + + # Focusing the value input + value_input.call_deferred('grab_focus') + +func _on_Value_text_changed(text): + event_data['value'] = text + check_data() + + data_changed() + +func check_data(): +# if event_data['condition'] != '==' and event_data['condition'] != '!=' and event_data['condition'] != '': +# if not event_data['value'].is_valid_float(): +# emit_signal("set_warning", DTS.translate("The selected operator requires a number!")) +# return + + emit_signal("remove_warning") diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionTypePicker.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionTypePicker.gd new file mode 100644 index 0000000..8960ce8 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_ConditionTypePicker.gd @@ -0,0 +1,76 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +var options = [ + { + "text": "Equal to", + "condition": "==" + }, + { + "text": "Different from", + "condition": "!=" + }, + { + "text": "Greater than", + "condition": ">" + }, + { + "text": "Greater or equal to", + "condition": ">=" + }, + { + "text": "Less than", + "condition": "<" + }, + { + "text": "Less or equal to", + "condition": "<=" + } +] +## node references +onready var picker_menu = $MenuButton + +# used to connect the signals +func _ready(): + # e.g. + picker_menu.get_popup().connect("index_pressed", self, '_on_PickerMenu_selected') + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + picker_menu.custom_icon = get_icon("GDScript", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + select_condition_type(data['condition']) + + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func select_condition_type(condition): + if condition != '': + for o in options: + if (o['condition'] == condition): + picker_menu.text = o['text'] + else: + picker_menu.text = options[0]['text'] + +func _on_PickerMenu_selected(index): + event_data['condition'] = picker_menu.get_popup().get_item_metadata(index).get('condition', '') + + select_condition_type(event_data['condition']) + + # informs the parent about the changes! + data_changed() + +func _on_PickerMenu_about_to_show(): + picker_menu.get_popup().clear() + var index = 0 + for o in options: + picker_menu.get_popup().add_item(o['text']) + picker_menu.get_popup().set_item_metadata(index, o) + index += 1 diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_GoToSelector.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_GoToSelector.gd new file mode 100644 index 0000000..1d7e96d --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_GoToSelector.gd @@ -0,0 +1,57 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var picker_menu = $MenuButton + +# used to connect the signals +func _ready(): + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + picker_menu.get_popup().connect("index_pressed", self, '_on_PickerMenu_selected') + find_parent("TimelineEditor").connect("timeline_loaded", self, "update") + picker_menu.custom_icon = load("res://addons/dialogic/Images/Event Icons/label.svg") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + update() + +func update(): + if event_data['anchor_id'] == "": + picker_menu.text = "Select label" + else: + var anchors = find_parent('TimelineEditor').get_current_events_anchors() + if event_data['anchor_id'] in anchors.keys(): + picker_menu.text = anchors[event_data['anchor_id']] + else: + picker_menu.text = "Label not found" + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +func _on_PickerMenu_about_to_show(): + picker_menu.get_popup().clear() + + var anchors = find_parent('TimelineEditor').get_current_events_anchors() + var index = 0 + for id in anchors.keys(): + picker_menu.get_popup().add_item(anchors[id]) + picker_menu.get_popup().set_item_metadata(index, {'id':id}) + index += 1 + +func _on_PickerMenu_selected(index): + var text = picker_menu.get_popup().get_item_text(index) + var metadata = picker_menu.get_popup().get_item_metadata(index) + + picker_menu.text = text + + event_data['anchor_id'] = metadata['id'] + + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_LabelSetter.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_LabelSetter.gd new file mode 100644 index 0000000..08fce6a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_LabelSetter.gd @@ -0,0 +1,38 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var input_field = $NameInput +onready var new_id = $NewIdButton + +# used to connect the signals +func _ready(): + input_field.connect("text_changed", self, "_on_InputField_text_changed") + new_id.icon = get_icon("RotateRight", "EditorIcons") + new_id.connect("pressed", self, "new_id") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + if data['id'] == null: + new_id() + input_field.text = event_data['name'] + + new_id.hint_tooltip = "Change to a new unique ID. \nOnly do this if you have a duplicate id in this timeline! \nWill break existing links. \n\nCurrent ID: "+data['id'] + +func new_id(): + event_data['id'] = 'anchor-' + str(OS.get_unix_time()) + + new_id.hint_tooltip = "Change to a new unique ID. \nOnly do this if you have a duplicate id in this timeline! \nWill break existing links. \n\nCurrent ID: "+event_data['id'] + data_changed() + +func _on_InputField_text_changed(text): + event_data['name'] = text + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_OperationPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_OperationPicker.gd new file mode 100644 index 0000000..16b082b --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_OperationPicker.gd @@ -0,0 +1,71 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +var options = [ + { + "text": "to be", + "operation": "=" + }, + { + "text": "to itself plus", + "operation": "+" + }, + { + "text": "to itself minus", + "operation": "-" + }, + { + "text": "to itself multiplied by", + "operation": "*" + }, + { + "text": "to itself divided by", + "operation": "/" + }, +] + +## node references +onready var picker_menu = $MenuButton + +# used to connect the signals +func _ready(): + picker_menu.get_popup().connect("index_pressed", self, '_on_PickerMenu_selected') + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + picker_menu.custom_icon = get_icon("GDScript", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + select_operation() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func select_operation(): + for o in options: + if (o['operation'] == event_data['operation']): + picker_menu.text = o['text'] + + +func _on_PickerMenu_selected(index): + event_data['operation'] = picker_menu.get_popup().get_item_metadata(index).get('operation') + + select_operation() + + # informs the parent about the changes! + data_changed() + +func _on_PickerMenu_about_to_show(): + picker_menu.get_popup().clear() + + var index = 0 + for o in options: + picker_menu.get_popup().add_item(o['text']) + picker_menu.get_popup().set_item_metadata(index, o) + index += 1 diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.gd new file mode 100644 index 0000000..1ea04a5 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.gd @@ -0,0 +1,53 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var slot_picker = $MenuButton +onready var custom_slot = $CustomSlot + +# used to connect the signals +func _ready(): + custom_slot.connect("text_changed", self, '_on_CustomSlot_text_changed') + slot_picker.get_popup().connect("index_pressed", self, "on_SlotPicker_index_pressed") + slot_picker.get_popup().clear() + slot_picker.get_popup().add_icon_item(get_icon("Save", "EditorIcons"), "Default slot") + slot_picker.get_popup().add_icon_item(get_icon("Tools", "EditorIcons"), "Custom slot") + slot_picker.custom_icon = get_icon("Save", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + if event_data.get('use_default_slot', true): + slot_picker.text = "Default slot" + else: + slot_picker.text = "Custom slot" + custom_slot.text = event_data.get('custom_slot', '') + + custom_slot.visible = not event_data.get('use_default_slot', true) + +func on_SlotPicker_index_pressed(index): + event_data['use_default_slot'] = index == 0 + + # Now update the ui nodes to display the data. + if event_data.get('use_default_slot', true): + slot_picker.text = "Default slot" + else: + slot_picker.text = "Custom slot" + custom_slot.text = event_data.get('custom_slot', '') + + custom_slot.visible = not event_data.get('use_default_slot', true) + + # informs the parent about the changes! + data_changed() + + +func _on_CustomSlot_text_changed(text): + event_data['custom_slot'] = text + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.tscn new file mode 100644 index 0000000..6fcd516 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=4] + +[node name="EventPart_Save" type="HBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +custom_constants/separation = 9 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label2" parent="." instance=ExtResource( 4 )] +margin_top = 13.0 +margin_right = 13.0 +margin_bottom = 27.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "to" + +[node name="MenuButton" parent="." instance=ExtResource( 3 )] +margin_left = 22.0 +margin_top = 9.0 +margin_right = 116.0 +margin_bottom = 31.0 + +[node name="CustomSlot" parent="." instance=ExtResource( 1 )] +margin_left = 125.0 +margin_top = 6.0 +margin_right = 255.0 +margin_bottom = 33.0 +hint_tooltip = "Also allows for value definitions like this: [my_value_name]" diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_SetValuePicker.gd b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_SetValuePicker.gd new file mode 100644 index 0000000..7d58614 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/EventPart_SetValuePicker.gd @@ -0,0 +1,99 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var input_feature = $HBox/InputValue +onready var input_field = $HBox/InputValue/InputField +onready var definition_picker = $HBox/DefinitionPicker +onready var operation_picker = $HBox/OperationPicker + +onready var random_enabled_button = $HBox/RandomEnabled +onready var random_features = $HBox/RandomValue +onready var random_lower_limit = $HBox/RandomValue/LowerLimit +onready var random_upper_limit = $HBox/RandomValue/UpperLimit + +# used to connect the signals +func _ready(): + input_field.connect("text_changed", self, "_on_InputField_text_changed") + definition_picker.connect("data_changed", self, "_on_DefintionPicker_data_changed") + operation_picker.connect("data_changed", self, "_on_OperationPicker_data_changed") + + random_enabled_button.icon = get_icon("MaterialPreviewCube", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + input_field.text = event_data['set_value'] + definition_picker.load_data(data) + operation_picker.load_data(data) + + switch_random_features(data.get('set_random', false)) + + random_lower_limit.value = data.get("random_lower_limit", 0) + random_upper_limit.value = data.get("random_upper_limit", 100) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func check_data(): + if event_data['operation'] != '=': + if not event_data['set_value'].is_valid_float(): + emit_signal("set_warning", editor_reference.dialogicTranslator.translate("The selected operator requires a number!")) + return + + emit_signal("remove_warning") + +func _on_InputField_text_changed(text): + event_data['set_value'] = text + + operation_picker.load_data(event_data) + definition_picker.load_data(event_data) + + check_data() + + # informs the parent about the changes! + data_changed() + +func _on_DefintionPicker_data_changed(data): + event_data = data + + operation_picker.load_data(data) + + # informs the parent about the changes! + data_changed() + +func _on_OperationPicker_data_changed(data): + event_data = data + + definition_picker.load_data(data) + + check_data() + + # informs the parent about the changes! + data_changed() + +func switch_random_features(enabled): + random_features.visible = enabled + input_feature.visible = !enabled + random_enabled_button.pressed = enabled + event_data['set_random'] = enabled + + +func _on_LowerLimit_value_changed(value): + event_data['random_lower_limit'] = value + + data_changed() + +func _on_UpperLimit_value_changed(value): + event_data['random_upper_limit'] = value + + data_changed() + +func _on_RandomEnabled_toggled(button_pressed): + switch_random_features(button_pressed) diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/GoTo Selector.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/GoTo Selector.tscn new file mode 100644 index 0000000..1d7d531 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/GoTo Selector.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_GoToSelector.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="GoTo Selector" type="HBoxContainer"] +margin_right = 129.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" parent="." instance=ExtResource( 3 )] +margin_right = 31.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "label" + +[node name="MenuButton" parent="." instance=ExtResource( 2 )] +margin_left = 35.0 +margin_right = 129.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/LabelSetter.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/LabelSetter.tscn new file mode 100644 index 0000000..1b0f685 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/LabelSetter.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_LabelSetter.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="AnchorSetter" type="HBoxContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -723.0 +margin_bottom = -573.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NameInput" parent="." instance=ExtResource( 1 )] +margin_right = 130.0 +margin_bottom = 27.0 + +[node name="Label" parent="." instance=ExtResource( 3 )] +margin_left = 134.0 +margin_top = 6.0 +margin_right = 182.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = " is here" + +[node name="NewIdButton" type="ToolButton" parent="."] +margin_left = 186.0 +margin_right = 198.0 +margin_bottom = 27.0 +hint_tooltip = "Change to a new unique ID. Only do this if you have a duplicate id in this timeline!" diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/OperationPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/OperationPicker.tscn new file mode 100644 index 0000000..8477a7b --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/OperationPicker.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_OperationPicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] + +[node name="OperationPicker" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MenuButton" parent="." instance=ExtResource( 2 )] diff --git a/project/addons/dialogic/Editor/Events/Parts/Logic/SetValuePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Logic/SetValuePicker.tscn new file mode 100644 index 0000000..db92f59 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Logic/SetValuePicker.tscn @@ -0,0 +1,123 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/OperationPicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/DefinitionPicker.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_SetValuePicker.gd" type="Script" id=4] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=5] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[node name="SetValuePicker" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_vertical = 4 +script = ExtResource( 4 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 726.0 +margin_bottom = 27.0 + +[node name="DefinitionPicker" parent="HBox" instance=ExtResource( 3 )] +margin_top = 2.0 +margin_right = 98.0 +margin_bottom = 24.0 + +[node name="OperationPicker" parent="HBox" instance=ExtResource( 1 )] +margin_left = 102.0 +margin_top = 2.0 +margin_right = 196.0 +margin_bottom = 24.0 + +[node name="InputValue" type="HBoxContainer" parent="HBox"] +margin_left = 200.0 +margin_right = 344.0 +margin_bottom = 27.0 + +[node name="Spacer" type="Control" parent="HBox/InputValue"] +margin_right = 10.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 10, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="InputField" parent="HBox/InputValue" instance=ExtResource( 2 )] +margin_left = 14.0 +margin_right = 144.0 +margin_bottom = 27.0 + +[node name="RandomValue" type="HBoxContainer" parent="HBox"] +margin_left = 348.0 +margin_right = 680.0 +margin_bottom = 27.0 +custom_constants/separation = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" parent="HBox/RandomValue" instance=ExtResource( 5 )] +margin_top = 6.0 +margin_right = 156.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = " a random number from" + +[node name="LowerLimit" type="SpinBox" parent="HBox/RandomValue"] +margin_left = 161.0 +margin_right = 235.0 +margin_bottom = 27.0 +allow_greater = true +allow_lesser = true + +[node name="Label2" parent="HBox/RandomValue" instance=ExtResource( 5 )] +margin_left = 240.0 +margin_top = 6.0 +margin_right = 253.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "to" + +[node name="UpperLimit" type="SpinBox" parent="HBox/RandomValue"] +margin_left = 258.0 +margin_right = 332.0 +margin_bottom = 27.0 +allow_greater = true +allow_lesser = true + +[node name="Spacer" type="Control" parent="HBox"] +margin_left = 684.0 +margin_right = 694.0 +margin_bottom = 27.0 +rect_min_size = Vector2( 10, 0 ) + +[node name="RandomEnabled" type="Button" parent="HBox"] +self_modulate = Color( 1, 1, 1, 0.501961 ) +margin_left = 698.0 +margin_right = 726.0 +margin_bottom = 27.0 +hint_tooltip = "Set to a random integer" +focus_mode = 0 +toggle_mode = true +icon = SubResource( 3 ) +flat = true + +[connection signal="value_changed" from="HBox/RandomValue/LowerLimit" to="." method="_on_LowerLimit_value_changed"] +[connection signal="value_changed" from="HBox/RandomValue/UpperLimit" to="." method="_on_UpperLimit_value_changed"] +[connection signal="toggled" from="HBox/RandomEnabled" to="." method="_on_RandomEnabled_toggled"] diff --git a/project/addons/dialogic/Editor/Events/Parts/NoSkip/EventPart_NoSkip.gd b/project/addons/dialogic/Editor/Events/Parts/NoSkip/EventPart_NoSkip.gd new file mode 100644 index 0000000..f9b2e17 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/NoSkip/EventPart_NoSkip.gd @@ -0,0 +1,35 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var noskip_selector = $HBoxContainer/NoSkipCheckbox +onready var autoadvance_time = $HBoxContainer2/AutoAdvanceTime + +# used to connect the signals +func _ready(): + autoadvance_time.connect("value_changed", self, "_on_SecondsSelector_value_changed") + noskip_selector.connect("toggled", self, "_on_HideDialogBox_toggled") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + autoadvance_time.value = event_data['wait_time'] + noskip_selector.pressed = event_data.get('block_input', true) + + +func _on_SecondsSelector_value_changed(value): + event_data['wait_time'] = value + data_changed() + + +func _on_HideDialogBox_toggled(checkbox_value): + event_data['block_input'] = checkbox_value + data_changed() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' diff --git a/project/addons/dialogic/Editor/Events/Parts/NoSkip/NoSkipPart.tscn b/project/addons/dialogic/Editor/Events/Parts/NoSkip/NoSkipPart.tscn new file mode 100644 index 0000000..a58a386 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/NoSkip/NoSkipPart.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/NoSkip/EventPart_NoSkip.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=3] + +[node name="VBoxContainer" type="VBoxContainer"] +size_flags_vertical = 4 +theme = ExtResource( 3 ) +script = ExtResource( 1 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_right = 392.0 +margin_bottom = 31.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" parent="HBoxContainer" instance=ExtResource( 2 )] +margin_top = 0.0 +margin_right = 243.0 +margin_bottom = 31.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Ignore input and auto advance dialog? +until an unchecked No Skip is reached" + +[node name="NoSkipCheckbox" type="CheckBox" parent="HBoxContainer"] +margin_left = 368.0 +margin_right = 392.0 +margin_bottom = 31.0 +size_flags_horizontal = 10 + +[node name="HSeparator" type="HSeparator" parent="."] +margin_top = 35.0 +margin_right = 392.0 +margin_bottom = 39.0 + +[node name="HBoxContainer2" type="HBoxContainer" parent="."] +margin_top = 43.0 +margin_right = 392.0 +margin_bottom = 67.0 + +[node name="Label2" parent="HBoxContainer2" instance=ExtResource( 2 )] +margin_top = 5.0 +margin_right = 312.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Default wait time after dialog finishes in seconds" + +[node name="AutoAdvanceTime" type="SpinBox" parent="HBoxContainer2"] +margin_left = 316.0 +margin_right = 392.0 +margin_bottom = 24.0 +min_value = 2.0 +max_value = 50.0 +value = 2.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Numbers/EventPart_TransitonLengthPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Numbers/EventPart_TransitonLengthPicker.gd new file mode 100644 index 0000000..3911251 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Numbers/EventPart_TransitonLengthPicker.gd @@ -0,0 +1,29 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var number_box = $HBox/NumberBox + +# used to connect the signals +func _ready(): + number_box.connect("value_changed", self, "_on_NumberBox_value_changed") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + number_box.value = event_data['transition_duration'] + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_NumberBox_value_changed(value): + event_data['transition_duration'] = value + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Numbers/TransitonLengthPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Numbers/TransitonLengthPicker.tscn new file mode 100644 index 0000000..a5eccfc --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Numbers/TransitonLengthPicker.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/SpinBoxPreventDnD.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Numbers/EventPart_TransitonLengthPicker.gd" type="Script" id=2] + +[node name="TransitonLengthPicker" type="VBoxContainer"] +margin_right = 195.0 +margin_bottom = 24.0 +size_flags_vertical = 3 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 195.0 +margin_bottom = 24.0 +size_flags_vertical = 3 + +[node name="NameLabel" type="Label" parent="HBox"] +margin_top = 5.0 +margin_right = 117.0 +margin_bottom = 19.0 +text = "Fade-out duration:" + +[node name="NumberBox" type="SpinBox" parent="HBox"] +margin_left = 121.0 +margin_right = 195.0 +margin_bottom = 24.0 +size_flags_vertical = 6 +step = 0.1 +value = 1.0 +allow_greater = true +align = 1 +script = ExtResource( 1 ) diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn new file mode 100644 index 0000000..2e0187b --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/PortraitPicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterPicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterAndPortraitPicker.gd" type="Script" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/DefinitionPicker.tscn" type="PackedScene" id=4] + +[node name="CharacterAndPortraitPicker" type="VBoxContainer"] +margin_right = 305.0 +margin_bottom = 48.0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 305.0 +margin_bottom = 48.0 +size_flags_vertical = 3 +custom_constants/separation = 5 + +[node name="CharacterPicker" parent="HBox" instance=ExtResource( 2 )] +margin_top = 9.0 +margin_right = 95.0 +margin_bottom = 39.0 + +[node name="PortraitPicker" parent="HBox" instance=ExtResource( 1 )] +visible = false +margin_left = 100.0 +margin_top = 13.0 +margin_right = 264.0 +margin_bottom = 35.0 + +[node name="DefinitionPicker" parent="HBox" instance=ExtResource( 4 )] +visible = false +margin_left = 100.0 +margin_top = 13.0 +margin_right = 198.0 +margin_bottom = 35.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterPicker.tscn new file mode 100644 index 0000000..6065cb0 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterPicker.tscn @@ -0,0 +1,53 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterPicker.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Theme/PickerTheme.tres" type="Theme" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=4] + +[node name="CharacterPicker" type="VBoxContainer"] +margin_right = 161.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 0, 30 ) +size_flags_vertical = 4 +theme = ExtResource( 3 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 161.0 +margin_bottom = 30.0 +size_flags_vertical = 3 +custom_constants/separation = 5 + +[node name="MenuButton" parent="HBox" instance=ExtResource( 4 )] +margin_top = 4.0 +margin_right = 95.0 +margin_bottom = 26.0 +text = "Character" + +[node name="NoCharacterContainer" type="HBoxContainer" parent="."] +visible = false +margin_top = 26.0 +margin_right = 399.0 +margin_bottom = 46.0 + +[node name="NoCharacterLabel1" type="Label" parent="NoCharacterContainer"] +margin_top = 3.0 +margin_right = 261.0 +margin_bottom = 17.0 +text = "You haven't created a character yet. Click" + +[node name="NoCharacterButton" type="Button" parent="NoCharacterContainer"] +margin_left = 265.0 +margin_right = 306.0 +margin_bottom = 20.0 +text = "here" + +[node name="NoCharacterLabel2" type="Label" parent="NoCharacterContainer"] +margin_left = 310.0 +margin_top = 3.0 +margin_right = 399.0 +margin_bottom = 17.0 +text = "to create one." diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterAndPortraitPicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterAndPortraitPicker.gd new file mode 100644 index 0000000..69c5278 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterAndPortraitPicker.gd @@ -0,0 +1,78 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + + +## node references +onready var character_picker = $HBox/CharacterPicker +onready var portrait_picker = $HBox/PortraitPicker +onready var definition_picker = $HBox/DefinitionPicker + +# used to connect the signals +func _ready(): + if DialogicUtil.get_character_list().size() == 0: + hide() + character_picker.connect("data_changed", self, "_on_CharacterPicker_data_changed") + portrait_picker.connect("data_changed", self, "_on_PortraitPicker_data_changed") + definition_picker.connect("data_changed", self, "_on_DefinitionPicker_data_changed") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + portrait_picker.load_data(data) + character_picker.load_data(data) + + portrait_picker.visible = get_character_data() and len(get_character_data()['portraits']) > 1 + + if data['event_id'] == 'dialogic_002': + if data.get('type', 0) != 1: # FOR JOIN AND UPDATE: + var has_port_defn = data['portrait'] == '[Definition]' + if portrait_picker.visible and has_port_defn and data.has('port_defn'): + definition_picker.load_data({ 'definition': data['port_defn'] }) + definition_picker.visible = has_port_defn + else: + portrait_picker.hide() + definition_picker.hide() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +func get_character_data(): + for ch in DialogicUtil.get_character_list(): + if ch['file'] == event_data['character']: + return ch + + +func _on_CharacterPicker_data_changed(data): + event_data = data + + # update the portrait picker data + portrait_picker.load_data(data) + portrait_picker.visible = get_character_data() and len(get_character_data()['portraits']) > 1 + if !portrait_picker.visible: + definition_picker.hide() + + # informs the parent about the changes! + data_changed() + + +func _on_PortraitPicker_data_changed(data): + event_data = data + + # update the portrait picker data + character_picker.load_data(data) + definition_picker.visible = event_data['portrait'] == '[Definition]' + + # informs the parent about the changes! + data_changed() + + +func _on_DefinitionPicker_data_changed(data): + event_data['port_defn'] = data['definition'] + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterPicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterPicker.gd new file mode 100644 index 0000000..0e49466 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_CharacterPicker.gd @@ -0,0 +1,156 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +export (bool) var allow_no_character := false + +## node references +onready var picker_menu = $HBox/MenuButton +onready var no_character_button = $NoCharacterContainer/NoCharacterButton +onready var no_character_container = $NoCharacterContainer + +# theme +var no_character_icon +var all_characters_icon +var single_character_icon + + +func _ready(): + if DialogicUtil.get_character_list().size() > 0: + picker_menu.show() + no_character_container.hide() + else: + picker_menu.hide() + no_character_container.show() + var editor_reference = find_parent('EditorView') + no_character_button.connect('pressed', editor_reference.get_node('MainPanel/MasterTreeContainer/MasterTree'), 'new_character') + + # So... not having real events makes me do this kind of hacks + # I hope to improve how events work, but in the mean time + # this is what I have to do to get by :') + var event_node = get_node('../../../../../../../..') + if event_node.get_node_or_null('AllowNoCharacter'): + allow_no_character = true + no_character_container.hide()#We dont want the button on text events + + # Connections + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + + # Themeing + no_character_icon = get_icon("GuiRadioUnchecked", "EditorIcons") + all_characters_icon = get_icon("GuiEllipsis", "EditorIcons") + single_character_icon = load("res://addons/dialogic/Images/Resources/character.svg") + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + allow_no_character = data['event_id'] != 'dialogic_002' + # Now update the ui nodes to display the data. + update_to_character() + + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +# helper to not have the same code everywhere +func update_to_character(): + if event_data['character'] != '': + if event_data['character'] == '[All]': + picker_menu.text = "All characters" + picker_menu.reset_modulation() + picker_menu.custom_icon = all_characters_icon + else: + for ch in DialogicUtil.get_character_list(): + if ch['file'] == event_data['character']: + picker_menu.text = ch['name'] + picker_menu.custom_icon_modulation = ch['color'] + picker_menu.custom_icon = single_character_icon + else: + if allow_no_character: + picker_menu.text = 'No Character' + picker_menu.custom_icon = no_character_icon + else: + picker_menu.text = 'Select Character' + picker_menu.custom_icon = single_character_icon + picker_menu.reset_modulation() + +# when an index is selected on one of the menus. +func _on_PickerMenu_selected(index, menu): + var metadata = menu.get_item_metadata(index) + if event_data['character'] != metadata.get('file',''): + if event_data.get('event_id') == 'dialogic_002': + if event_data.get('type') == 0: + event_data['portrait'] = 'Default' + elif event_data.get('type') == 2: + event_data['portrait'] = "(Don't change)" + event_data['character'] = metadata.get('file','') + + update_to_character() + + # informs the parent about the changes! + data_changed() + + +func _on_PickerMenu_about_to_show(): + build_PickerMenu() + + +func build_PickerMenu(): + picker_menu.get_popup().clear() + var folder_structure = DialogicUtil.get_characters_folder_structure() + + ## building the root level + build_PickerMenuFolder(picker_menu.get_popup(), folder_structure, "MenuButton") + + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + + ## THIS IS JUST FOR THE ROOT FOLDER + if menu == picker_menu.get_popup(): + if event_data.get('event_id', 'dialogic_001') != 'dialogic_002': + menu.add_item('No character') + menu.set_item_metadata(index, {'file':''}) + menu.set_item_icon(index, no_character_icon) + index += 1 + + # in case this is a leave event + if event_data.get('type', 0) == 1: + menu.add_item('All characters') + menu.set_item_metadata(index, {'file': '[All]'}) + menu.set_item_icon(index, all_characters_icon) + index += 1 + + + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + index += 1 + + # give it the right style + picker_menu.update_submenu_style(submenu) + + var files_info = DialogicUtil.get_characters_dict() + for file in folder_structure['files']: + menu.add_item(files_info[file]['name']) + # this doesn't work right now, because it doesn't have the editor_reference. Would be nice though + #menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").character_icon) + menu.set_item_icon(index, single_character_icon) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_PickerMenu_selected"): + menu.connect("index_pressed", self, '_on_PickerMenu_selected', [menu]) + + return current_folder_name diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_PortraitPicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_PortraitPicker.gd new file mode 100644 index 0000000..4cdf032 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_PortraitPicker.gd @@ -0,0 +1,170 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +export (bool) var allow_dont_change := true +export (bool) var allow_definition := true + +## node references +onready var picker_menu = $HBox/MenuButton +onready var preview = $Preview/PreviewContainer +onready var preview_title = preview.get_node("VBox/Title") +onready var preview_texture = preview.get_node("VBox/TextureRect") +var current_hovered = null + +var character_data = null + +# theme +var no_change_icon +var definition_icon +var portrait_icon + + +# used to connect the signals +func _ready(): + picker_menu.get_popup().connect("index_pressed", self, '_on_PickerMenu_selected') + picker_menu.get_popup().connect("gui_input", self, "popup_gui_input") + picker_menu.get_popup().connect("mouse_exited", self, "mouse_exited_popup") + picker_menu.get_popup().connect("popup_hide", self, "mouse_exited_popup") + + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + preview_title.set('custom_fonts/font', get_font("title", "EditorFonts")) + preview.set('custom_styles/panel', get_stylebox("panel", "PopupMenu")) + + # Themeing + no_change_icon = get_icon("GuiRadioUnchecked", "EditorIcons") + definition_icon = load("res://addons/dialogic/Images/Resources/definition.svg") + portrait_icon = load("res://addons/dialogic/Images/Event Icons/Portrait.svg") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + allow_dont_change = event_data['event_id'] != 'dialogic_002' or (event_data['event_id'] == 'dialogic_002' and int(event_data.get('type', 0)) == 2) + + if event_data['event_id'] == 'dialogic_002' and event_data['type'] == 2: + $HBox/Label.text = "to portrait" + else: + $HBox/Label.text = "with portrait" + + # Now update the ui nodes to display the data. + if event_data.get('portrait', '').empty(): + # if this is a text/question event or character event in update mode + if allow_dont_change: + picker_menu.text = "(Don't change)" + picker_menu.custom_icon = no_change_icon + else: + picker_menu.text = "Default" + picker_menu.custom_icon = portrait_icon + else: + if event_data['portrait'] == "[Definition]": + picker_menu.text = "[Value]" + picker_menu.custom_icon = definition_icon + else: + picker_menu.text = event_data['portrait'] + picker_menu.custom_icon = portrait_icon + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_PickerMenu_selected(index): + if index == 0 and allow_dont_change: + event_data['portrait'] = "(Don't change)" + picker_menu.custom_icon = no_change_icon + elif allow_definition and ((allow_dont_change and index == 1) or index == 0): + event_data['portrait'] = "[Definition]" + picker_menu.custom_icon = definition_icon + else: + event_data['portrait'] = picker_menu.get_popup().get_item_text(index) + picker_menu.custom_icon = portrait_icon + # TODO in 2.0 + if event_data['portrait'] == "[Definition]": + picker_menu.text = "[Value]" + else: + picker_menu.text = event_data['portrait'] + + # informs the parent about the changes! + data_changed() + +func get_character_data(): + for ch in DialogicUtil.get_character_list(): + if ch['file'] == event_data['character']: + return ch + +func _on_PickerMenu_about_to_show(): + character_data = get_character_data() + picker_menu.get_popup().clear() + var index = 0 + if allow_dont_change: + picker_menu.get_popup().add_item("(Don't change)") + picker_menu.get_popup().set_item_icon(index, no_change_icon) + index += 1 + if allow_definition: + picker_menu.get_popup().add_item("[Value]") + picker_menu.get_popup().set_item_icon(index, definition_icon) + index += 1 + if event_data['character']: + if character_data.has('portraits'): + for p in character_data['portraits']: + picker_menu.get_popup().add_item(p['name']) + picker_menu.get_popup().set_item_icon(index, portrait_icon) + index += 1 + +func popup_gui_input(event): + if event is InputEventMouseMotion: + if current_hovered != picker_menu.get_popup().get_current_index(): + current_hovered = picker_menu.get_popup().get_current_index() + + # hide if this is not a previewable portrait + # this isn't even an item + if current_hovered == -1: + preview.hide() + return + var idx_add = 0 + if allow_dont_change: + idx_add -= 1 + if current_hovered == 0: + preview.hide() + return + if allow_definition and current_hovered == 1: + preview.hide() + return + if allow_definition: + idx_add -= 1 + if not allow_dont_change and current_hovered == 0: + preview.hide() + return + + ## show the preview + preview.rect_position.x = picker_menu.get_popup().rect_size.x + 130 + var current = character_data['portraits'][current_hovered + idx_add] + preview_title.text = ' ' + current['name'] + preview_title.icon = null + if current['path']: + if current['path'].ends_with('.tscn'): + preview_texture.expand = false + var editor_reference = find_parent('EditorView') + if editor_reference and editor_reference.editor_interface: + editor_reference.editor_interface.get_resource_previewer().queue_resource_preview(current['path'], self, "show_scene_preview", null) + preview_title.icon = get_icon("PackedScene", "EditorIcons") + return + else: + preview_title.icon = get_icon("Sprite", "EditorIcons") + preview_texture.expand = true + preview_texture.texture = load(current['path']) + else: + preview_texture.texture = null + preview.show() + + +func mouse_exited_popup(): + preview.hide() + current_hovered = null + + +func show_scene_preview(path:String, preview:Texture, user_data): + if preview: + preview_texture.texture = preview diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/PortraitPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/PortraitPicker.tscn new file mode 100644 index 0000000..4d9fa1e --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/PortraitPicker.tscn @@ -0,0 +1,115 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/EventPart_PortraitPicker.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=7] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 19, 0, 0, 0, 25, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 25, 0, 0, 0, 19, 0, 0, 0, 10, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, 22, 0, 0, 0, 39, 0, 0, 0, 53, 0, 0, 0, 63, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 63, 0, 0, 0, 53, 0, 0, 0, 39, 0, 0, 0, 22, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 39, 59, 59, 67, 148, 66, 66, 75, 245, 62, 62, 71, 250, 62, 62, 70, 251, 62, 62, 70, 251, 62, 62, 70, 251, 62, 62, 70, 251, 62, 62, 71, 250, 66, 66, 75, 245, 59, 59, 67, 148, 0, 0, 0, 39, 0, 0, 0, 19, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 25, 0, 0, 0, 53, 65, 65, 74, 245, 47, 47, 54, 255, 45, 45, 51, 255, 45, 45, 51, 255, 45, 45, 51, 255, 45, 45, 51, 255, 45, 45, 51, 255, 45, 45, 51, 255, 47, 47, 54, 255, 65, 65, 74, 245, 0, 0, 0, 53, 0, 0, 0, 25, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 31, 0, 0, 0, 64, 61, 61, 69, 252, 45, 45, 51, 255, 44, 44, 50, 255, 44, 44, 50, 255, 44, 44, 50, 255, 44, 44, 50, 255, 44, 44, 50, 255, 44, 44, 50, 255, 45, 45, 51, 255, 61, 61, 69, 252, 0, 0, 0, 64, 0, 0, 0, 31, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 69, 59, 59, 67, 251, 44, 44, 50, 255, 43, 43, 49, 255, 43, 43, 49, 255, 43, 43, 49, 255, 43, 43, 49, 255, 43, 43, 49, 255, 43, 43, 49, 255, 44, 44, 50, 255, 59, 59, 67, 251, 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 70, 58, 58, 66, 251, 42, 42, 49, 255, 42, 42, 48, 255, 42, 42, 48, 255, 42, 42, 48, 255, 42, 42, 48, 255, 42, 42, 48, 255, 42, 42, 48, 255, 42, 42, 49, 255, 58, 58, 66, 251, 0, 0, 0, 70, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 70, 56, 56, 65, 251, 41, 41, 48, 255, 41, 41, 47, 255, 41, 41, 47, 255, 41, 41, 47, 255, 41, 41, 47, 255, 41, 41, 47, 255, 41, 41, 47, 255, 41, 41, 48, 255, 56, 56, 65, 251, 0, 0, 0, 70, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 69, 55, 55, 62, 251, 40, 40, 46, 255, 40, 40, 45, 255, 40, 40, 45, 255, 40, 40, 45, 255, 40, 40, 45, 255, 40, 40, 45, 255, 40, 40, 45, 255, 40, 40, 46, 255, 55, 55, 62, 251, 0, 0, 0, 69, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 31, 0, 0, 0, 64, 54, 54, 61, 252, 39, 39, 45, 255, 39, 39, 44, 255, 39, 39, 44, 255, 39, 39, 44, 255, 39, 39, 44, 255, 39, 39, 44, 255, 39, 39, 44, 255, 39, 39, 45, 255, 53, 53, 60, 252, 0, 0, 0, 64, 0, 0, 0, 31, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 26, 0, 0, 0, 53, 56, 56, 64, 245, 41, 41, 46, 255, 39, 39, 44, 255, 38, 38, 44, 255, 38, 38, 44, 255, 38, 38, 44, 255, 38, 38, 44, 255, 39, 39, 44, 255, 41, 41, 46, 255, 56, 56, 64, 246, 0, 0, 0, 53, 0, 0, 0, 26, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 39, 49, 49, 56, 149, 56, 56, 64, 245, 52, 52, 59, 250, 52, 52, 59, 251, 52, 52, 59, 251, 52, 52, 59, 251, 52, 52, 59, 251, 52, 52, 59, 250, 57, 57, 63, 244, 49, 49, 56, 148, 0, 0, 0, 39, 0, 0, 0, 19, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0, 22, 0, 0, 0, 39, 0, 0, 0, 53, 0, 0, 0, 64, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 63, 0, 0, 0, 53, 0, 0, 0, 39, 0, 0, 0, 22, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 10, 0, 0, 0, 19, 0, 0, 0, 25, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 25, 0, 0, 0, 19, 0, 0, 0, 10, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 7 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxTexture" id=3] +content_margin_left = 10.0 +content_margin_right = 10.0 +content_margin_top = 10.0 +content_margin_bottom = 10.0 +texture = SubResource( 2 ) +region_rect = Rect2( 0, 0, 16, 16 ) +margin_left = 4.0 +margin_right = 4.0 +margin_top = 4.0 +margin_bottom = 4.0 + +[sub_resource type="Image" id=8] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 254, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 255, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 254, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 255, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 255, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 72, 255, 255, 255, 205, 255, 255, 255, 249, 255, 255, 255, 218, 255, 255, 255, 73, 255, 255, 255, 92, 255, 255, 255, 218, 255, 255, 255, 246, 255, 255, 255, 199, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 194, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 203, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 152, 255, 255, 255, 193, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 202, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 98, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 219, 255, 255, 255, 217, 255, 255, 255, 12, 0, 0, 0, 0, 255, 255, 255, 94, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 217, 255, 255, 255, 55, 255, 255, 255, 20, 255, 255, 255, 156, 255, 255, 255, 243, 255, 255, 255, 201, 255, 255, 255, 44, 255, 255, 255, 23, 255, 255, 255, 179, 255, 255, 255, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 0, 0, 0, 0, 255, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 74, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 89, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 176, 255, 255, 255, 160, 255, 255, 255, 78, 0, 0, 0, 0, 255, 255, 255, 153, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 255, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 46, 255, 255, 255, 254, 255, 255, 255, 25, 0, 0, 0, 0, 255, 255, 255, 39, 255, 255, 255, 226, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 27, 0, 0, 0, 0, 255, 255, 255, 29, 255, 255, 255, 255, 255, 255, 255, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 227, 255, 255, 255, 4, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 213, 0, 0, 0, 0, 255, 255, 255, 143, 255, 255, 255, 106, 255, 255, 255, 96, 255, 255, 255, 151, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 97, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 96, 0, 0, 0, 0, 255, 255, 255, 103, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 250, 255, 255, 255, 15, 255, 255, 255, 219, 255, 255, 255, 30, 255, 255, 255, 26, 255, 255, 255, 222, 255, 255, 255, 16, 255, 255, 255, 250, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 170, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 85, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 164, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 50, 255, 255, 255, 243, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 95, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 97, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 239, 255, 255, 255, 9, 255, 255, 255, 242, 255, 255, 255, 17, 0, 0, 0, 0, 255, 255, 255, 23, 255, 255, 255, 230, 255, 255, 255, 5, 255, 255, 255, 242, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 196, 255, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 139, 255, 255, 255, 199, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 239, 255, 255, 255, 103, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 91, 255, 255, 255, 234, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 250, 255, 255, 255, 42, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 255, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 166, 255, 255, 255, 201, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 199, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 255, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 244, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 251, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 251, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 255, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 214, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 214, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 223, 255, 255, 255, 219, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 228, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 173, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 161, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 228, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 249, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 235, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 233, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 235, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 243, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 240, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 44, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 245, 255, 255, 255, 29, 255, 255, 255, 245, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 91, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 200, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 198, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 242, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 232, 255, 255, 255, 25, 255, 255, 255, 19, 255, 255, 255, 225, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 235, 255, 255, 255, 100, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 220, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 173, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 220, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 120, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 109, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 153, 255, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 194, 255, 255, 255, 182, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 237, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 236, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 236, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 255, 255, 255, 223, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 204, 255, 255, 255, 66, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 233, 255, 255, 255, 3, 255, 255, 255, 3, 255, 255, 255, 234, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 228, 255, 255, 255, 234, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 29, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 227, 255, 255, 255, 69, 255, 255, 255, 205, 255, 255, 255, 1, 255, 255, 255, 91, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 242, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 241, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 205, 255, 255, 255, 127, 255, 255, 255, 216, 255, 255, 255, 225, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 131, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 108, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 229, 255, 255, 255, 66, 255, 255, 255, 65, 255, 255, 255, 228, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 241, 255, 255, 255, 245, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 219, 255, 255, 255, 211, 255, 255, 255, 77, 255, 255, 255, 205, 255, 255, 255, 68, 255, 255, 255, 38, 255, 255, 255, 160, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 1, 255, 255, 255, 205, 255, 255, 255, 68, 255, 255, 255, 57, 255, 255, 255, 9, 255, 255, 255, 16, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 37, 255, 255, 255, 225, 255, 255, 255, 2, 255, 255, 255, 1, 255, 255, 255, 213, 255, 255, 255, 17, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 139, 255, 255, 255, 143, 255, 255, 255, 145, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 215, 255, 255, 255, 107, 255, 255, 255, 117, 255, 255, 255, 223, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 185, 255, 255, 255, 7, 255, 255, 255, 188, 255, 255, 255, 24, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 253, 255, 255, 255, 39, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 37, 255, 255, 255, 253, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 198, 255, 255, 255, 67, 255, 255, 255, 64, 255, 255, 255, 168, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 47, 255, 255, 255, 214, 255, 255, 255, 217, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 187, 255, 255, 255, 1, 255, 255, 255, 3, 255, 255, 255, 203, 255, 255, 255, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 220, 255, 255, 255, 48, 255, 255, 255, 149, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 220, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 191, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 104, 255, 255, 255, 161, 255, 255, 255, 163, 255, 255, 255, 69, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 238, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 46, 255, 255, 255, 249, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 163, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 255, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 247, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 163, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 169, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 237, 255, 255, 255, 215, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 11, 255, 255, 255, 221, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 222, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 229, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 229, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 219, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 171, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 221, 255, 255, 255, 218, 255, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 225, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 66, 255, 255, 255, 73, 255, 255, 255, 193, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 158, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 241, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 218, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 242, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 161, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 228, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 180, 255, 255, 255, 187, 255, 255, 255, 187, 255, 255, 255, 180, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 210, 255, 255, 255, 126, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 249, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 250, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 66, 255, 255, 255, 73, 255, 255, 255, 197, 255, 255, 255, 64, 255, 255, 255, 204, 255, 255, 255, 65, 255, 255, 255, 221, 255, 255, 255, 218, 255, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 91, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 155, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 155, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 180, 255, 255, 255, 187, 255, 255, 255, 187, 255, 255, 255, 180, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 217, 255, 255, 255, 248, 255, 255, 255, 217, 255, 255, 255, 71, 255, 255, 255, 113, 255, 255, 255, 232, 255, 255, 255, 234, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 43, 255, 255, 255, 165, 255, 255, 255, 229, 255, 255, 255, 235, 255, 255, 255, 220, 255, 255, 255, 137, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 32, 255, 255, 255, 79, 255, 255, 255, 205, 255, 255, 255, 202, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 249, 255, 255, 255, 224, 255, 255, 255, 158, 255, 255, 255, 244, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 151, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 219, 255, 255, 255, 220, 255, 255, 255, 61, 255, 255, 255, 202, 255, 255, 255, 66, 255, 255, 255, 202, 255, 255, 255, 66, 255, 255, 255, 73, 255, 255, 255, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 220, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 168, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 241, 255, 255, 255, 230, 255, 255, 255, 117, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 155, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 155, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 53, 255, 255, 255, 17, 255, 255, 255, 102, 255, 255, 255, 246, 255, 255, 255, 216, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 219, 255, 255, 255, 86, 255, 255, 255, 8, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 152, 255, 255, 255, 210, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 222, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 175, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 51, 255, 255, 255, 242, 255, 255, 255, 226, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 239, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 182, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 20, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255, 255, 37, 255, 255, 255, 254, 255, 255, 255, 10, 255, 255, 255, 21, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 168, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 192, 255, 255, 255, 239, 255, 255, 255, 178, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 253, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 226, 255, 255, 255, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 216, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 221, 255, 255, 255, 213, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 222, 255, 255, 255, 94, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 230, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 218, 255, 255, 255, 46, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 11, 255, 255, 255, 12, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 205, 255, 255, 255, 1, 255, 255, 255, 91, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 83, 255, 255, 255, 119, 255, 255, 255, 223, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 20, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 139, 255, 255, 255, 2, 255, 255, 255, 32, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 166, 255, 255, 255, 225, 255, 255, 255, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 119, 0, 0, 0, 0, 255, 255, 255, 37, 255, 255, 255, 198, 255, 255, 255, 228, 255, 255, 255, 224, 255, 255, 255, 28, 255, 255, 255, 39, 255, 255, 255, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 255, 255, 255, 247, 255, 255, 255, 62, 255, 255, 255, 119, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 190, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 111, 255, 255, 255, 160, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 197, 255, 255, 255, 65, 255, 255, 255, 73, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 1, 255, 255, 255, 205, 255, 255, 255, 68, 255, 255, 255, 38, 255, 255, 255, 160, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 183, 255, 255, 255, 234, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 189, 255, 255, 255, 173, 255, 255, 255, 14, 255, 255, 255, 2, 255, 255, 255, 255, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 42, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 106, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 23, 255, 255, 255, 2, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 204, 255, 255, 255, 143, 0, 0, 0, 0, 255, 255, 255, 85, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 250, 255, 255, 255, 43, 255, 255, 255, 251, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 227, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 219, 255, 255, 255, 220, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 185, 255, 255, 255, 7, 255, 255, 255, 188, 255, 255, 255, 24, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 19, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255, 255, 95, 255, 255, 255, 153, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 31, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255, 6, 255, 255, 255, 17, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 130, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 85, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 217, 255, 255, 255, 9, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 186, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 220, 255, 255, 255, 48, 255, 255, 255, 149, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 167, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 24, 255, 255, 255, 1, 255, 255, 255, 194, 255, 255, 255, 56, 255, 255, 255, 155, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 19, 0, 0, 0, 0, 255, 255, 255, 177, 255, 255, 255, 138, 255, 255, 255, 2, 255, 255, 255, 20, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 139, 255, 255, 255, 23, 255, 255, 255, 166, 255, 255, 255, 198, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 33, 255, 255, 255, 59, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 15, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 62, 255, 255, 255, 70, 255, 255, 255, 249, 255, 255, 255, 22, 255, 255, 255, 103, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 232, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 120, 255, 255, 255, 45, 255, 255, 255, 246, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 163, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 255, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 167, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 168, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 167, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 187, 255, 255, 255, 239, 255, 255, 255, 215, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 225, 255, 255, 255, 241, 255, 255, 255, 148, 255, 255, 255, 4, 255, 255, 255, 114, 255, 255, 255, 225, 255, 255, 255, 251, 255, 255, 255, 224, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 64, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 224, 255, 255, 255, 216, 255, 255, 255, 71, 255, 255, 255, 207, 255, 255, 255, 213, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 9, 255, 255, 255, 28, 255, 255, 255, 92, 255, 255, 255, 222, 255, 255, 255, 190, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 143, 255, 255, 255, 214, 255, 255, 255, 205, 255, 255, 255, 137, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 245, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 229, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 183, 255, 255, 255, 188, 255, 255, 255, 188, 255, 255, 255, 183, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 167, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 168, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 202, 255, 255, 255, 112, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 230, 255, 255, 255, 247, 255, 255, 255, 53, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 216, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 12, 255, 255, 255, 39, 255, 255, 255, 212, 255, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 183, 255, 255, 255, 188, 255, 255, 255, 188, 255, 255, 255, 183, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 190, 255, 255, 255, 172, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 240, 255, 255, 255, 171, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 148, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 248, 255, 255, 255, 240, 255, 255, 255, 158, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 113, 255, 255, 255, 204, 255, 255, 255, 239, 255, 255, 255, 237, 255, 255, 255, 221, 255, 255, 255, 153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 250, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 249, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 173, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 150, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 234, 255, 255, 255, 4, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 237, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 59, 255, 255, 255, 206, 255, 255, 255, 246, 255, 255, 255, 209, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 229, 255, 255, 255, 75, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 225, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 249, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 250, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 136, 255, 255, 255, 18, 255, 255, 255, 139, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 166, 0, 0, 0, 0, 255, 255, 255, 175, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 151, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 249, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 250, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 239, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 238, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 75, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 37, 255, 255, 255, 241, 255, 255, 255, 19, 255, 255, 255, 246, 255, 255, 255, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 239, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 151, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 212, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 162, 255, 255, 255, 194, 255, 255, 255, 71, 255, 255, 255, 230, 255, 255, 255, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 152, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 222, 255, 255, 255, 94, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 230, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 242, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 239, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 238, 255, 255, 255, 77, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 236, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 252, 255, 255, 255, 254, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 252, 255, 255, 255, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 190, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 222, 255, 255, 255, 94, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 230, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 196, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 59, 255, 255, 255, 238, 255, 255, 255, 145, 255, 255, 255, 221, 255, 255, 255, 166, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 250, 255, 255, 255, 43, 255, 255, 255, 251, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 190, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 236, 255, 255, 255, 121, 255, 255, 255, 233, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 130, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 224, 255, 255, 255, 158, 255, 255, 255, 26, 255, 255, 255, 230, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 186, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 250, 255, 255, 255, 43, 255, 255, 255, 251, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 119, 255, 255, 255, 255, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 227, 255, 255, 255, 243, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 186, 255, 255, 255, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 200, 255, 255, 255, 50, 255, 255, 255, 33, 255, 255, 255, 91, 255, 255, 255, 223, 255, 255, 255, 248, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 245, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 170, 255, 255, 255, 235, 255, 255, 255, 247, 255, 255, 255, 207, 255, 255, 255, 95, 255, 255, 255, 38, 255, 255, 255, 229, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 12, 255, 255, 255, 39, 255, 255, 255, 212, 255, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 245, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 221, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 248, 255, 255, 255, 240, 255, 255, 255, 158, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 12, 255, 255, 255, 39, 255, 255, 255, 212, 255, 255, 255, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 248, 255, 255, 255, 240, 255, 255, 255, 158, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 239, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 238, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 116, 255, 255, 255, 206, 255, 255, 255, 245, 255, 255, 255, 244, 255, 255, 255, 213, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 212, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 229, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 193, 255, 255, 255, 205, 255, 255, 255, 70, 255, 255, 255, 16, 255, 255, 255, 23, 255, 255, 255, 78, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 234, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 246, 255, 255, 255, 210, 255, 255, 255, 126, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 160, 255, 255, 255, 193, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 211, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 238, 255, 255, 255, 77, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 236, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 176, 255, 255, 255, 47, 255, 255, 255, 14, 255, 255, 255, 45, 255, 255, 255, 173, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 119, 255, 255, 255, 235, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 183, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 32, 255, 255, 255, 79, 255, 255, 255, 205, 255, 255, 255, 202, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 133, 255, 255, 255, 206, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 173, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 196, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 218, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 133, 0, 0, 0, 0, 255, 255, 255, 123, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 222, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 104, 255, 255, 255, 217, 255, 255, 255, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 206, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 236, 255, 255, 255, 121, 255, 255, 255, 233, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 240, 255, 255, 255, 252, 255, 255, 255, 243, 255, 255, 255, 240, 255, 255, 255, 252, 255, 255, 255, 243, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 255, 255, 255, 79, 255, 255, 255, 225, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 241, 255, 255, 255, 177, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 119, 255, 255, 255, 255, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 73, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 28, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 114, 255, 255, 255, 245, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 175, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 73, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 227, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 160, 255, 255, 255, 79, 255, 255, 255, 235, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 227, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 243, 255, 255, 255, 252, 255, 255, 255, 240, 255, 255, 255, 243, 255, 255, 255, 252, 255, 255, 255, 240, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 130, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 148, 255, 255, 255, 189, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 140, 255, 255, 255, 219, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 217, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 216, 255, 255, 255, 194, 255, 255, 255, 61, 255, 255, 255, 15, 255, 255, 255, 13, 255, 255, 255, 95, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 122, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 232, 255, 255, 255, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 219, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 225, 255, 255, 255, 187, 255, 255, 255, 44, 255, 255, 255, 13, 255, 255, 255, 43, 255, 255, 255, 184, 255, 255, 255, 219, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 147, 255, 255, 255, 226, 255, 255, 255, 252, 255, 255, 255, 246, 255, 255, 255, 218, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 71, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 9, 255, 255, 255, 28, 255, 255, 255, 92, 255, 255, 255, 222, 255, 255, 255, 190, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 247, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 155, 255, 255, 255, 230, 255, 255, 255, 250, 255, 255, 255, 228, 255, 255, 255, 150, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 231, 255, 255, 255, 21, 0, 0, 0, 0, 255, 255, 255, 231, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 242, 255, 255, 255, 202, 255, 255, 255, 112, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 217, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 213, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 155, 255, 255, 255, 232, 255, 255, 255, 230, 255, 255, 255, 154, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 228, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 180, 255, 255, 255, 18, 255, 255, 255, 15, 255, 255, 255, 165, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 244, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 189, 255, 255, 255, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 255, 255, 255, 242, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 156, 255, 255, 255, 181, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 161, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 2, 0, 0, 0, 0, 255, 255, 255, 195, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 222, 255, 255, 255, 98, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 221, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 142, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 231, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 39, 255, 255, 255, 221, 255, 255, 255, 7, 255, 255, 255, 211, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 243, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 235, 255, 255, 255, 165, 255, 255, 255, 208, 255, 255, 255, 165, 255, 255, 255, 234, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 234, 255, 255, 255, 48, 255, 255, 255, 234, 255, 255, 255, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 255, 255, 255, 12, 255, 255, 255, 227, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 158, 255, 255, 255, 177, 255, 255, 255, 16, 255, 255, 255, 13, 255, 255, 255, 162, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 172, 255, 255, 255, 101, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 204, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 40, 255, 255, 255, 116, 255, 255, 255, 244, 255, 255, 255, 114, 255, 255, 255, 40, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 246, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 229, 255, 255, 255, 13, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 157, 255, 255, 255, 234, 255, 255, 255, 232, 255, 255, 255, 159, 255, 255, 255, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 213, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 221, 255, 255, 255, 4, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 217, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 23, 255, 255, 255, 228, 255, 255, 255, 85, 255, 255, 255, 227, 255, 255, 255, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 228, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 145, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 228, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 188, 255, 255, 255, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 237, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 78, 255, 255, 255, 178, 0, 0, 0, 0, 255, 255, 255, 172, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 227, 255, 255, 255, 25, 255, 255, 255, 228, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 242, 255, 255, 255, 102, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 255, 255, 255, 242, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 141, 255, 255, 255, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 231, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 85, 255, 255, 255, 231, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 121, 255, 255, 255, 232, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 142, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 249, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 169, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 213, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 255, 255, 255, 12, 255, 255, 255, 227, 255, 255, 255, 84, 0, 0, 0, 0, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 229, 255, 255, 255, 13, 255, 255, 255, 68, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 229, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 145, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 242, 255, 255, 255, 95, 255, 255, 255, 25, 255, 255, 255, 24, 255, 255, 255, 96, 255, 255, 255, 243, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 242, 255, 255, 255, 102, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 204, 255, 255, 255, 247, 255, 255, 255, 246, 255, 255, 255, 200, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 121, 255, 255, 255, 232, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 213, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 35, 255, 255, 255, 235, 255, 255, 255, 70, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 234, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 39, 255, 255, 255, 255, 255, 255, 255, 42, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 235, 255, 255, 255, 123, 255, 255, 255, 235, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 199, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 255, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 37, 255, 255, 255, 188, 255, 255, 255, 244, 255, 255, 255, 231, 255, 255, 255, 167, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 255, 255, 255, 2, 255, 255, 255, 175, 255, 255, 255, 179, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 235, 255, 255, 255, 119, 255, 255, 255, 235, 255, 255, 255, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 198, 255, 255, 255, 169, 255, 255, 255, 22, 255, 255, 255, 40, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 224, 255, 255, 255, 149, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 147, 255, 255, 255, 228, 255, 255, 255, 248, 255, 255, 255, 223, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 92, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 53, 255, 255, 255, 146, 255, 255, 255, 199, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 234, 255, 255, 255, 66, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 234, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 54, 255, 255, 255, 211, 255, 255, 255, 166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 217, 255, 255, 255, 188, 255, 255, 255, 50, 255, 255, 255, 17, 255, 255, 255, 61, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 163, 255, 255, 255, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 191, 255, 255, 255, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 15, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 132, 255, 255, 255, 229, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 216, 255, 255, 255, 24, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 244, 255, 255, 255, 19, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 234, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 172, 255, 255, 255, 166, 255, 255, 255, 183, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 74, 255, 255, 255, 249, 255, 255, 255, 193, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 131, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 214, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 255, 255, 255, 13, 255, 255, 255, 223, 255, 255, 255, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 175, 255, 255, 255, 253, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 55, 255, 255, 255, 212, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 15, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 239, 255, 255, 255, 14, 255, 255, 255, 207, 255, 255, 255, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 246, 255, 255, 255, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 139, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 179, 255, 255, 255, 228, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 134, 255, 255, 255, 216, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 78, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 176, 255, 255, 255, 13, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 95, 255, 255, 255, 21, 255, 255, 255, 28, 255, 255, 255, 180, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 235, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 223, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 47, 255, 255, 255, 225, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 15, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 195, 255, 255, 255, 243, 255, 255, 255, 240, 255, 255, 255, 174, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 213, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 227, 255, 255, 255, 197, 255, 255, 255, 53, 255, 255, 255, 14, 255, 255, 255, 33, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 51, 255, 255, 255, 52, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 227, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 238, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 157, 255, 255, 255, 230, 255, 255, 255, 253, 255, 255, 255, 242, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 192, 255, 255, 255, 230, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 249, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 75, 255, 255, 255, 209, 255, 255, 255, 246, 255, 255, 255, 201, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 127, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 143, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 217, 255, 255, 255, 52, 255, 255, 255, 22, 255, 255, 255, 176, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 67, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 227, 255, 255, 255, 170, 255, 255, 255, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 202, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 9, 255, 255, 255, 239, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 147, 255, 255, 255, 18, 255, 255, 255, 147, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 15, 255, 255, 255, 50, 255, 255, 255, 189, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 239, 255, 255, 255, 251, 255, 255, 255, 206, 255, 255, 255, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 212, 255, 255, 255, 242, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 81, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 204, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 141, 255, 255, 255, 246, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 255, 255, 255, 5, 255, 255, 255, 37, 255, 255, 255, 182, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 243, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 232, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 231, 255, 255, 255, 20, 255, 255, 255, 254, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 163, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 161, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 158, 255, 255, 255, 35, 255, 255, 255, 35, 255, 255, 255, 127, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 162, 255, 255, 255, 124, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 12, 255, 255, 255, 63, 255, 255, 255, 217, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 179, 255, 255, 255, 241, 255, 255, 255, 236, 255, 255, 255, 169, 255, 255, 255, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 247, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 53, 255, 255, 255, 230, 255, 255, 255, 11, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 131, 255, 255, 255, 34, 255, 255, 255, 38, 255, 255, 255, 191, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 147, 255, 255, 255, 228, 255, 255, 255, 248, 255, 255, 255, 223, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 75, 255, 255, 255, 209, 255, 255, 255, 246, 255, 255, 255, 201, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 215, 255, 255, 255, 110, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 164, 255, 255, 255, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 134, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 255, 255, 255, 255, 77, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 217, 255, 255, 255, 188, 255, 255, 255, 50, 255, 255, 255, 17, 255, 255, 255, 61, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 217, 255, 255, 255, 52, 255, 255, 255, 22, 255, 255, 255, 176, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 205, 255, 255, 255, 229, 255, 255, 255, 223, 255, 255, 255, 155, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 15, 255, 255, 255, 62, 255, 255, 255, 220, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 132, 255, 255, 255, 229, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 221, 255, 255, 255, 131, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 219, 255, 255, 255, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 176, 255, 255, 255, 175, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 106, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 178, 255, 255, 255, 228, 255, 255, 255, 228, 255, 255, 255, 236, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 161, 255, 255, 255, 193, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 182, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 161, 255, 255, 255, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 154, 255, 255, 255, 197, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 168, 255, 255, 255, 230, 255, 255, 255, 249, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 146, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 244, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 14, 255, 255, 255, 160, 255, 255, 255, 237, 255, 255, 255, 232, 255, 255, 255, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 218, 255, 255, 255, 50, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 223, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 227, 255, 255, 255, 167, 255, 255, 255, 45, 255, 255, 255, 24, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 166, 255, 255, 255, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 116, 255, 255, 255, 217, 255, 255, 255, 246, 255, 255, 255, 165, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 206, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 152, 255, 255, 255, 195, 255, 255, 255, 37, 255, 255, 255, 60, 255, 255, 255, 226, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 227, 255, 255, 255, 197, 255, 255, 255, 53, 255, 255, 255, 14, 255, 255, 255, 33, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 210, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 243, 255, 255, 255, 250, 255, 255, 255, 230, 255, 255, 255, 150, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 208, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 219, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 104, 255, 255, 255, 219, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 230, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 101, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 27, 255, 255, 255, 157, 255, 255, 255, 230, 255, 255, 255, 253, 255, 255, 255, 242, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 36, 255, 255, 255, 22, 255, 255, 255, 65, 255, 255, 255, 216, 255, 255, 255, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 237, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 129, 255, 255, 255, 211, 255, 255, 255, 243, 255, 255, 255, 183, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 152, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 168, 255, 255, 255, 14, 255, 255, 255, 31, 255, 255, 255, 189, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 194, 255, 255, 255, 36, 255, 255, 255, 16, 255, 255, 255, 174, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 238, 255, 255, 255, 228, 255, 255, 255, 228, 255, 255, 255, 228, 255, 255, 255, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 30, 255, 255, 255, 184, 255, 255, 255, 244, 255, 255, 255, 211, 255, 255, 255, 129, 255, 255, 255, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 120, 255, 255, 255, 44, 255, 255, 255, 21, 255, 255, 255, 63, 255, 255, 255, 219, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 235, 255, 255, 255, 198, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 121, 255, 255, 255, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 231, 255, 255, 255, 146, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 173, 255, 255, 255, 238, 255, 255, 255, 249, 255, 255, 255, 216, 255, 255, 255, 123, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 211, 255, 255, 255, 40, 255, 255, 255, 41, 255, 255, 255, 222, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 89, 255, 255, 255, 255, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 56, 255, 255, 255, 213, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 33, 255, 255, 255, 177, 255, 255, 255, 240, 255, 255, 255, 240, 255, 255, 255, 176, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 229, 255, 255, 255, 62, 255, 255, 255, 37, 255, 255, 255, 196, 255, 255, 255, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 118, 255, 255, 255, 220, 255, 255, 255, 247, 255, 255, 255, 156, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 188, 255, 255, 255, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 5, 255, 255, 255, 19, 255, 255, 255, 142, 255, 255, 255, 228, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 92, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 166, 255, 255, 255, 33, 255, 255, 255, 35, 255, 255, 255, 168, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 140, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 234, 255, 255, 255, 237, 255, 255, 255, 159, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 255, 255, 255, 66, 255, 255, 255, 204, 255, 255, 255, 76, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 54, 255, 255, 255, 250, 255, 255, 255, 233, 255, 255, 255, 174, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 62, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 224, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 206, 255, 255, 255, 247, 255, 255, 255, 228, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 73, 255, 255, 255, 198, 255, 255, 255, 72, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 16, 255, 255, 255, 63, 255, 255, 255, 219, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 173, 255, 255, 255, 12, 255, 255, 255, 12, 255, 255, 255, 179, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 227, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 232, 255, 255, 255, 101, 255, 255, 255, 15, 255, 255, 255, 47, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 203, 255, 255, 255, 181, 255, 255, 255, 195, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 223, 255, 255, 255, 132, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 187, 255, 255, 255, 238, 255, 255, 255, 237, 255, 255, 255, 153, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 156, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 111, 255, 255, 255, 255, 255, 255, 255, 91, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 232, 255, 255, 255, 68, 255, 255, 255, 111, 255, 255, 255, 238, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 246, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 251, 255, 255, 255, 241, 255, 255, 255, 135, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 96, 255, 255, 255, 203, 255, 255, 255, 238, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 137, 255, 255, 255, 239, 255, 255, 255, 236, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 175, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 55, 255, 255, 255, 206, 255, 255, 255, 246, 255, 255, 255, 211, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 96, 255, 255, 255, 42, 255, 255, 255, 201, 255, 255, 255, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 231, 255, 255, 255, 49, 255, 255, 255, 52, 255, 255, 255, 234, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 35, 255, 255, 255, 252, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 147, 255, 255, 255, 17, 255, 255, 255, 134, 255, 255, 255, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 73, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 180, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 176, 255, 255, 255, 33, 255, 255, 255, 37, 255, 255, 255, 185, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 64, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 234, 255, 255, 255, 97, 255, 255, 255, 127, 255, 255, 255, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 244, 255, 255, 255, 96, 255, 255, 255, 28, 255, 255, 255, 39, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 193, 255, 255, 255, 244, 255, 255, 255, 239, 255, 255, 255, 181, 255, 255, 255, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 247, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 83, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 28, 255, 255, 255, 176, 255, 255, 255, 239, 255, 255, 255, 236, 255, 255, 255, 164, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 244, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 155, 255, 255, 255, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 196, 255, 255, 255, 255, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 109, 255, 255, 255, 40, 255, 255, 255, 35, 255, 255, 255, 175, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 208, 255, 255, 255, 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 29, 255, 255, 255, 156, 255, 255, 255, 224, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 107, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 231, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 242, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 156, 255, 255, 255, 45, 255, 255, 255, 241, 255, 255, 255, 48, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 90, 255, 255, 255, 25, 255, 255, 255, 17, 255, 255, 255, 122, 255, 255, 255, 218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 59, 255, 255, 255, 211, 255, 255, 255, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 232, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 225, 255, 255, 255, 84, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 131, 255, 255, 255, 242, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 232, 255, 255, 255, 107, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 194, 255, 255, 255, 243, 255, 255, 255, 244, 255, 255, 255, 194, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 149, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 135, 255, 255, 255, 208, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 184, 255, 255, 255, 136, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 138, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 176, 255, 255, 255, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 226, 255, 255, 255, 227, 255, 255, 255, 246, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 242, 255, 255, 255, 92, 255, 255, 255, 27, 255, 255, 255, 37, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 29, 255, 255, 255, 80, 255, 255, 255, 225, 255, 255, 255, 157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 247, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 236, 255, 255, 255, 50, 255, 255, 255, 59, 255, 255, 255, 238, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 62, 255, 255, 255, 252, 255, 255, 255, 241, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 219, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 255, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 180, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 238, 255, 255, 255, 239, 255, 255, 255, 138, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 111, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 76, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 242, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 125, 255, 255, 255, 59, 255, 255, 255, 23, 255, 255, 255, 242, 255, 255, 255, 143, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 221, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 48, 255, 255, 255, 24, 255, 255, 255, 66, 255, 255, 255, 220, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 227, 255, 255, 255, 250, 255, 255, 255, 254, 255, 255, 255, 196, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 205, 255, 255, 255, 247, 255, 255, 255, 228, 255, 255, 255, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 190, 255, 255, 255, 243, 255, 255, 255, 218, 255, 255, 255, 101, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 164, 255, 255, 255, 234, 255, 255, 255, 249, 255, 255, 255, 221, 255, 255, 255, 133, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 223, 255, 255, 255, 123, 255, 255, 255, 16, 255, 255, 255, 51, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 234, 255, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 246, 255, 255, 255, 189, 255, 255, 255, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 81, 255, 255, 255, 217, 255, 255, 255, 246, 255, 255, 255, 165, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 24, 255, 255, 255, 137, 255, 255, 255, 248, 255, 255, 255, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 219, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 93, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 161, 255, 255, 255, 246, 255, 255, 255, 215, 255, 255, 255, 78, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 93, 255, 255, 255, 25, 255, 255, 255, 18, 255, 255, 255, 142, 255, 255, 255, 210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 223, 255, 255, 255, 42, 255, 255, 255, 44, 255, 255, 255, 214, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 161, 255, 255, 255, 246, 255, 255, 255, 217, 255, 255, 255, 113, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 15, 255, 255, 255, 193, 255, 255, 255, 243, 255, 255, 255, 244, 255, 255, 255, 193, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 106, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 223, 255, 255, 255, 42, 255, 255, 255, 44, 255, 255, 255, 215, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 38, 255, 255, 255, 170, 255, 255, 255, 214, 255, 255, 255, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 116, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 106, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 26, 255, 255, 255, 152, 255, 255, 255, 212, 255, 255, 255, 91, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 242, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 211, 255, 255, 255, 40, 255, 255, 255, 41, 255, 255, 255, 222, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 180, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 101, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 118, 255, 255, 255, 220, 255, 255, 255, 247, 255, 255, 255, 156, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 242, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 171, 255, 255, 255, 216, 255, 255, 255, 92, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 218, 255, 255, 255, 40, 255, 255, 255, 37, 255, 255, 255, 205, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 242, 255, 255, 255, 207, 255, 255, 255, 88, 255, 255, 255, 18, 255, 255, 255, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 212, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 101, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 49, 255, 255, 255, 181, 255, 255, 255, 216, 255, 255, 255, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 165, 255, 255, 255, 247, 255, 255, 255, 220, 255, 255, 255, 116, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 19, 255, 255, 255, 88, 255, 255, 255, 211, 255, 255, 255, 244, 255, 255, 255, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 122, 255, 255, 255, 218, 255, 255, 255, 40, 255, 255, 255, 37, 255, 255, 255, 206, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 89, 255, 255, 255, 214, 255, 255, 255, 169, 255, 255, 255, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 165, 255, 255, 255, 247, 255, 255, 255, 220, 255, 255, 255, 82, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 91, 255, 255, 255, 211, 255, 255, 255, 152, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 110, 255, 255, 255, 209, 255, 255, 255, 246, 255, 255, 255, 201, 255, 255, 255, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 177, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 218, 255, 255, 255, 52, 255, 255, 255, 22, 255, 255, 255, 176, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 92, 255, 255, 255, 215, 255, 255, 255, 171, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 105, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 72, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 92, 255, 255, 255, 216, 255, 255, 255, 180, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 190, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 72, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 108, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 104, 255, 255, 255, 85, 255, 255, 255, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 110, 255, 255, 255, 239, 255, 255, 255, 142, 255, 255, 255, 32, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 175, 255, 255, 255, 22, 255, 255, 255, 53, 255, 255, 255, 217, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 67, 255, 255, 255, 253, 255, 255, 255, 240, 255, 255, 255, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 34, 255, 255, 255, 142, 255, 255, 255, 240, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 36, 255, 255, 255, 194, 255, 255, 255, 245, 255, 255, 255, 219, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 231, 255, 255, 255, 146, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 48, 255, 255, 255, 206, 255, 255, 255, 248, 255, 255, 255, 209, 255, 255, 255, 76, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 174, 255, 255, 255, 73, 255, 255, 255, 181, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 189, 255, 255, 255, 176, 255, 255, 255, 28, 255, 255, 255, 61, 255, 255, 255, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 13, 255, 255, 255, 56, 255, 255, 255, 213, 255, 255, 255, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 227, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 114, 255, 255, 255, 217, 255, 255, 255, 246, 255, 255, 255, 165, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 12, 255, 255, 255, 161, 255, 255, 255, 238, 255, 255, 255, 220, 255, 255, 255, 191, 255, 255, 255, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 219, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 97, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 142, 255, 255, 255, 210, 255, 255, 255, 39, 255, 255, 255, 42, 255, 255, 255, 214, 255, 255, 255, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 16, 255, 255, 255, 63, 255, 255, 255, 219, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 224, 255, 255, 255, 98, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 96, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255, 252, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 255, 255, 255, 223, 255, 255, 255, 132, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 76, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 218, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 109, 255, 255, 255, 196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 255, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 128, 255, 255, 255, 213, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 217, 255, 255, 255, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 210, 255, 255, 255, 40, 255, 255, 255, 41, 255, 255, 255, 222, 255, 255, 255, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 210, 255, 255, 255, 39, 255, 255, 255, 36, 255, 255, 255, 36, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 7, 255, 255, 255, 142, 255, 255, 255, 231, 255, 255, 255, 239, 255, 255, 255, 137, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 75, 255, 255, 255, 220, 255, 255, 255, 247, 255, 255, 255, 156, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 139, 255, 255, 255, 238, 255, 255, 255, 238, 255, 255, 255, 132, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 115, 255, 255, 255, 219, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 219, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 112, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 113, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 133, 255, 255, 255, 224, 255, 255, 255, 244, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 77, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 233, 255, 255, 255, 71, 255, 255, 255, 35, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 239, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 88, 255, 255, 255, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 201, 255, 255, 255, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 255, 255, 255, 114, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 114, 255, 255, 255, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 234, 255, 255, 255, 131, 255, 255, 255, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 58, 255, 255, 255, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 157, 255, 255, 255, 60, 0, 0, 0, 0, 255, 255, 255, 156, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 99, 255, 255, 255, 220, 255, 255, 255, 42, 255, 255, 255, 42, 255, 255, 255, 221, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 52, 0, 0, 0, 0, 255, 255, 255, 180, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 180, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 255, 255, 255, 126, 255, 255, 255, 239, 255, 255, 255, 239, 255, 255, 255, 130, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 51, 255, 255, 255, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 124, 255, 255, 255, 233, 255, 255, 255, 235, 255, 255, 255, 151, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 52, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 183, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 127, 255, 255, 255, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 95, 255, 255, 255, 251, 255, 255, 255, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 215, 255, 255, 255, 44, 255, 255, 255, 30, 255, 255, 255, 196, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 156, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 157, 255, 255, 255, 62, 0, 0, 0, 0, 255, 255, 255, 156, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 230, 255, 255, 255, 67, 255, 255, 255, 36, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 43, 255, 255, 255, 248, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 237, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 2, 255, 255, 255, 133, 255, 255, 255, 224, 255, 255, 255, 244, 255, 255, 255, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 199, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 84, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 148, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 139, 255, 255, 255, 228, 255, 255, 255, 246, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 117, 255, 255, 255, 238, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 112, 255, 255, 255, 233, 255, 255, 255, 71, 255, 255, 255, 35, 255, 255, 255, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 238, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 126, 255, 255, 255, 216, 255, 255, 255, 225, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 255, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 209, 255, 255, 255, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 240, 255, 255, 255, 87, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 61, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 9, 255, 255, 255, 16, 255, 255, 255, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 111, 255, 255, 255, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 43, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 71, 255, 255, 255, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 6, 255, 255, 255, 225, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 187, 255, 255, 255, 172, 255, 255, 255, 36, 255, 255, 255, 65, 255, 255, 255, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 86, 255, 255, 255, 239, 255, 255, 255, 83, 255, 255, 255, 29, 255, 255, 255, 54, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 25, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 57, 255, 255, 255, 191, 255, 255, 255, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 196, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 228, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 34, 255, 255, 255, 190, 255, 255, 255, 245, 255, 255, 255, 221, 255, 255, 255, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 143, 255, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 225, 255, 255, 255, 252, 255, 255, 255, 228, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 169, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 51, 255, 255, 255, 192, 255, 255, 255, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 116, 255, 255, 255, 230, 255, 255, 255, 67, 255, 255, 255, 36, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 219, 255, 255, 255, 216, 255, 255, 255, 216, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 139, 255, 255, 255, 228, 255, 255, 255, 246, 255, 255, 255, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 254, 255, 255, 255, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 202, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 144, 255, 255, 255, 194, 255, 255, 255, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 142, 255, 255, 255, 14, 255, 255, 255, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 200, 255, 255, 255, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 202, 0, 0, 0, 0, 255, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 63, 255, 255, 255, 216, 255, 255, 255, 251, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 17, 255, 255, 255, 133, 255, 255, 255, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 193, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 91, 255, 255, 255, 210, 255, 255, 255, 245, 255, 255, 255, 210, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 251, 255, 255, 255, 95, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 218, 255, 255, 255, 249, 255, 255, 255, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 66, 255, 255, 255, 60, 255, 255, 255, 18, 255, 255, 255, 145, 255, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 79, 255, 255, 255, 238, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 226, 255, 255, 255, 127, 255, 255, 255, 15, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 129, 255, 255, 255, 217, 255, 255, 255, 245, 255, 255, 255, 195, 255, 255, 255, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 18, 255, 255, 255, 238, 255, 255, 255, 117, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 254, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 174, 255, 255, 255, 232, 255, 255, 255, 252, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 109, 255, 255, 255, 68, 255, 255, 255, 36, 255, 255, 255, 158, 255, 255, 255, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 61, 255, 255, 255, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 255, 255, 255, 255, 234, 255, 255, 255, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 192, 255, 255, 255, 188, 255, 255, 255, 45, 255, 255, 255, 71, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 76, 0, 0, 0, 0, 255, 255, 255, 87, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 159, 255, 255, 255, 198, 255, 255, 255, 207, 255, 255, 255, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 69, 255, 255, 255, 198, 255, 255, 255, 197, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 10, 255, 255, 255, 255, 255, 255, 255, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 220, 255, 255, 255, 131, 255, 255, 255, 27, 255, 255, 255, 192, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 5, 0, 0, 0, 0, 255, 255, 255, 4, 255, 255, 255, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 17, 255, 255, 255, 19, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 45, 255, 255, 255, 242, 255, 255, 255, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 22, 255, 255, 255, 16, 255, 255, 255, 127, 255, 255, 255, 229, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 18, 255, 255, 255, 146, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 83, 255, 255, 255, 237, 255, 255, 255, 229, 255, 255, 255, 76, 255, 255, 255, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 201, 255, 255, 255, 193, 255, 255, 255, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 200, 255, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 244, 255, 255, 255, 194, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 191, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 233, 255, 255, 255, 8, 255, 255, 255, 16, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 207, 255, 255, 255, 18, 255, 255, 255, 20, 255, 255, 255, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 255, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 149, 255, 255, 255, 202, 255, 255, 255, 179, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 65, 255, 255, 255, 198, 255, 255, 255, 198, 255, 255, 255, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 218, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 219, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 255, 255, 255, 255, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 90, 255, 255, 255, 252, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 170, 255, 255, 255, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 154, 255, 255, 255, 166, 255, 255, 255, 38, 255, 255, 255, 168, 255, 255, 255, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 95, 255, 255, 255, 220, 255, 255, 255, 249, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 73, 255, 255, 255, 8, 255, 255, 255, 8, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 13, 255, 255, 255, 239, 255, 255, 255, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 21, 255, 255, 255, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 166, 255, 255, 255, 35, 255, 255, 255, 251, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 145, 255, 255, 255, 223, 255, 255, 255, 219, 255, 255, 255, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 225, 255, 255, 255, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 195, 255, 255, 255, 202, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 229, 255, 255, 255, 255, 255, 255, 255, 230, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 3, 255, 255, 255, 44, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 176, 255, 255, 255, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 167, 255, 255, 255, 233, 255, 255, 255, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 235, 255, 255, 255, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 226, 255, 255, 255, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 3, 255, 255, 255, 144, 255, 255, 255, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 25, 255, 255, 255, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 46, 255, 255, 255, 208, 255, 255, 255, 235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 29, 0, 0, 0, 0, 255, 255, 255, 41, 255, 255, 255, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 83, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 201, 255, 255, 255, 219, 255, 255, 255, 211, 255, 255, 255, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 73, 255, 255, 255, 225, 255, 255, 255, 223, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 214, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 226, 255, 255, 255, 61, 255, 255, 255, 40, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 210, 255, 255, 255, 48, 255, 255, 255, 50, 255, 255, 255, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 181, 255, 255, 255, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 229, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 57, 255, 255, 255, 36, 255, 255, 255, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 109, 255, 255, 255, 213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 211, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 216, 255, 255, 255, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 75, 255, 255, 255, 225, 255, 255, 255, 223, 255, 255, 255, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 16, 255, 255, 255, 242, 255, 255, 255, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 193, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 219, 255, 255, 255, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 32, 255, 255, 255, 255, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 205, 255, 255, 255, 203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 105, 255, 255, 255, 184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 228, 255, 255, 255, 255, 255, 255, 255, 229, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 64, 255, 255, 255, 253, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 243, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 186, 255, 255, 255, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 236, 255, 255, 255, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 245, 255, 255, 255, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 56, 255, 255, 255, 239, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 247, 255, 255, 255, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 20, 255, 255, 255, 233, 255, 255, 255, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 217, 255, 255, 255, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 70, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 249, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 183, 255, 255, 255, 143, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 19, 255, 255, 255, 161, 255, 255, 255, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 150, 255, 255, 255, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 40, 255, 255, 255, 40, 255, 255, 255, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 168, 255, 255, 255, 91, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 102, 255, 255, 255, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 82, 255, 255, 255, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 205, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 80, 255, 255, 255, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 100, 255, 255, 255, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 147, 255, 255, 255, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 208, 255, 255, 255, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 64, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 213, 255, 255, 255, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 253, 255, 255, 255, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 205, 255, 255, 255, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 8, 255, 255, 255, 70, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 52, 255, 255, 255, 242, 255, 255, 255, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 251, 255, 255, 255, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 206, 255, 255, 255, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 182, 255, 255, 255, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 70, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 248, 255, 255, 255, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 246, 255, 255, 255, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 244, 255, 255, 255, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 241, 255, 255, 255, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 136, 255, 255, 255, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 179, 255, 255, 255, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 218, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 228, 255, 255, 255, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 219, 255, 255, 255, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "RGBA8", +"height": 256, +"mipmaps": false, +"width": 128 +} + +[sub_resource type="ImageTexture" id=5] +image = SubResource( 8 ) +size = Vector2( 128, 256 ) + +[sub_resource type="BitmapFont" id=6] +textures = [ SubResource( 5 ) ] +chars = PoolIntArray( 32, 0, 0, 0, 0, 0, 0, 11, 4, 160, 0, 1734439808, 0, 0, 0, 0, 11, 4, 96, 0, 2, 216, 3, 2, 3, 0, 8, 192, 0, 32, 16, 11, 13, -1, -2, 9, 224, 0, 85, 180, 5, 11, 1, 0, 7, 64, 0, 72, 34, 10, 11, 1, 1, 12, 97, 0, 76, 188, 5, 8, 1, 3, 7, 65, 0, 2, 16, 11, 10, -1, 1, 9, 161, 0, 2, 222, 2, 11, 1, 3, 4, 193, 0, 17, 16, 11, 13, -1, -2, 9, 225, 0, 112, 169, 5, 11, 1, 0, 7, 33, 0, 65, 234, 2, 10, 1, 1, 4, 34, 0, 49, 187, 5, 4, 1, 1, 6, 162, 0, 12, 136, 6, 10, 1, 1, 8, 66, 0, 46, 109, 7, 10, 1, 1, 9, 194, 0, 113, 2, 11, 13, -1, -2, 9, 226, 0, 72, 143, 6, 11, 1, 0, 7, 98, 0, 102, 165, 6, 11, 1, 0, 8, 99, 0, 40, 179, 5, 8, 1, 3, 7, 67, 0, 68, 115, 7, 10, 1, 1, 8, 227, 0, 2, 155, 6, 12, 1, -1, 7, 195, 0, 53, 2, 11, 14, -1, -3, 9, 163, 0, 22, 167, 6, 10, 1, 1, 8, 35, 0, 78, 66, 8, 10, 0, 1, 9, 164, 0, 14, 79, 8, 7, 0, 3, 8, 68, 0, 90, 66, 8, 10, 1, 1, 10, 100, 0, 82, 150, 6, 11, 1, 0, 8, 36, 0, 102, 137, 6, 12, 1, 0, 8, 196, 0, 98, 2, 11, 13, -1, -2, 9, 228, 0, 121, 169, 5, 11, 1, 0, 7, 101, 0, 32, 124, 6, 8, 1, 3, 8, 197, 0, 83, 2, 11, 12, -1, -1, 9, 229, 0, 20, 196, 5, 12, 1, -1, 7, 165, 0, 79, 98, 7, 10, 0, 1, 8, 69, 0, 29, 191, 5, 10, 1, 1, 7, 37, 0, 2, 30, 10, 10, 1, 1, 12, 230, 0, 58, 34, 10, 8, 1, 3, 12, 102, 0, 2, 201, 5, 11, 0, 0, 4, 166, 0, 95, 228, 2, 14, 3, 0, 7, 198, 0, 21, 2, 12, 10, -1, 1, 12, 70, 0, 101, 105, 6, 10, 1, 1, 7, 38, 0, 67, 49, 9, 10, 1, 1, 10, 39, 0, 119, 219, 2, 4, 1, 1, 3, 167, 0, 112, 131, 6, 11, 0, 0, 7, 103, 0, 13, 107, 7, 11, 1, 3, 7, 199, 0, 57, 97, 7, 13, 1, 1, 8, 231, 0, 2, 186, 5, 11, 1, 3, 7, 71, 0, 66, 65, 8, 10, 1, 1, 10, 168, 0, 77, 217, 4, 2, 2, 0, 8, 104, 0, 72, 158, 6, 11, 1, 0, 8, 40, 0, 93, 212, 4, 12, 1, 1, 4, 200, 0, 47, 195, 5, 13, 1, -2, 7, 232, 0, 62, 143, 6, 11, 1, 0, 8, 72, 0, 54, 65, 8, 10, 1, 1, 10, 105, 0, 109, 213, 3, 11, 0, 0, 4, 41, 0, 51, 226, 3, 12, 0, 1, 4, 201, 0, 56, 197, 5, 13, 1, -2, 7, 233, 0, 52, 142, 6, 11, 1, 0, 8, 169, 0, 44, 34, 10, 10, 1, 1, 12, 73, 0, 38, 191, 5, 10, 0, 1, 5, 170, 0, 29, 205, 4, 5, 0, 1, 5, 42, 0, 108, 80, 7, 6, 0, 0, 8, 202, 0, 65, 202, 5, 13, 1, -2, 7, 74, 0, 92, 195, 5, 13, -2, 1, 3, 106, 0, 101, 213, 4, 14, -1, 0, 4, 234, 0, 12, 181, 6, 11, 1, 0, 8, 171, 0, 22, 181, 5, 6, 1, 4, 7, 43, 0, 101, 94, 7, 7, 0, 3, 8, 107, 0, 112, 92, 7, 11, 1, 0, 7, 203, 0, 83, 200, 5, 13, 1, -2, 7, 235, 0, 2, 171, 6, 11, 1, 0, 8, 75, 0, 102, 66, 8, 10, 1, 1, 8, 44, 0, 107, 231, 2, 3, 1, 9, 4, 172, 0, 2, 104, 7, 4, 0, 6, 8, 108, 0, 113, 228, 2, 11, 1, 0, 4, 204, 0, 101, 196, 5, 13, 0, -2, 5, 236, 0, 30, 214, 3, 11, 0, 0, 4, 76, 0, 22, 124, 6, 10, 1, 1, 7, 173, 0, 16, 229, 3, 2, 1, 7, 5, 45, 0, 123, 201, 3, 2, 1, 7, 5, 109, 0, 68, 2, 11, 8, 1, 3, 13, 205, 0, 11, 211, 5, 13, 0, -2, 5, 237, 0, 37, 214, 3, 11, 1, 0, 4, 77, 0, 62, 20, 10, 10, 1, 1, 12, 46, 0, 101, 231, 2, 2, 1, 9, 4, 110, 0, 111, 107, 6, 8, 1, 3, 8, 206, 0, 20, 212, 5, 13, 0, -2, 5, 238, 0, 11, 196, 5, 11, -1, 0, 4, 174, 0, 30, 33, 10, 10, 1, 1, 12, 78, 0, 2, 79, 8, 10, 1, 1, 10, 175, 0, 35, 111, 7, 1, 0, -1, 7, 111, 0, 102, 153, 6, 8, 1, 3, 8, 207, 0, 119, 184, 5, 13, 0, -2, 5, 239, 0, 69, 219, 4, 11, 0, 0, 4, 79, 0, 41, 66, 9, 10, 1, 1, 11, 47, 0, 90, 105, 7, 10, -1, 1, 5, 176, 0, 61, 219, 4, 4, 1, 1, 6, 112, 0, 32, 150, 6, 11, 1, 3, 8, 240, 0, 82, 165, 6, 11, 1, 0, 8, 208, 0, 86, 33, 9, 10, 0, 1, 10, 80, 0, 52, 128, 6, 10, 1, 1, 8, 48, 0, 42, 135, 6, 10, 1, 1, 8, 177, 0, 46, 97, 7, 8, 0, 3, 8, 113, 0, 22, 152, 6, 11, 1, 3, 8, 241, 0, 2, 112, 6, 12, 1, -1, 8, 81, 0, 15, 59, 9, 13, 1, 1, 11, 209, 0, 74, 80, 8, 14, 1, -3, 10, 49, 0, 45, 212, 4, 10, 2, 1, 8, 178, 0, 58, 187, 5, 6, 0, 1, 5, 114, 0, 85, 217, 4, 8, 1, 3, 5, 210, 0, 2, 62, 9, 13, 1, -2, 11, 242, 0, 62, 165, 6, 11, 1, 0, 8, 82, 0, 35, 97, 7, 10, 1, 1, 8, 50, 0, 57, 114, 7, 10, 1, 1, 8, 179, 0, 53, 214, 4, 6, 0, 1, 5, 115, 0, 112, 146, 6, 8, 0, 3, 7, 211, 0, 106, 49, 9, 13, 1, -2, 11, 243, 0, 52, 172, 6, 11, 1, 0, 8, 83, 0, 24, 96, 7, 10, 0, 1, 7, 51, 0, 22, 138, 6, 10, 1, 1, 8, 180, 0, 9, 228, 3, 2, 3, 0, 8, 116, 0, 67, 188, 5, 10, 0, 1, 5, 212, 0, 93, 49, 9, 13, 1, -2, 11, 244, 0, 42, 164, 6, 11, 1, 0, 8, 84, 0, 13, 93, 7, 10, 0, 1, 7, 52, 0, 24, 110, 7, 10, 1, 1, 8, 245, 0, 12, 165, 6, 12, 1, -1, 8, 181, 0, 2, 140, 6, 11, 1, 3, 8, 117, 0, 42, 123, 6, 8, 1, 3, 8, 53, 0, 92, 119, 6, 10, 1, 1, 8, 85, 0, 114, 66, 8, 10, 1, 1, 10, 213, 0, 2, 44, 9, 14, 1, -3, 11, 118, 0, 15, 47, 9, 8, -1, 3, 7, 182, 0, 68, 98, 7, 13, 1, 0, 9, 214, 0, 80, 49, 9, 13, 1, -2, 11, 246, 0, 72, 173, 6, 11, 1, 0, 8, 86, 0, 76, 18, 10, 10, -1, 1, 8, 54, 0, 82, 121, 6, 10, 1, 1, 8, 183, 0, 77, 223, 2, 2, 1, 5, 4, 215, 0, 2, 93, 7, 7, 0, 3, 8, 247, 0, 90, 94, 7, 7, 0, 3, 8, 119, 0, 37, 2, 12, 8, -1, 3, 10, 87, 0, 2, 2, 15, 10, -1, 1, 13, 55, 0, 72, 129, 6, 10, 1, 1, 8, 184, 0, 116, 212, 3, 3, 0, 11, 3, 120, 0, 119, 80, 7, 8, 0, 3, 7, 248, 0, 2, 128, 6, 8, 1, 3, 8, 216, 0, 99, 33, 9, 12, 1, 0, 11, 88, 0, 90, 19, 10, 10, -1, 1, 8, 56, 0, 62, 129, 6, 10, 1, 1, 8, 185, 0, 23, 229, 3, 6, 0, 1, 5, 57, 0, 12, 122, 6, 10, 1, 1, 8, 121, 0, 112, 33, 9, 11, -1, 3, 7, 249, 0, 52, 157, 6, 11, 1, 0, 8, 217, 0, 38, 80, 8, 13, 1, -2, 10, 89, 0, 28, 65, 9, 10, -1, 1, 7, 186, 0, 37, 205, 4, 5, 0, 1, 5, 58, 0, 89, 229, 2, 8, 1, 3, 4, 122, 0, 112, 119, 6, 8, 1, 3, 7, 90, 0, 32, 136, 6, 10, 1, 1, 8, 250, 0, 42, 149, 6, 11, 1, 0, 8, 218, 0, 26, 79, 8, 13, 1, -2, 10, 187, 0, 31, 181, 5, 6, 1, 4, 7, 59, 0, 71, 234, 2, 9, 1, 3, 4, 251, 0, 12, 150, 6, 11, 1, 0, 8, 123, 0, 103, 180, 5, 12, 0, 1, 5, 91, 0, 58, 227, 3, 12, 1, 1, 4, 219, 0, 50, 80, 8, 13, 1, -2, 10, 60, 0, 92, 153, 6, 7, 1, 3, 8, 92, 0, 97, 80, 7, 10, -1, 1, 5, 252, 0, 92, 133, 6, 11, 1, 0, 8, 220, 0, 62, 79, 8, 13, 1, -2, 10, 124, 0, 83, 229, 2, 14, 3, 0, 7, 188, 0, 16, 33, 10, 10, 0, 1, 10, 61, 0, 79, 112, 7, 5, 0, 4, 8, 125, 0, 110, 196, 5, 12, 0, 1, 5, 93, 0, 44, 226, 3, 12, 0, 1, 4, 221, 0, 54, 48, 9, 13, -1, -2, 7, 253, 0, 28, 47, 9, 14, -1, 0, 7, 189, 0, 47, 20, 11, 10, 0, 1, 10, 126, 0, 62, 158, 6, 3, 1, 5, 8, 94, 0, 86, 80, 7, 6, 0, 1, 7, 62, 0, 112, 158, 6, 7, 1, 3, 8, 254, 0, 102, 119, 6, 14, 1, 0, 8, 222, 0, 32, 165, 6, 10, 1, 1, 8, 190, 0, 104, 19, 10, 10, 0, 1, 10, 95, 0, 92, 148, 6, 1, 0, 12, 6, 63, 0, 74, 202, 5, 10, 0, 1, 6, 191, 0, 94, 180, 5, 11, 0, 3, 6, 255, 0, 41, 48, 9, 14, -1, 0, 7, 223, 0, 82, 135, 6, 11, 1, 0, 8 ) +height = 14.0 +ascent = 11.0 + +[node name="PortraitPicker" type="VBoxContainer"] +margin_right = 100.0 +margin_bottom = 30.0 +size_flags_vertical = 4 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Preview" type="Node2D" parent="."] +z_index = 1 + +[node name="PreviewContainer" type="PanelContainer" parent="Preview"] +visible = false +margin_left = 3.0 +margin_top = 3.0 +margin_right = 254.0 +margin_bottom = 334.0 +grow_horizontal = 0 +custom_styles/panel = SubResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBox" type="VBoxContainer" parent="Preview/PreviewContainer"] +margin_left = 10.0 +margin_top = 10.0 +margin_right = 241.0 +margin_bottom = 321.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Title" type="Button" parent="Preview/PreviewContainer/VBox"] +margin_right = 231.0 +margin_bottom = 14.0 +custom_fonts/font = SubResource( 6 ) +text = "Preview" +flat = true +align = 0 + +[node name="TextureRect" type="TextureRect" parent="Preview/PreviewContainer/VBox"] +margin_top = 18.0 +margin_right = 231.0 +margin_bottom = 311.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +expand = true +stretch_mode = 6 + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 164.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 + +[node name="Label" parent="HBox" instance=ExtResource( 4 )] +custom_colors/font_color = Color( 0, 0, 0, 1 ) + +[node name="MenuButton" parent="HBox" instance=ExtResource( 3 )] +margin_left = 82.0 +margin_right = 164.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Portrait" diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/DefinitionPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/DefinitionPicker.tscn new file mode 100644 index 0000000..7c0d917 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/DefinitionPicker.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_DefinitionPicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] + +[node name="DefinitionPicker" type="VBoxContainer"] +margin_right = 83.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +default_text = "Value" + +[node name="HBox" type="HBoxContainer" parent="."] +margin_right = 98.0 +margin_bottom = 22.0 + +[node name="MenuButton" parent="HBox" instance=ExtResource( 2 )] +margin_right = 98.0 +text = "Definition" diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_DefinitionPicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_DefinitionPicker.gd new file mode 100644 index 0000000..b195d7c --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_DefinitionPicker.gd @@ -0,0 +1,79 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +export (String) var default_text = "Select Definition" + +## node references +onready var picker_menu = $HBox/MenuButton + +# used to connect the signals +func _ready(): + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + + # themeing + picker_menu.custom_icon_modulation = get_color("font_color", "Editor") + picker_menu.custom_icon = load("res://addons/dialogic/Images/Resources/definition.svg") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + select_definition_by_id(data['definition']) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func select_definition_by_id(id): + if id != '': + for d in DialogicResources.get_default_definitions()['variables']: + if d['id'] == id: + picker_menu.text = d['name'] + else: + picker_menu.text = default_text + +# when an index is selected on one of the menus. +func _on_PickerMenu_selected(index, menu): + var text = menu.get_item_text(index) + var metadata = menu.get_item_metadata(index) + picker_menu.text = text + + event_data['definition'] = metadata['file'] + # informs the parent about the changes! + data_changed() + +func _on_PickerMenu_about_to_show(): + # Building the picker menu() + picker_menu.get_popup().clear() + ## building the root level + build_PickerMenuFolder(picker_menu.get_popup(), DialogicUtil.get_definitions_folder_structure(), "MenuButton") + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + picker_menu.update_submenu_style(submenu) + index += 1 + + + var files_info = DialogicUtil.get_default_definitions_dict() + for file in folder_structure['files']: + if files_info[file]["type"] == 0: + menu.add_item(files_info[file]['name']) + menu.set_item_icon(index, load("res://addons/dialogic/Images/Resources/definition.svg")) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_PickerMenu_selected"): + menu.connect("index_pressed", self, '_on_PickerMenu_selected', [menu]) + + return current_folder_name diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_GlossaryPicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_GlossaryPicker.gd new file mode 100644 index 0000000..32cb6df --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_GlossaryPicker.gd @@ -0,0 +1,79 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +export (String) var default_text = "Select Glossary Item" + +## node references +onready var picker_menu = $MenuButton + +# used to connect the signals +func _ready(): + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + picker_menu.custom_icon = get_icon("ListSelect", "EditorIcons") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + select_glossary_by_id(data['glossary_id']) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func select_glossary_by_id(id): + if id != '': + for d in DialogicResources.get_default_definitions()['glossary']: + if d['id'] == id: + picker_menu.text = d['name'] + else: + picker_menu.text = default_text + +# when an index is selected on one of the menus. +func _on_PickerMenu_selected(index, menu): + event_data['glossary_id'] = menu.get_item_metadata(index).get('file', '') + + select_glossary_by_id(event_data['glossary_id']) + + # informs the parent about the changes! + data_changed() + +func _on_PickerMenu_about_to_show(): + build_PickerMenu() + +func build_PickerMenu(): + picker_menu.get_popup().clear() + var folder_structure = DialogicUtil.get_definitions_folder_structure() + + ## building the root level + build_PickerMenuFolder(picker_menu.get_popup(), folder_structure, "MenuButton") + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + #menu.name = current_folder_name + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + picker_menu.update_submenu_style(submenu) + index += 1 + + var files_info = DialogicUtil.get_default_definitions_dict() + for file in folder_structure['files']: + if files_info[file]["type"] == 1: + menu.add_item(files_info[file]['name']) + menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").glossary_icon) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_PickerMenu_selected"): + menu.connect("index_pressed", self, '_on_PickerMenu_selected', [menu]) + + return current_folder_name diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_SetGlossary.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_SetGlossary.gd new file mode 100644 index 0000000..c3edb46 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_SetGlossary.gd @@ -0,0 +1,133 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var title_input = $Title/Input +onready var title_check = $Title/Check +onready var text_input = $Text/Input +onready var text_check = $Text/Check +onready var extra_input = $Extra/Input +onready var extra_check = $Extra/Check + +# used to connect the signals +func _ready(): + title_input.connect("text_changed", self, "_on_TitleField_text_changed") + text_input.connect("text_changed", self, "_on_TextField_text_changed") + extra_input.connect("text_changed", self, "_on_ExtraField_text_changed") + + title_check.connect("toggled", self, "_on_TitleCheck_toggled") + text_check.connect("toggled", self, "_on_TextCheck_toggled") + extra_check.connect("toggled", self, "_on_ExtraCheck_toggled") + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + emit_signal("request_set_body_enabled", event_data['glossary_id'] != '') + + $Title.visible = event_data['glossary_id'] != '' + $Text.visible = event_data['glossary_id'] != '' + $Extra.visible = event_data['glossary_id'] != '' + + if event_data['glossary_id']: + var glossary_default + for d in DialogicResources.get_default_definitions()['glossary']: + if d['id'] == event_data['glossary_id']: + glossary_default = d + if glossary_default == null: + print('[D] The glossary item with id ', event_data['glossary_id'], ' cannot be found anymore. The event will be reset.') + event_data['glossary_id'] = '' + load_data(event_data) + return + title_input.placeholder_text = glossary_default['title'] + text_input.placeholder_text = glossary_default['text'] + extra_input.placeholder_text = glossary_default['extra'] + + # Now update the ui nodes to display the data. + if event_data['title'] == "[No Change]": + title_check.pressed = true + title_input.text = "" + else: + title_check.pressed = false + title_input.text = event_data['title'] + if event_data['text'] == "[No Change]": + text_check.pressed = true + text_input.text = "" + else: + text_check.pressed = false + text_input.text = event_data['text'] + if event_data['extra'] == "[No Change]": + extra_check.pressed = true + extra_input.text = "" + else: + extra_check.pressed = false + extra_input.text = event_data['extra'] + + +# has to return the wanted preview, only useful for body parts +func get_preview(): + if event_data['glossary_id']: + var text := "" + if event_data['title'] != "[No Change]": + text += "Changes title to '"+event_data['title']+"'. " + if event_data['extra'] != "[No Change]": + text += "Changes extra to '"+event_data['extra']+"'. " + if event_data['text'] != "[No Change]": + text += "Changes text to '"+event_data['text']+"'. " + return text + return '' + +func _on_TitleField_text_changed(text): + event_data['title'] = text + + # informs the parent about the changes! + data_changed() + +func _on_TextField_text_changed(text): + event_data['text'] = text + + # informs the parent about the changes! + data_changed() + +func _on_ExtraField_text_changed(text): + event_data['extra'] = text + + # informs the parent about the changes! + data_changed() + +func _on_TitleCheck_toggled(toggle): + if toggle: + event_data['title'] = "[No Change]" + title_input.editable = false + else: + event_data['title'] = title_input.text + title_input.editable = true + + # informs the parent about the changes! + data_changed() + +func _on_TextCheck_toggled(toggle): + if toggle: + event_data['text'] = "[No Change]" + text_input.editable = false + else: + event_data['text'] = text_input.text + text_input.editable = true + + # informs the parent about the changes! + data_changed() + +func _on_ExtraCheck_toggled(toggle): + if toggle: + event_data['extra'] = "[No Change]" + extra_input.editable = false + else: + event_data['extra'] = extra_input.text + extra_input.editable = true + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/GlossaryPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/GlossaryPicker.tscn new file mode 100644 index 0000000..1bff407 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/GlossaryPicker.tscn @@ -0,0 +1,27 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_GlossaryPicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="GlossaryPicker" type="HBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +default_text = "Glossary item" + +[node name="Label" parent="." instance=ExtResource( 3 )] +margin_top = 13.0 +margin_right = 93.0 +margin_bottom = 27.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Set content of " + +[node name="MenuButton" parent="." instance=ExtResource( 2 )] +margin_left = 97.0 +margin_top = 8.0 +margin_right = 285.0 +margin_bottom = 32.0 +custom_colors/font_color = Color( 0.8, 0.807843, 0.827451, 1 ) +text = "Select Glossary Item" diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/SetGlossary.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/SetGlossary.tscn new file mode 100644 index 0000000..487fdd0 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/SetGlossary.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/EventPart_SetGlossary.gd" type="Script" id=3] + +[node name="SetGlossary" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_horizontal = 0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Title" type="HBoxContainer" parent="."] +margin_right = 331.0 +margin_bottom = 27.0 +custom_constants/separation = 20 + +[node name="Label" type="Label" parent="Title"] +margin_top = 6.0 +margin_right = 50.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 50, 0 ) +text = "Title:" + +[node name="Input" parent="Title" instance=ExtResource( 1 )] +margin_left = 70.0 +margin_right = 200.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 + +[node name="Check" type="CheckBox" parent="Title"] +margin_left = 220.0 +margin_right = 331.0 +margin_bottom = 27.0 +text = "Don't change" + +[node name="Text" type="HBoxContainer" parent="."] +margin_top = 31.0 +margin_right = 331.0 +margin_bottom = 58.0 +custom_constants/separation = 20 + +[node name="Label" type="Label" parent="Text"] +margin_top = 6.0 +margin_right = 50.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 50, 0 ) +text = "Text:" + +[node name="Input" parent="Text" instance=ExtResource( 1 )] +margin_left = 70.0 +margin_right = 200.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 + +[node name="Check" type="CheckBox" parent="Text"] +margin_left = 220.0 +margin_right = 331.0 +margin_bottom = 27.0 +text = "Don't change" + +[node name="Extra" type="HBoxContainer" parent="."] +margin_top = 62.0 +margin_right = 331.0 +margin_bottom = 89.0 +custom_constants/separation = 20 + +[node name="Label" type="Label" parent="Extra"] +margin_top = 6.0 +margin_right = 50.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 50, 0 ) +text = "Extra:" + +[node name="Input" parent="Extra" instance=ExtResource( 1 )] +margin_left = 70.0 +margin_right = 200.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 + +[node name="Check" type="CheckBox" parent="Extra"] +margin_left = 220.0 +margin_right = 331.0 +margin_bottom = 27.0 +text = "Don't change" diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/EventPart_FilePicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/EventPart_FilePicker.gd new file mode 100644 index 0000000..09b29ed --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/EventPart_FilePicker.gd @@ -0,0 +1,117 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +export(String, "Audio", "Background", "Scene", "Resource") var Mode = "Background" + +## node references +onready var file_button = $FileButton +onready var clear_button = $ClearButton + +# until we change the background color of the pickers, the color should ignore the theme +var default_color = Color('ccced3') + +# used to connect the signals +func _ready(): + editor_reference = find_parent("EditorView") + file_button.connect("pressed", self, "_on_FileButton_pressed") + clear_button.connect('pressed', self, "_on_ClearButton_pressed") + file_button.add_color_override("font_color", default_color) #get_color("mono_color", "Editor")) + clear_button.icon = get_icon("Reload", "EditorIcons") + $FileButton/icon2.texture = get_icon("GuiSliderGrabber", "EditorIcons") + match Mode: + "Audio": + $Label.text = "Play" + $FileButton/icon.texture = get_icon("AudioStreamPlayer", "EditorIcons") + "Background": + $Label.text = "to" + $FileButton/icon.texture = get_icon("Image", "EditorIcons") + "Scene": + $Label.text = "to" + $FileButton/icon.texture = get_icon("PackedScene", "EditorIcons") + "Resource": + $Label.text = "to" + $FileButton/icon.texture = get_icon("PackedScene", "EditorIcons") + + +# called by the parent event part +func load_data(event_data:Dictionary): + + # first update the event_data + .load_data(event_data) + + # then the ui + var path + file_button.text = "" + match Mode: + "Audio": + path = event_data['file'] + if path.empty(): + file_button.text = 'nothing (will stop previous)' + "Background": + path = event_data['background'] + if path.empty(): + file_button.text = 'nothing (will hide previous)' + "Scene": + path = event_data['change_scene'] + if path.empty(): + file_button.text = 'a yet to be selected scene' + "Resource": + path = event_data['resource_file'] + if path.empty(): + file_button.text = 'a yet to be selected resource' + if file_button.text.empty(): + file_button.text = path.get_file() + file_button.hint_tooltip = path + + clear_button.visible = !path.empty() + +func _on_FileButton_pressed(): + match Mode: + "Audio": + editor_reference.godot_dialog("*.wav, *.ogg, *.mp3") + "Background": + editor_reference.godot_dialog("*.png, *.jpg, *.jpeg, *.tga, *.svg, *.svgz, *.bmp, *.webp, *.tscn") + "Scene": + editor_reference.godot_dialog("*.tscn") + "Resource": + editor_reference.godot_dialog("*.tres, *.res") + + editor_reference.godot_dialog_connect(self, "_on_file_selected") + +func _on_file_selected(path, target): + match Mode: + "Audio": + event_data['file'] = path + "Background": + event_data['background'] = path + "Scene": + event_data['change_scene'] = path + "Resource": + event_data['resource_file'] = path + + clear_button.visible = true + file_button.text = path.get_file() + file_button.hint_tooltip = path + + # informs the parent about the changes! + data_changed() + +func _on_ClearButton_pressed(): + match Mode: + "Audio": + event_data['file'] = "" + file_button.text = 'nothing (will stop previous)' + "Background": + event_data['background'] = "" + file_button.text = 'nothing (will hide previous)' + "Scene": + event_data['change_scene'] = "" + file_button.text = 'a yet to be selected scene' + "Resource": + event_data['resource_file'] = "" + file_button.text = 'a yet to be selected resource' + clear_button.visible = false + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/FilePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/FilePicker.tscn new file mode 100644 index 0000000..aedda91 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/FilePicker.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres" type="StyleBox" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SettingsFieldBackground.tres" type="StyleBox" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/EventPart_FilePicker.gd" type="Script" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres" type="StyleBox" id=7] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="FilePicker" type="HBoxContainer"] +margin_top = 1.0 +margin_right = 331.0 +margin_bottom = 23.0 +size_flags_vertical = 4 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" parent="." instance=ExtResource( 4 )] +margin_top = 5.0 +margin_right = 13.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "to" + +[node name="FileButton" type="Button" parent="."] +margin_left = 17.0 +margin_right = 143.0 +margin_bottom = 24.0 +custom_styles/hover = ExtResource( 2 ) +custom_styles/pressed = ExtResource( 2 ) +custom_styles/focus = ExtResource( 2 ) +custom_styles/normal = ExtResource( 2 ) +text = "none so far" + +[node name="icon" type="TextureRect" parent="FileButton"] +margin_left = 4.0 +margin_top = 5.0 +margin_right = 23.0 +margin_bottom = 24.0 +texture = SubResource( 2 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="icon2" type="TextureRect" parent="FileButton"] +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -20.9581 +margin_top = -6.63555 +margin_right = -5.95807 +margin_bottom = 8.36445 +texture = SubResource( 2 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ClearButton" type="Button" parent="."] +margin_left = 147.0 +margin_right = 169.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 22, 22 ) +custom_styles/hover = ExtResource( 1 ) +custom_styles/pressed = ExtResource( 1 ) +custom_styles/normal = ExtResource( 7 ) +icon = SubResource( 2 ) diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.gd new file mode 100644 index 0000000..facf557 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.gd @@ -0,0 +1,32 @@ +tool +extends MenuButton + +export (Texture) var custom_icon setget set_custom_icon +var custom_icon_modulation setget set_custom_icon_modulation +var menu_background + +# until we change the background color of the pickers, the color should ignore the theme +var default_color = Color('ccced3') + +func _ready(): + menu_background = load("res://addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres") + menu_background.bg_color = get_color("base_color", "Editor") + add_color_override("font_color", default_color) #get_color("mono_color", "Editor")) + update_submenu_style(get_popup()) + reset_modulation() + $Icon2.texture = get_icon("Collapse", "EditorIcons") + +func update_submenu_style(submenu): + submenu.add_stylebox_override('panel', menu_background) + submenu.add_stylebox_override('hover', StyleBoxEmpty.new()) + submenu.add_color_override('font_color_hover', get_color("accent_color", "Editor")) + +func set_custom_icon(texture:Texture): + $Icon.texture = texture + +func set_custom_icon_modulation(color:Color): + $Icon.modulate = color + +func reset_modulation(): + $Icon.modulate = default_color#get_color("font_color", "Editor") + $Icon2.modulate = default_color#get_color("font_color", "Editor") diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn new file mode 100644 index 0000000..7949046 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn @@ -0,0 +1,66 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/styles/SettingsFieldBackground.tres" type="StyleBox" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.gd" type="Script" id=3] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[node name="MenuButton" type="MenuButton"] +margin_right = 98.0 +margin_bottom = 24.0 +focus_mode = 2 +size_flags_vertical = 4 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +custom_styles/hover = ExtResource( 1 ) +custom_styles/pressed = ExtResource( 1 ) +custom_styles/normal = ExtResource( 1 ) +text = "Resource" +flat = false +align = 0 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Icon" type="TextureRect" parent="."] +modulate = Color( 0, 0, 0, 1 ) +anchor_bottom = 1.0 +margin_left = 8.0 +margin_top = 4.0 +margin_right = 23.0 +margin_bottom = -4.0 +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Icon2" type="TextureRect" parent="."] +modulate = Color( 0, 0, 0, 1 ) +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +margin_left = -20.7581 +margin_top = -8.78745 +margin_right = -5.75813 +margin_bottom = 7.21255 +texture = SubResource( 2 ) +expand = true +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/EventPart_ScenePicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/EventPart_ScenePicker.gd new file mode 100644 index 0000000..ceff0f7 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/EventPart_ScenePicker.gd @@ -0,0 +1,28 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var file_picker = $FilePicker + +# used to connect the signals +func _ready(): + file_picker.connect("data_changed", self, "_on_ScenePicker_data_changed") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + file_picker.load_data(data) + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_ScenePicker_data_changed(data): + event_data = data + data_changed() + diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/ScenePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/ScenePicker.tscn new file mode 100644 index 0000000..d688716 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/ScenePicker.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Scenes/EventPart_ScenePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Files/FilePicker.tscn" type="PackedScene" id=2] + +[node name="ScenePicker" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FilePicker" parent="." instance=ExtResource( 2 )] +margin_top = 0.0 +margin_right = 199.0 +margin_bottom = 22.0 +Mode = "Scene" diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/EventPart_ThemePicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/EventPart_ThemePicker.gd new file mode 100644 index 0000000..6ca1f63 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/EventPart_ThemePicker.gd @@ -0,0 +1,78 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! +export (String) var default_text = "Select Theme" + +## node references +onready var picker_menu = $MenuButton + +# used to connect the signals +func _ready(): + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + picker_menu.custom_icon = load("res://addons/dialogic/Images/Resources/theme.svg") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + select_theme() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func select_theme(): + if event_data['set_theme'] != '': + for theme in DialogicUtil.get_theme_list(): + if theme['file'] == event_data['set_theme']: + picker_menu.text = theme['name'] + else: + picker_menu.text = default_text + +# when an index is selected on one of the menus. +func _on_PickerMenu_selected(index, menu): + event_data['set_theme'] = menu.get_item_metadata(index).get('file', '') + + select_theme() + + # informs the parent about the changes! + data_changed() + + +func _on_PickerMenu_about_to_show(): + build_PickerMenu() + +func build_PickerMenu(): + picker_menu.get_popup().clear() + var folder_structure = DialogicUtil.get_theme_folder_structure() + + ## building the root level + build_PickerMenuFolder(picker_menu.get_popup(), folder_structure, "MenuButton") + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + picker_menu.update_submenu_style(submenu) + index += 1 + + var files_info = DialogicUtil.get_theme_dict() + for file in folder_structure['files']: + menu.add_item(files_info[file]['name']) + menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").theme_icon) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_PickerMenu_selected"): + menu.connect("index_pressed", self, '_on_PickerMenu_selected', [menu]) + + return current_folder_name diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/ThemePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/ThemePicker.tscn new file mode 100644 index 0000000..6586f15 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/ThemePicker.tscn @@ -0,0 +1,29 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/EventPart_ThemePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="ThemePicker" type="HBoxContainer"] +margin_right = 157.0 +margin_bottom = 27.0 +size_flags_vertical = 4 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +show_text = true + +[node name="Label" parent="." instance=ExtResource( 3 )] +margin_top = 6.0 +margin_right = 59.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "to theme" + +[node name="MenuButton" parent="." instance=ExtResource( 2 )] +margin_left = 63.0 +margin_top = 1.0 +margin_right = 177.0 +margin_bottom = 25.0 +custom_colors/font_color = Color( 0.8, 0.807843, 0.827451, 1 ) diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd new file mode 100644 index 0000000..0b1af11 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd @@ -0,0 +1,79 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var picker_menu = $MenuButton + +# used to connect the signals +func _ready(): + picker_menu.connect("about_to_show", self, "_on_PickerMenu_about_to_show") + picker_menu.custom_icon = load("res://addons/dialogic/Images/Resources/timeline.svg") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + if event_data['change_timeline'] != '': + for c in DialogicUtil.get_timeline_list(): + if c['file'] == event_data['change_timeline']: + picker_menu.text = c['name'] + else: + picker_menu.text = 'Select Timeline' + + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + +# when an index is selected on one of the menus. +func _on_PickerMenu_selected(index, menu): + var text = menu.get_item_text(index) + var metadata = menu.get_item_metadata(index) + picker_menu.text = text + event_data['change_timeline'] = metadata['file'] + + # informs the parent about the changes! + data_changed() + + +func _on_PickerMenu_about_to_show(): + build_PickerMenu() + + +func build_PickerMenu(): + picker_menu.get_popup().clear() + var folder_structure = DialogicUtil.get_timelines_folder_structure() + + ## building the root level + build_PickerMenuFolder(picker_menu.get_popup(), folder_structure, "MenuButton") + + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + picker_menu.update_submenu_style(submenu) + index += 1 + + var files_info = DialogicUtil.get_timeline_dict() + for file in folder_structure['files']: + menu.add_item(files_info[file]['name']) + menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").timeline_icon) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_PickerMenu_selected"): + menu.connect("index_pressed", self, '_on_PickerMenu_selected', [menu]) + + return current_folder_name diff --git a/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/TimelinePicker.tscn b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/TimelinePicker.tscn new file mode 100644 index 0000000..b915849 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/TimelinePicker.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Timelines/EventPart_TimelinePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="TimelinePicker" type="HBoxContainer"] +margin_right = 119.0 +margin_bottom = 20.0 +size_flags_vertical = 6 +script = ExtResource( 1 ) + +[node name="Label" parent="." instance=ExtResource( 3 )] +margin_right = 87.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Start timeline" + +[node name="MenuButton" parent="." instance=ExtResource( 2 )] +margin_left = 91.0 +margin_right = 185.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/SpinBoxPreventDnD.gd b/project/addons/dialogic/Editor/Events/Parts/SpinBoxPreventDnD.gd new file mode 100644 index 0000000..48c9704 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/SpinBoxPreventDnD.gd @@ -0,0 +1,8 @@ +tool +extends SpinBox + +func can_drop_data(position, data): + # this prevents locking the mouse + # on some operating systems + # due to a godot editor bug with SpinBox drag/drop + return false diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.gd b/project/addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.gd new file mode 100644 index 0000000..0d26f66 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.gd @@ -0,0 +1,16 @@ +extends LineEdit + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +#func _process(delta): +# pass diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn b/project/addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn new file mode 100644 index 0000000..34785dc --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=2 format=2] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 11.0 +content_margin_right = 9.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0.12549, 0.141176, 0.192157, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.0980392, 0.113725, 0.152941, 1 ) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 + +[node name="CustomLineEdit" type="LineEdit"] +margin_right = 48.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 130, 27 ) +size_flags_vertical = 6 +custom_colors/selection_color = Color( 0.345098, 0.345098, 0.345098, 1 ) +custom_colors/cursor_color = Color( 1, 1, 1, 1 ) +custom_colors/clear_button_color_pressed = Color( 0.960784, 0.960784, 0.960784, 1 ) +custom_colors/font_color_selected = Color( 1, 1, 1, 1 ) +custom_colors/font_color = Color( 1, 1, 1, 1 ) +custom_colors/clear_button_color = Color( 0, 0, 0, 1 ) +custom_colors/font_color_uneditable = Color( 0, 0, 0, 1 ) +custom_styles/read_only = SubResource( 1 ) +custom_styles/focus = SubResource( 1 ) +custom_styles/normal = SubResource( 1 ) +expand_to_text_length = true +caret_blink = true +caret_blink_speed = 0.5 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_SignalArgumentPicker.gd b/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_SignalArgumentPicker.gd new file mode 100644 index 0000000..ec1f2e6 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_SignalArgumentPicker.gd @@ -0,0 +1,29 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var input_field = $HBox/InputField + +# used to connect the signals +func _ready(): + input_field.connect("text_changed", self, "_on_InputField_text_changed") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + input_field.text = event_data['emit_signal'] + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + +func _on_InputField_text_changed(text): + event_data['emit_signal'] = text + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_TextAndVoicePicker.gd b/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_TextAndVoicePicker.gd new file mode 100644 index 0000000..6392d86 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_TextAndVoicePicker.gd @@ -0,0 +1,55 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +onready var text_editor = $VBoxContainer/TextEditor +onready var voice_editor = $VBoxContainer/VoiceEditor + + +func _ready() -> void: + text_editor.connect("data_changed", self, "_on_text_editor_data_changed") + voice_editor.connect("data_changed", self, "_on_voice_editor_data_changed") + voice_editor.visible = use_voices() + voice_editor.editor_reference = editor_reference + voice_editor.repopulate() + + +func load_data(data): + .load_data(data) + + text_editor.load_data(data) + voice_editor.visible = use_voices() + voice_editor.load_data(data) + update_voices_lines() + + +func get_preview(): + return text_editor.get_preview() + + +func use_voices(): + var config = DialogicResources.get_settings_config() + return config.get_value('dialog', 'text_event_audio_enable', false) + + +func _on_text_editor_data_changed(data) -> void: + event_data = data + + #udpate the voice picker to check if we repopulate it + update_voices_lines() + # informs the parent + data_changed() + + +func update_voices_lines(): + var text = text_editor.get_child(0).text + voice_editor._on_text_changed(text) + + +func _on_voice_editor_data_changed(data) -> void: + event_data['voice_data'] = data['voice_data'] + voice_editor.visible = use_voices() + # informs the parent + data_changed() + +func focus(): + text_editor.focus() diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_TextEditor.gd b/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_TextEditor.gd new file mode 100644 index 0000000..e0ea5c2 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/EventPart_TextEditor.gd @@ -0,0 +1,130 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var text_editor = $TextEdit + +var timeline_area = null +var text_gap = 50 + +# used to connect the signals +func _ready(): + text_gap = (text_gap * DialogicUtil.get_editor_scale(self)) + + # signals + text_editor.connect("text_changed", self, "_on_TextEditor_text_changed") + text_editor.connect("focus_entered", self, "_on_TextEditor_focus_entered") + + # stylistig setup + text_editor.syntax_highlighting = true + text_editor.add_color_region('[', ']', get_color("axis_z_color", "Editor")) + text_editor.set('custom_colors/number_color', get_color("font_color", "Editor")) + text_editor.set('custom_colors/function_color', get_color("font_color", "Editor")) + text_editor.set('custom_colors/member_variable_color', get_color("font_color", "Editor")) + text_editor.set('custom_colors/symbol_color', get_color("font_color", "Editor")) + + timeline_area = find_parent('TimelineArea') + timeline_area.connect('resized', self, '_set_new_min_size') + _set_new_min_size() + + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + # in case this is a text event + if data['event_id'] == 'dialogic_001': + text_editor.text = event_data['text'] + # in case this is a question event + elif data['event_id'] == 'dialogic_010': + text_editor.text = event_data['question'] + # otherwise + else: + text_editor.text = event_data['text'] + + # resize the text_editor to the correct size + _set_new_min_size() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + var max_preview_characters = 35 + var text = '' + if event_data['event_id'] == 'dialogic_001': + text = event_data['text'] + # in case this is a question event + elif event_data['event_id'] == 'dialogic_010': + text = event_data['question'] + # otherwise + else: + text = event_data['text'] + text = text.replace('\n', '[br]') + var preview = text.substr(0, min(max_preview_characters, len(text))) + if (len(text) > max_preview_characters): + preview += "..." + + return preview + +func _on_TextEditor_text_changed(): + # in case this is a text event + if event_data['event_id'] == 'dialogic_001': + event_data['text'] = text_editor.text + # in case this is a question event + elif event_data['event_id'] == 'dialogic_010': + event_data['question'] = text_editor.text + # otherwise + else: + event_data['text'] = text_editor.text + _set_new_min_size() + + # informs the parent about the changes! + data_changed() + + +func _set_new_min_size(): + # Reset + text_editor.rect_min_size = Vector2(0,0) + # Getting new sizes + var extra_vertical = 1.1 + + + + + # Getting the longest string and making that the width of the dialog bubble + # also check how many lines wrap (and how often) + var count_wrapped_lines = 0 + var longest_string = '' + for l in text_editor.text.split('\n'): + if l.length() > longest_string.length(): + longest_string = l + if get_font("normal_font").get_string_size(l).x > get_max_x_size(): + count_wrapped_lines += get_font("normal_font").get_string_size(l).x/(get_max_x_size()) + + # set the height + if text_editor.get_line_count() > 1: + extra_vertical = 1.22 + text_editor.rect_min_size.y = get_font("normal_font").get_height() * ((text_editor.get_line_count() + 1 + count_wrapped_lines) * extra_vertical) + + # set the width + text_editor.rect_min_size.x = get_font("normal_font").get_string_size(longest_string).x + text_gap + if text_editor.rect_min_size.x > get_max_x_size(): + text_editor.rect_min_size.x = get_max_x_size() + +func get_max_x_size(): + return timeline_area.rect_size.x - (text_editor.rect_global_position.x - timeline_area.rect_global_position.x) - text_gap + +func _on_TextEditor_focus_entered() -> void: + if (Input.is_mouse_button_pressed(BUTTON_LEFT)): + emit_signal("request_selection") + + +func _on_TextEdit_focus_exited(): + # Remove text selection to visually notify the user that the text will not + # be copied if they use a hotkey like CTRL + C + $TextEdit.deselect() + +func focus(): + $TextEdit.grab_focus() diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/GreyLabel.gd b/project/addons/dialogic/Editor/Events/Parts/Text/GreyLabel.gd new file mode 100644 index 0000000..431035d --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/GreyLabel.gd @@ -0,0 +1,5 @@ +tool +extends Label + +func _ready(): + add_color_override("font_color", get_color("contrast_color_2", "Editor")) diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn b/project/addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn new file mode 100644 index 0000000..8590f5a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn @@ -0,0 +1,13 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.gd" type="Script" id=1] + +[node name="Label" type="Label"] +margin_top = 4.0 +margin_right = 78.0 +margin_bottom = 18.0 +text = "with portrait" +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/SignalArgumentPicker.tscn b/project/addons/dialogic/Editor/Events/Parts/Text/SignalArgumentPicker.tscn new file mode 100644 index 0000000..5c0f8ad --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/SignalArgumentPicker.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/EventPart_SignalArgumentPicker.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=3] + +[node name="SignalArgumentPicker" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +size_flags_vertical = 6 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBox" type="HBoxContainer" parent="."] +margin_top = 6.0 +margin_right = 361.0 +margin_bottom = 33.0 +size_flags_vertical = 6 + +[node name="Label" parent="HBox" instance=ExtResource( 3 )] +margin_top = 6.0 +margin_right = 227.0 +margin_bottom = 20.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "'dialogic_signal' with the argument " + +[node name="InputField" parent="HBox" instance=ExtResource( 1 )] +margin_left = 231.0 +margin_right = 361.0 +margin_bottom = 27.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/TextAndVoiceEditor.tscn b/project/addons/dialogic/Editor/Events/Parts/Text/TextAndVoiceEditor.tscn new file mode 100644 index 0000000..7710b38 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/TextAndVoiceEditor.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/EventPart_TextAndVoicePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Audio/VoiceEditor.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/TextEditor.tscn" type="PackedScene" id=3] + +[node name="TextAndVoiceEditor" type="VBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 40.0 +margin_bottom = 15.0 + +[node name="TextEditor" parent="VBoxContainer" instance=ExtResource( 3 )] +margin_bottom = 15.0 + +[node name="VoiceEditor" parent="VBoxContainer" instance=ExtResource( 2 )] +visible = false +margin_top = 4.0 +margin_right = 358.0 +margin_bottom = 44.0 diff --git a/project/addons/dialogic/Editor/Events/Parts/Text/TextEditor.tscn b/project/addons/dialogic/Editor/Events/Parts/Text/TextEditor.tscn new file mode 100644 index 0000000..472fbe4 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/Text/TextEditor.tscn @@ -0,0 +1,44 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/EventPart_TextEditor.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/TextBackground.tres" type="StyleBox" id=2] + +[sub_resource type="StyleBoxFlat" id=3] +content_margin_left = 16.0 +content_margin_top = 14.0 +bg_color = Color( 0.27451, 0.27451, 0.27451, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.192157, 0.666667, 1, 1 ) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 + +[node name="TextEditor" type="HBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextEdit" type="TextEdit" parent="."] +margin_right = 17.0 +margin_bottom = 40.0 +size_flags_vertical = 3 +custom_colors/member_variable_color = Color( 0, 0, 0, 1 ) +custom_colors/function_color = Color( 0, 0, 0, 1 ) +custom_colors/symbol_color = Color( 0, 0, 0, 1 ) +custom_colors/font_color = Color( 1, 1, 1, 1 ) +custom_colors/number_color = Color( 0, 0, 0, 1 ) +custom_styles/focus = SubResource( 3 ) +custom_styles/normal = ExtResource( 2 ) +syntax_highlighting = true +show_line_numbers = true +smooth_scrolling = true +wrap_enabled = true + +[connection signal="focus_exited" from="TextEdit" to="." method="_on_TextEdit_focus_exited"] diff --git a/project/addons/dialogic/Editor/Events/Parts/WaitSeconds/EventPart_WaitSeconds.gd b/project/addons/dialogic/Editor/Events/Parts/WaitSeconds/EventPart_WaitSeconds.gd new file mode 100644 index 0000000..cb367b1 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/WaitSeconds/EventPart_WaitSeconds.gd @@ -0,0 +1,49 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + +# has an event_data variable that stores the current data!!! + +## node references +onready var seconds_selector = $HBoxContainer/SecondsBox +onready var skippable_selector = $HBoxContainer/SkippableCheckbox +onready var hideBox_selector = $HBoxContainer/HideDialogBoxCheckbox + +# used to connect the signals +func _ready(): + seconds_selector.connect("value_changed", self, "_on_SecondsSelector_value_changed") + skippable_selector.connect("toggled", self, "_on_SkippableSelector_toggled") + hideBox_selector.connect("toggled", self, "_on_HideDialogBox_toggled") + +# called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + seconds_selector.value = event_data['wait_seconds'] + skippable_selector.pressed = event_data.get('waiting_skippable', false) + hideBox_selector.pressed = event_data.get('hide_dialogbox', true) + if event_data['wait_seconds'] == 1: + $HBoxContainer/Label2.text = "second" + else: + $HBoxContainer/Label2.text = "seconds" + +func _on_SecondsSelector_value_changed(value): + event_data['wait_seconds'] = value + if value == 1: + $HBoxContainer/Label2.text = "second" + else: + $HBoxContainer/Label2.text = "seconds" + data_changed() + +func _on_SkippableSelector_toggled(checkbox_value): + event_data['waiting_skippable'] = checkbox_value + data_changed() + +func _on_HideDialogBox_toggled(checkbox_value): + event_data['hide_dialogbox'] = checkbox_value + data_changed() + +# has to return the wanted preview, only useful for body parts +func get_preview(): + return '' diff --git a/project/addons/dialogic/Editor/Events/Parts/WaitSeconds/WaitSeconds.tscn b/project/addons/dialogic/Editor/Events/Parts/WaitSeconds/WaitSeconds.tscn new file mode 100644 index 0000000..8584cf0 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Parts/WaitSeconds/WaitSeconds.tscn @@ -0,0 +1,56 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/WaitSeconds/EventPart_WaitSeconds.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/GreyLabel.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/SpinBoxPreventDnD.gd" type="Script" id=4] + +[node name="VBoxContainer" type="VBoxContainer"] +size_flags_vertical = 4 +theme = ExtResource( 3 ) +script = ExtResource( 1 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_right = 377.0 +margin_bottom = 24.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" parent="HBoxContainer" instance=ExtResource( 2 )] +margin_top = 5.0 +margin_right = 17.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "for" + +[node name="SecondsBox" type="SpinBox" parent="HBoxContainer"] +margin_left = 21.0 +margin_right = 97.0 +margin_bottom = 24.0 +min_value = 0.1 +step = 0.1 +value = 1.0 +allow_greater = true +align = 1 +script = ExtResource( 4 ) + +[node name="Label2" parent="HBoxContainer" instance=ExtResource( 2 )] +margin_left = 101.0 +margin_top = 5.0 +margin_right = 154.0 +margin_bottom = 19.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "seconds" + +[node name="SkippableCheckbox" type="CheckBox" parent="HBoxContainer"] +margin_left = 158.0 +margin_right = 247.0 +margin_bottom = 24.0 +text = "Skippable" + +[node name="HideDialogBoxCheckbox" type="CheckBox" parent="HBoxContainer"] +margin_left = 251.0 +margin_right = 377.0 +margin_bottom = 24.0 +text = "Hide DialogBox" diff --git a/project/addons/dialogic/Editor/Events/Question.tscn b/project/addons/dialogic/Editor/Events/Question.tscn new file mode 100644 index 0000000..4f9fa3e --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Question.tscn @@ -0,0 +1,112 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/question.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/TextAndVoiceEditor.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=3] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 3 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=4] + +[node name="Question" instance=ExtResource( 3 )] +event_name = "Question" +event_data = { +"character": "", +"event_id": "dialogic_010", +"options": [ ], +"portrait": "", +"question": "" +} +event_color = Color( 0.619608, 0.466667, 0.92549, 1 ) +event_icon = ExtResource( 1 ) +header_scene = ExtResource( 2 ) +body_scene = ExtResource( 4 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/010.md" +event_category = 1 +sorting_index = 0 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 250.0 +margin_bottom = 82.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 250.0 +margin_bottom = 82.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 244.0 +margin_bottom = 76.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 234.0 +margin_bottom = 32.0 + +[node name="CenterContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="0"] +margin_bottom = 32.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.619608, 0.466667, 0.92549, 1 ) +margin_top = 16.0 +margin_bottom = 16.0 + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_top = 9.0 +margin_right = 59.0 +margin_bottom = 23.0 +text = "Question" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 59.0 +margin_right = 190.0 +margin_bottom = 32.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +visible = true +margin_left = 190.0 +margin_top = 1.0 +margin_right = 234.0 +margin_bottom = 31.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 234.0 +margin_right = 234.0 +margin_bottom = 32.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +icon = SubResource( 2 ) + +[node name="Body" parent="PanelContainer/MarginContainer/VBoxContainer" index="1"] +visible = true +margin_left = 0.0 +margin_top = 36.0 +margin_right = 234.0 +margin_bottom = 70.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +margin_top = 0.0 +margin_right = 234.0 +margin_bottom = 34.0 +custom_constants/margin_left = 0 + +[node name="AllowNoCharacter" type="Node" parent="." index="2"] + +[node name="PopupMenu" parent="." index="3"] +custom_styles/hover = SubResource( 4 ) diff --git a/project/addons/dialogic/Editor/Events/SaveEvent.tscn b/project/addons/dialogic/Editor/Events/SaveEvent.tscn new file mode 100644 index 0000000..7782997 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/SaveEvent.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg" type="Texture" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/EventPart_Save.tscn" type="PackedScene" id=3] + +[sub_resource type="Image" id=6] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 6 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[sub_resource type="Image" id=7] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 7 ) +size = Vector2( 16, 16 ) + +[node name="SaveEvent" instance=ExtResource( 1 )] +event_name = "Save" +event_data = { +"custom_slot": "", +"event_id": "dialogic_026", +"use_default_slot": true +} +event_color = Color( 0.0470588, 0.647059, 0.921569, 1 ) +event_icon = ExtResource( 2 ) +header_scene = ExtResource( 3 ) +expand_on_default = false +help_page_path = "res://addons/dialogic/Documentation/Content/Tutorials/Saving.md" +sorting_index = 2 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 190.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 190.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 184.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 174.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.0470588, 0.647059, 0.921569, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 2 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 29.0 +text = "Save" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 29.0 +margin_right = 174.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 174.0 +margin_right = 174.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +icon = SubResource( 2 ) + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/SetGlossary.tscn b/project/addons/dialogic/Editor/Events/SetGlossary.tscn new file mode 100644 index 0000000..2564419 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/SetGlossary.tscn @@ -0,0 +1,86 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/SetGlossary.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Definitions/GlossaryPicker.tscn" type="PackedScene" id=5] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg" type="Texture" id=6] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[node name="SetGlossary" instance=ExtResource( 3 )] +event_name = "Set Glossary" +event_data = { +"event_id": "dialogic_025", +"extra": "", +"glossary_id": "", +"text": "", +"title": "" +} +event_color = Color( 0.396078, 0.439216, 0.517647, 1 ) +event_icon = ExtResource( 6 ) +header_scene = ExtResource( 5 ) +body_scene = ExtResource( 4 ) +expand_on_default = false +event_category = 2 +sorting_index = 6 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 330.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 330.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 324.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 314.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.396078, 0.439216, 0.517647, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 6 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 79.0 +text = "Set Glossary" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 79.0 +margin_right = 314.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +margin_left = 164.0 +margin_right = 216.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 314.0 +margin_right = 314.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +margin_left = 924.0 +margin_right = 954.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +custom_constants/margin_left = 0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 4 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/SetTheme.tscn b/project/addons/dialogic/Editor/Events/SetTheme.tscn new file mode 100644 index 0000000..4f94993 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/SetTheme.tscn @@ -0,0 +1,72 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Themes/ThemePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[node name="SetTheme" instance=ExtResource( 2 )] +event_name = "Change Theme" +event_data = { +"event_id": "dialogic_024", +"set_theme": "" +} +event_color = Color( 0.964706, 0.239216, 0.403922, 1 ) +event_icon = ExtResource( 1 ) +header_scene = ExtResource( 4 ) +event_category = 3 +sorting_index = 2 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 309.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 309.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 303.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 293.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.964706, 0.239216, 0.403922, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 3 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 94.0 +text = "Change Theme" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 94.0 +margin_right = 293.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 293.0 +margin_right = 293.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/SetValue.tscn b/project/addons/dialogic/Editor/Events/SetValue.tscn new file mode 100644 index 0000000..e7df5ac --- /dev/null +++ b/project/addons/dialogic/Editor/Events/SetValue.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/set-value.svg" type="Texture" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Logic/SetValuePicker.tscn" type="PackedScene" id=4] + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=5] + +[sub_resource type="Image" id=6] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 6 ) +size = Vector2( 16, 16 ) + +[node name="SetValue" instance=ExtResource( 1 )] +event_name = "Set Value" +event_data = { +"definition": "", +"event_id": "dialogic_014", +"operation": "=", +"random_upper_limit": 100.0, +"set_random": false, +"set_value": "" +} +event_color = Color( 0.396078, 0.439216, 0.517647, 1 ) +event_icon = ExtResource( 2 ) +header_scene = ExtResource( 4 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/014.md" +event_category = 2 +sorting_index = 5 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 429.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 429.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 423.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 413.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.396078, 0.439216, 0.517647, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 2 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 59.0 +text = "Set Value" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 59.0 +margin_right = 413.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 413.0 +margin_right = 413.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +icon = SubResource( 2 ) + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/Templates/EventBlock.gd b/project/addons/dialogic/Editor/Events/Templates/EventBlock.gd new file mode 100644 index 0000000..35a447f --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Templates/EventBlock.gd @@ -0,0 +1,310 @@ +tool +extends HBoxContainer + +# customization options for the event + +# This is the default data that is going to be saved to json +export(String) var event_name : String = 'Event name' +export (Dictionary) var event_data: Dictionary = {'event_id':'dialogic_000'} +export(Color) var event_color: Color = Color(0.6,0.6,0.6,1) +export(Texture) var event_icon : Texture + +export(PackedScene) var header_scene : PackedScene +export(PackedScene) var body_scene : PackedScene + +export (bool) var expand_on_default := false +export (bool) var needs_indentation := false +export (String) var help_page_path := "" +export (bool) var show_name_in_timeline := true +export(int, "Main", "Logic", "Timeline", "Audio/Visual", "Godot") var event_category = 0 +export (int) var sorting_index = -1 +signal option_action(action_name) + + +### internal node eferences +onready var panel = $PanelContainer +onready var selected_style = $PanelContainer/SelectedStyle +onready var warning = $PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel/Warning +onready var title_label = $PanelContainer/MarginContainer/VBoxContainer/Header/TitleLabel +onready var icon_texture = $PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel/IconTexture +onready var expand_control = $PanelContainer/MarginContainer/VBoxContainer/Header/ExpandControl +onready var header_content_container = $PanelContainer/MarginContainer/VBoxContainer/Header/Content +onready var body_container = $PanelContainer/MarginContainer/VBoxContainer/Body +onready var body_content_container = $PanelContainer/MarginContainer/VBoxContainer/Body/Content +onready var indent_node = $Indent +onready var help_button = $PanelContainer/MarginContainer/VBoxContainer/Header/HelpButton +var header_node +var body_node + +### extarnal node references +var editor_reference + +### the indent size +var indent_size = 45 +var current_indent_level = 1 + +# Setting this to true will ignore the event while saving +# Useful for making placeholder events in drag and drop +var ignore_save = false + +## ***************************************************************************** +## PUBLIC METHODS +## ***************************************************************************** + +func visual_select(): + selected_style.show() + + +func visual_deselect(): + if selected_style: + selected_style.hide() + + +# called by the timeline before adding it to the tree +func load_data(data): + event_data = data + +# called to inform event parts, that a focus is wanted +func focus(): + if get_header(): + get_header().focus() + if get_body(): + get_body().focus() + +func get_body(): + return body_node + + +func get_header(): + return header_node + + +func set_warning(text): + warning.show() + warning.hint_tooltip = text + + +func remove_warning(text = ''): + if warning.hint_tooltip == text or text == '': + warning.hide() + + +func set_preview(text: String): + expand_control.set_preview(text) + + +func set_indent(indent: int): + indent_node.rect_min_size = Vector2(indent_size * indent, 0) + indent_node.visible = indent != 0 + current_indent_level = indent + update() + + +func set_expanded(expanded: bool): + expand_control.set_expanded(expanded) + + +## ***************************************************************************** +## PRIVATE METHODS +## ***************************************************************************** + +func _set_event_icon(icon: Texture): + icon_texture.texture = icon + var _scale = DialogicUtil.get_editor_scale(self) + var cpanel = $PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer + var ip = $PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel + var ipc = $PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel/IconTexture + # Change color if light theme + ipc.self_modulate = Color(1,1,1,1) + if not get_constant("dark_theme", "Editor"): + icon_texture.self_modulate = get_color("font_color", "Editor") + # Resizing the icon acording to the scale + var icon_size = 38 + cpanel.rect_min_size = Vector2(icon_size, icon_size) * _scale + ip.rect_min_size = cpanel.rect_min_size + ipc.rect_min_size = ip.rect_min_size + #rect_min_size.y = 50 * _scale + #icon_texture.rect_size = icon_texture.rect_size * _scale + + +func _set_event_name(text: String): + if show_name_in_timeline: + title_label.text = text + else: + var t_label = get_node_or_null("PanelContainer/MarginContainer/VBoxContainer/Header/TitleLabel") + if t_label: + t_label.queue_free() + + + +func _set_header(scene: PackedScene): + header_node = _set_content(header_content_container, scene) + + +func _set_body(scene: PackedScene): + body_node = _set_content(body_content_container, scene) + # show the expand toggle + expand_control.set_enabled(body_node != null) + + +func _setup_event(): + if event_icon != null: + _set_event_icon(event_icon) + if event_name != null: + _set_event_name(event_name) + if header_scene != null: + _set_header(header_scene) + if body_scene != null: + _set_body(body_scene) + body_content_container.add_constant_override('margin_left', 40*DialogicUtil.get_editor_scale(self)) + if event_color != null: + $PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel.set("self_modulate", event_color) + + +func _set_content(container: Control, scene: PackedScene): + for c in container.get_children(): + container.remove_child(c) + if scene != null: + var node = scene.instance() + node.editor_reference = editor_reference + container.add_child(node) +# node.set_owner(get_tree().get_edited_scene_root()) + return node + return null + + +func _on_ExpandControl_state_changed(expanded: bool): + if expanded: + if body_node: + body_container.show() + else: + if body_node: + body_container.hide() + expand_control.set_preview(body_node.get_preview()) + + +func _on_OptionsControl_action(index): + if index == 0: + if help_page_path: + var master_tree = editor_reference.get_node_or_null('MainPanel/MasterTreeContainer/MasterTree') + master_tree.select_documentation_item(help_page_path) + elif index == 2: + emit_signal("option_action", "up") + elif index == 3: + emit_signal("option_action", "down") + elif index == 5: + emit_signal("option_action", "remove") + + +func _on_Indent_visibility_changed(): + if not indent_node: + return + if needs_indentation: + if indent_node.visible: + remove_warning(editor_reference.dialogicTranslator.translate("This event needs a question event around it!")) + else: + set_warning(editor_reference.dialogicTranslator.translate("This event needs a question event around it!")) + + +func _on_gui_input(event): + if event is InputEventMouseButton and event.is_pressed() and event.button_index == 1: + grab_focus() # Grab focus to avoid copy pasting text or events + if event.doubleclick and expand_control.enabled: + expand_control.set_expanded(not expand_control.expanded) + # For opening the context menu + if event is InputEventMouseButton: + if event.button_index == BUTTON_RIGHT and event.pressed: + $PopupMenu.rect_global_position = get_global_mouse_position() + var popup = $PopupMenu.popup() + + +# called when the data of the header is changed +func _on_Header_data_changed(new_event_data): + event_data = new_event_data + + # update the body in case it has to + if get_body(): + get_body().load_data(event_data) + + +# called when the data of the body is changed +func _on_Body_data_changed(new_event_data): + event_data = new_event_data + + # update the header in case it has to + if get_header(): + get_header().load_data(event_data) + +func _request_set_body_enabled(enabled:bool): + expand_control.set_enabled(enabled) + + if get_body(): + get_body().visible = enabled + +func _request_selection(): + var timeline_editor = editor_reference.get_node_or_null('MainPanel/TimelineEditor') + if (timeline_editor != null): + # @todo select item and clear selection is marked as "private" in TimelineEditor.gd + # consider to make it "public" or add a public helper function + timeline_editor.select_item(self) + +## ***************************************************************************** +## OVERRIDES +## ***************************************************************************** + +func _ready(): + + # We only want to call this on actual Dialogic nodes, not custom events + if(event_data['event_id'].split("_")[0] == "dialogic"): + event_name = editor_reference.dialogicTranslator.translate(event_name) + + ## DO SOME STYLING + $PanelContainer/SelectedStyle.modulate = get_color("accent_color", "Editor") + warning.texture = get_icon("NodeWarning", "EditorIcons") + title_label.add_color_override("font_color", Color.white) + if not get_constant("dark_theme", "Editor"): + title_label.add_color_override("font_color", get_color("font_color", "Editor")) + + indent_size = indent_size * DialogicUtil.get_editor_scale(self) + + _setup_event() + + set_focus_mode(1) # Allowing this node to grab focus + + # signals + panel.connect("gui_input", self, '_on_gui_input') + expand_control.connect("state_changed", self, "_on_ExpandControl_state_changed") + $PopupMenu.connect("index_pressed", self, "_on_OptionsControl_action") + + # load icons + #if help_page_path != "": + # help_button.icon = get_icon("HelpSearch", "EditorIcons") + # help_button.show() + + # when it enters the tree, load the data into the header/body + # If there is any external data, it will be set already BEFORE the event is added to tree + # if you have a header + if get_header(): + get_header().connect("data_changed", self, "_on_Header_data_changed") + get_header().connect("request_open_body", expand_control, "set_expanded", [true]) + get_header().connect("request_close_body", expand_control, "set_expanded", [false]) + get_header().connect("request_selection", self, "_request_selection") + get_header().connect("request_set_body_enabled", self, "_request_set_body_enabled") + get_header().connect("set_warning", self, "set_warning") + get_header().connect("remove_warning", self, "remove_warning") + get_header().load_data(event_data) + # if you have a body + if get_body(): + get_body().connect("data_changed", self, "_on_Body_data_changed") + get_body().connect("request_open_body", expand_control, "set_expanded", [true]) + get_body().connect("request_close_body", expand_control, "set_expanded", [false]) + get_body().connect("request_set_body_enabled", self, "_request_set_body_enabled") + get_body().connect("request_selection", self, "_request_selection") + get_body().connect("set_warning", self, "set_warning") + get_body().connect("remove_warning", self, "remove_warning") + get_body().load_data(event_data) + + if get_body(): + set_expanded(expand_on_default) + + _on_Indent_visibility_changed() diff --git a/project/addons/dialogic/Editor/Events/Templates/EventTemplate.tscn b/project/addons/dialogic/Editor/Events/Templates/EventTemplate.tscn new file mode 100644 index 0000000..c922f36 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/Templates/EventTemplate.tscn @@ -0,0 +1,210 @@ +[gd_scene load_steps=12 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventBlock.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/EventBlock/ExpandControl.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres" type="StyleBox" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres" type="StyleBox" id=5] +[ext_resource path="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg" type="Texture" id=6] +[ext_resource path="res://addons/dialogic/Images/Event Icons/event-outline.svg" type="Texture" id=7] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/EventBlock/PopupMenu.gd" type="Script" id=8] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 0.6, 0.6, 0.6, 0 ) + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=4] + +[node name="EventTemplate" type="HBoxContainer"] +anchor_right = 1.0 +margin_right = -922.0 +margin_bottom = 76.0 +focus_mode = 1 +size_flags_horizontal = 3 +size_flags_vertical = 9 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} +event_name = "" +event_data = { +"event_id": "dialogic_000" +} +expand_on_default = true + +[node name="Indent" type="Control" parent="."] +visible = false +margin_bottom = 64.0 + +[node name="PanelContainer" type="PanelContainer" parent="."] +margin_right = 102.0 +margin_bottom = 76.0 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/panel = SubResource( 1 ) + +[node name="SelectedStyle" type="Panel" parent="PanelContainer"] +visible = false +modulate = Color( 0, 0, 0, 1 ) +margin_right = 76.0 +margin_bottom = 50.0 +custom_styles/panel = ExtResource( 3 ) + +[node name="MarginContainer" type="MarginContainer" parent="PanelContainer"] +margin_right = 102.0 +margin_bottom = 76.0 +mouse_filter = 1 +size_flags_vertical = 3 +custom_constants/margin_right = 6 +custom_constants/margin_top = 6 +custom_constants/margin_left = 10 +custom_constants/margin_bottom = 6 + +[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/MarginContainer"] +margin_left = 10.0 +margin_top = 6.0 +margin_right = 96.0 +margin_bottom = 70.0 +rect_min_size = Vector2( 0, 30 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Header" type="HBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"] +margin_right = 86.0 +margin_bottom = 64.0 +rect_min_size = Vector2( 0, 32 ) +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 0 + +[node name="CenterContainer" type="CenterContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header"] +margin_bottom = 64.0 +mouse_filter = 1 + +[node name="IconPanel" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer"] +self_modulate = Color( 0.6, 0.6, 0.6, 1 ) +margin_top = 32.0 +margin_bottom = 32.0 +mouse_default_cursor_shape = 6 +texture = ExtResource( 7 ) +expand = true +stretch_mode = 1 + +[node name="IconTexture" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel"] +anchor_left = 1.0 +anchor_right = 1.0 +grow_horizontal = 0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 6 ) +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Warning" type="TextureRect" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel"] +visible = false +margin_left = -9.19241 +margin_top = -4.24266 +margin_right = 12.8076 +margin_bottom = 17.7573 +hint_tooltip = "Choice events should go +between a [Question] +and [End branch] events. + +[Question] + [Choice] + [...] +[End branch]" +texture = SubResource( 3 ) +stretch_mode = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TitleLabel" type="Label" parent="PanelContainer/MarginContainer/VBoxContainer/Header"] +margin_top = 25.0 +margin_bottom = 39.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) + +[node name="Content" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header"] +margin_right = 10.0 +margin_bottom = 64.0 +mouse_filter = 1 +custom_constants/margin_right = 5 +custom_constants/margin_left = 5 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" instance=ExtResource( 2 )] +margin_left = 178.0 +margin_right = 242.0 + +[node name="Spacer" type="Control" parent="PanelContainer/MarginContainer/VBoxContainer/Header"] +margin_left = 10.0 +margin_right = 86.0 +margin_bottom = 64.0 +mouse_filter = 1 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HelpButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer/Header"] +visible = false +margin_left = 90.0 +margin_right = 120.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 30, 30 ) +hint_tooltip = "Open the documentation of this event" +flat = true +clip_text = true +expand_icon = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Body" type="VBoxContainer" parent="PanelContainer/MarginContainer/VBoxContainer"] +visible = false +margin_left = 202.0 +margin_top = 34.0 +margin_right = 1012.0 +margin_bottom = 42.0 +custom_constants/separation = 0 + +[node name="Content" type="MarginContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Body"] +margin_top = 4.0 +margin_right = 1012.0 +margin_bottom = 8.0 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/margin_top = 2 +custom_constants/margin_bottom = 2 + +[node name="PopupMenu" type="PopupMenu" parent="."] +margin_left = 38.0 +margin_right = 133.0 +margin_bottom = 88.0 +custom_colors/font_color_hover = Color( 0, 0, 0, 1 ) +custom_constants/vseparation = 0 +custom_styles/hover = SubResource( 4 ) +custom_styles/panel = ExtResource( 5 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] +script = ExtResource( 8 ) + +[connection signal="visibility_changed" from="Indent" to="." method="_on_Indent_visibility_changed"] +[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/Header/HelpButton" to="." method="_on_HelpButton_pressed"] diff --git a/project/addons/dialogic/Editor/Events/TextEvent.tscn b/project/addons/dialogic/Editor/Events/TextEvent.tscn new file mode 100644 index 0000000..552732e --- /dev/null +++ b/project/addons/dialogic/Editor/Events/TextEvent.tscn @@ -0,0 +1,120 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/Characters/CharacterAndPortraitPicker.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/TextAndVoiceEditor.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/text-event.svg" type="Texture" id=5] + +[sub_resource type="Image" id=7] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=4] +flags = 4 +flags = 4 +image = SubResource( 7 ) +size = Vector2( 16, 16 ) + +[sub_resource type="Image" id=8] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 8 ) +size = Vector2( 16, 16 ) + +[sub_resource type="StyleBoxEmpty" id=6] + +[node name="TextEvent" instance=ExtResource( 3 )] +event_name = "Text" +event_data = { +"character": "", +"event_id": "dialogic_001", +"portrait": "", +"text": "" +} +event_color = Color( 1, 1, 1, 1 ) +event_icon = ExtResource( 5 ) +header_scene = ExtResource( 1 ) +body_scene = ExtResource( 4 ) +help_page_path = "res://addons/dialogic/Documentation/Content/Events/001.md" +show_name_in_timeline = false +sorting_index = 0 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 207.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 207.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 201.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 191.0 +margin_bottom = 41.0 + +[node name="CenterContainer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="0"] +margin_bottom = 41.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 1, 1, 1, 1 ) +margin_top = 20.0 +margin_bottom = 20.0 + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 5 ) + +[node name="Warning" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="1"] +texture = SubResource( 4 ) + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 147.0 +margin_bottom = 41.0 + +[node name="ExpandControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +visible = true +margin_left = 147.0 +margin_top = 5.0 +margin_right = 191.0 +margin_bottom = 35.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="3"] +margin_left = 191.0 +margin_right = 191.0 +margin_bottom = 41.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +icon = SubResource( 2 ) + +[node name="Body" parent="PanelContainer/MarginContainer/VBoxContainer" index="1"] +visible = true +margin_left = 0.0 +margin_top = 45.0 +margin_right = 191.0 +margin_bottom = 64.0 + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Body" index="0"] +margin_top = 0.0 +margin_right = 191.0 +margin_bottom = 19.0 +custom_constants/margin_left = 0 + +[node name="AllowNoCharacter" type="Node" parent="." index="2"] + +[node name="PopupMenu" parent="." index="3"] +custom_styles/hover = SubResource( 6 ) +items = [ "Documentation", SubResource( 4 ), 0, false, false, -1, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 4 ), 0, false, false, 1, 0, null, "", false, "Move down", SubResource( 4 ), 0, false, false, 2, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 4 ), 0, false, false, 4, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/WaitSeconds.tscn b/project/addons/dialogic/Editor/Events/WaitSeconds.tscn new file mode 100644 index 0000000..2c95ce0 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/WaitSeconds.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/WaitSeconds/WaitSeconds.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=4] + +[sub_resource type="StyleBoxEmpty" id=4] + +[sub_resource type="Image" id=5] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 5 ) +size = Vector2( 16, 16 ) + +[node name="WaitSeconds" instance=ExtResource( 4 )] +event_name = "Wait" +event_data = { +"event_id": "dialogic_023", +"hide_dialogbox": true, +"wait_seconds": 1.0 +} +event_color = Color( 0.396078, 0.439216, 0.517647, 1 ) +event_icon = ExtResource( 1 ) +header_scene = ExtResource( 2 ) +event_category = 2 +sorting_index = 7 + +[node name="PanelContainer" parent="." index="1"] +margin_right = 425.0 + +[node name="MarginContainer" parent="PanelContainer" index="1"] +margin_right = 425.0 + +[node name="VBoxContainer" parent="PanelContainer/MarginContainer" index="0"] +margin_right = 419.0 + +[node name="Header" parent="PanelContainer/MarginContainer/VBoxContainer" index="0"] +margin_right = 409.0 + +[node name="IconPanel" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer" index="0"] +self_modulate = Color( 0.396078, 0.439216, 0.517647, 1 ) + +[node name="IconTexture" parent="PanelContainer/MarginContainer/VBoxContainer/Header/CenterContainer/IconPanel" index="0"] +self_modulate = Color( 0, 0, 0, 1 ) +texture = ExtResource( 1 ) + +[node name="TitleLabel" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="1"] +margin_right = 29.0 +text = "Wait" + +[node name="Content" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="2"] +margin_left = 29.0 +margin_right = 409.0 + +[node name="Spacer" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="4"] +margin_left = 409.0 +margin_right = 409.0 + +[node name="HelpButton" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="5"] +margin_left = 400.0 +margin_right = 430.0 + +[node name="PopupMenu" parent="." index="2"] +custom_styles/hover = SubResource( 4 ) +items = [ "Documentation", SubResource( 3 ), 0, false, false, 0, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Move up", SubResource( 3 ), 0, false, false, 2, 0, null, "", false, "Move down", SubResource( 3 ), 0, false, false, 3, 0, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Delete", SubResource( 3 ), 0, false, false, 5, 0, null, "", false ] diff --git a/project/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres b/project/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres new file mode 100644 index 0000000..979ce56 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres @@ -0,0 +1,32 @@ +[gd_resource type="Theme" load_steps=2 format=2] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 11.0 +content_margin_right = 9.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0.12549, 0.141176, 0.192157, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.0980392, 0.113725, 0.152941, 1 ) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 + +[resource] +LineEdit/colors/clear_button_color = Color( 0, 0, 0, 1 ) +LineEdit/colors/clear_button_color_pressed = Color( 0, 0, 0, 1 ) +LineEdit/colors/cursor_color = Color( 1, 1, 1, 1 ) +LineEdit/colors/font_color = Color( 1, 1, 1, 1 ) +LineEdit/colors/font_color_selected = Color( 1, 1, 1, 1 ) +LineEdit/colors/font_color_uneditable = Color( 1, 1, 1, 1 ) +LineEdit/colors/selection_color = Color( 1, 1, 1, 0.235294 ) +LineEdit/constants/minimum_spaces = 10 +LineEdit/fonts/font = null +LineEdit/icons/clear = null +LineEdit/styles/focus = SubResource( 1 ) +LineEdit/styles/normal = SubResource( 1 ) +LineEdit/styles/read_only = SubResource( 1 ) diff --git a/project/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres b/project/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres new file mode 100644 index 0000000..ecf8376 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/ResourceMenuHover.tres @@ -0,0 +1,11 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 25.0 +content_margin_right = 10.0 +content_margin_top = 4.0 +content_margin_bottom = 4.0 +bg_color = Color( 0.466667, 0.466667, 0.466667, 0.141176 ) +border_width_bottom = 2 +corner_radius_top_left = 4 +corner_radius_top_right = 4 diff --git a/project/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres b/project/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres new file mode 100644 index 0000000..d14860a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/ResourceMenuNormal.tres @@ -0,0 +1,13 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 25.0 +content_margin_right = 10.0 +content_margin_top = 4.0 +content_margin_bottom = 4.0 +bg_color = Color( 0.180392, 0.180392, 0.180392, 0.219608 ) +draw_center = false +border_width_bottom = 2 +border_color = Color( 0.8, 0.8, 0.8, 0.286275 ) +corner_radius_top_left = 4 +corner_radius_top_right = 4 diff --git a/project/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres b/project/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres new file mode 100644 index 0000000..41c5bcc --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres @@ -0,0 +1,17 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 10.0 +content_margin_right = 10.0 +content_margin_top = 10.0 +content_margin_bottom = 10.0 +bg_color = Color( 0.2, 0.23, 0.31, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.8, 0.8, 0.8, 0.109804 ) +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 diff --git a/project/addons/dialogic/Editor/Events/styles/SectionPanel.tres b/project/addons/dialogic/Editor/Events/styles/SectionPanel.tres new file mode 100644 index 0000000..b886c6e --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/SectionPanel.tres @@ -0,0 +1,17 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 6.0 +content_margin_right = 6.0 +content_margin_top = 5.0 +content_margin_bottom = 4.0 +bg_color = Color( 0.6, 0.6, 0.6, 0 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.2, 0.227451, 0.309804, 1 ) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 diff --git a/project/addons/dialogic/Editor/Events/styles/SettingsFieldBackground.tres b/project/addons/dialogic/Editor/Events/styles/SettingsFieldBackground.tres new file mode 100644 index 0000000..91b4b38 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/SettingsFieldBackground.tres @@ -0,0 +1,18 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 30.0 +content_margin_right = 25.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0.12549, 0.141176, 0.192157, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.0980392, 0.113725, 0.152941, 1 ) +border_blend = true +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 diff --git a/project/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres b/project/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres new file mode 100644 index 0000000..5be19d4 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/SimpleButtonHover.tres @@ -0,0 +1,17 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 3.0 +content_margin_right = 3.0 +content_margin_top = 3.0 +content_margin_bottom = 3.0 +bg_color = Color( 0.2, 0.231373, 0.309804, 0.317647 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.8, 0.8, 0.8, 0.109804 ) +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 diff --git a/project/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres b/project/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres new file mode 100644 index 0000000..e5c06b4 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/SimpleButtonNormal.tres @@ -0,0 +1,17 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 3.0 +content_margin_right = 3.0 +content_margin_top = 3.0 +content_margin_bottom = 3.0 +bg_color = Color( 0.2, 0.231373, 0.309804, 0.235294 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.8, 0.8, 0.8, 0.109804 ) +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 diff --git a/project/addons/dialogic/Editor/Events/styles/TextBackground.tres b/project/addons/dialogic/Editor/Events/styles/TextBackground.tres new file mode 100644 index 0000000..0000e9a --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/TextBackground.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 16.0 +content_margin_top = 14.0 +bg_color = Color( 0.27451, 0.27451, 0.27451, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.454902, 0.454902, 0.454902, 1 ) +corner_radius_top_left = 8 +corner_radius_top_right = 8 +corner_radius_bottom_right = 8 +corner_radius_bottom_left = 8 diff --git a/project/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres b/project/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres new file mode 100644 index 0000000..c211211 --- /dev/null +++ b/project/addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres @@ -0,0 +1,12 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +content_margin_left = 16.0 +content_margin_right = 6.0 +content_margin_top = 6.0 +content_margin_bottom = 0.0 +bg_color = Color( 0.509804, 0.509804, 0.509804, 0.207843 ) +border_width_left = 5 +border_color = Color( 1, 1, 1, 1 ) +expand_margin_top = 2.0 +expand_margin_bottom = 2.0 diff --git a/project/addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.gd b/project/addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.gd new file mode 100644 index 0000000..9b9f55e --- /dev/null +++ b/project/addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.gd @@ -0,0 +1,71 @@ +tool +extends ScrollContainer + +var editor_reference +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +var current_definition = null + +onready var nodes = { + 'name' : $VBoxContainer/HBoxContainer/VBoxContainer/Name, + 'extra_editor': $VBoxContainer/HBoxContainer/ExtraInfo, + 'extra_title': $VBoxContainer/HBoxContainer/ExtraInfo/Title, + 'extra_text': $VBoxContainer/HBoxContainer/ExtraInfo/Text, + 'extra_extra': $VBoxContainer/HBoxContainer/ExtraInfo/Extra, +} + +func _ready(): + editor_reference = find_parent('EditorView') + reset_editor() + nodes['name'].connect('text_changed', self, '_on_name_changed') + nodes['name'].connect('focus_exited', self, '_update_name_on_tree') + + +func is_selected(id: String): + return current_definition != null and current_definition['id'] == id + + +func load_definition(id): + current_definition = DialogicResources.get_default_definition_item(id) + reset_editor() + nodes['name'].editable = true + nodes['name'].text = current_definition['name'] + nodes['extra_title'].text = current_definition['title'] + nodes['extra_text'].text = current_definition['text'] + nodes['extra_extra'].text = current_definition['extra'] + + +func reset_editor(): + nodes['name'].text = '' + nodes['extra_title'].text = '' + nodes['extra_text'].text = '' + nodes['extra_extra'].text = '' + + +func _on_name_changed(text): + if current_definition != null: + save_definition() + + +func _input(event): + if event is InputEventKey and event.pressed: + if nodes['name'].has_focus(): + if event.scancode == KEY_ENTER: + nodes['name'].release_focus() + + +func _update_name_on_tree(): + var item = master_tree.get_selected() + item.set_text(0, nodes['name'].text) + if current_definition != null: + save_definition() + master_tree.build_definitions(current_definition['id']) + + +func create_glossary_entry() -> String: + var id = DialogicUtil.generate_random_id() + DialogicResources.set_default_definition_glossary(id, 'New glossary entry', '', '', '') + return id + +func save_definition(): + if current_definition != null and current_definition['id'] != '': + DialogicResources.set_default_definition_glossary(current_definition['id'], nodes['name'].text, nodes['extra_title'].text, nodes['extra_text'].text, nodes['extra_extra'].text) diff --git a/project/addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.tscn b/project/addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.tscn new file mode 100644 index 0000000..f08c653 --- /dev/null +++ b/project/addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/GlossaryEntryEditor/GlossaryEntryEditor.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=2] + +[node name="GlossaryEntryEditor" type="ScrollContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 1024.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1024.0 +margin_bottom = 192.0 +custom_constants/separation = 16 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] +margin_right = 300.0 +margin_bottom = 192.0 +rect_min_size = Vector2( 300, 0 ) +custom_constants/separation = 10 + +[node name="TLabel" parent="VBoxContainer/HBoxContainer/VBoxContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 300.0 +margin_bottom = 14.0 +text = "Name:" +text_key = "GlossaryName" + +[node name="Name" type="LineEdit" parent="VBoxContainer/HBoxContainer/VBoxContainer"] +margin_top = 24.0 +margin_right = 300.0 +margin_bottom = 48.0 + +[node name="TLabel2" parent="VBoxContainer/HBoxContainer/VBoxContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 58.0 +margin_right = 300.0 +margin_bottom = 89.0 +text = "A popup will display this information when a player hovers the word in a dialog." +autowrap = true +text_key = "GlossaryExplanation" + +[node name="ExtraInfo" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] +margin_left = 316.0 +margin_right = 616.0 +margin_bottom = 192.0 +rect_min_size = Vector2( 300, 0 ) +custom_constants/separation = 10 + +[node name="TLabel3" parent="VBoxContainer/HBoxContainer/ExtraInfo" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 300.0 +margin_bottom = 14.0 +text = "Content:" +text_key = "GlossaryContent" + +[node name="Title" type="LineEdit" parent="VBoxContainer/HBoxContainer/ExtraInfo"] +margin_top = 24.0 +margin_right = 300.0 +margin_bottom = 48.0 +placeholder_text = "Title" + +[node name="Text" type="TextEdit" parent="VBoxContainer/HBoxContainer/ExtraInfo"] +margin_top = 58.0 +margin_right = 300.0 +margin_bottom = 158.0 +rect_min_size = Vector2( 0, 100 ) +size_flags_vertical = 3 +wrap_enabled = true + +[node name="Extra" type="LineEdit" parent="VBoxContainer/HBoxContainer/ExtraInfo"] +margin_top = 168.0 +margin_right = 300.0 +margin_bottom = 192.0 +placeholder_text = "Extra" diff --git a/project/addons/dialogic/Editor/MasterTree/DragPreview.tscn b/project/addons/dialogic/Editor/MasterTree/DragPreview.tscn new file mode 100644 index 0000000..714cd61 --- /dev/null +++ b/project/addons/dialogic/Editor/MasterTree/DragPreview.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=2 format=2] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 1, 1, 1, 1 ) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color( 0.568627, 0.568627, 0.568627, 1 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + +[node name="DragPreview" type="CenterContainer"] +margin_right = 38.0 +margin_bottom = 34.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Panel" type="PanelContainer" parent="."] +margin_left = 3.0 +margin_top = 3.0 +margin_right = 35.0 +margin_bottom = 31.0 +custom_styles/panel = SubResource( 1 ) + +[node name="HBox" type="HBoxContainer" parent="Panel"] +margin_left = 4.0 +margin_top = 4.0 +margin_right = 28.0 +margin_bottom = 24.0 + +[node name="Icon" type="TextureRect" parent="Panel/HBox"] +margin_right = 20.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 20, 20 ) +expand = true +stretch_mode = 4 + +[node name="Label" type="Label" parent="Panel/HBox"] +margin_left = 24.0 +margin_top = 3.0 +margin_right = 24.0 +margin_bottom = 17.0 +size_flags_horizontal = 3 diff --git a/project/addons/dialogic/Editor/MasterTree/MasterTree.gd b/project/addons/dialogic/Editor/MasterTree/MasterTree.gd new file mode 100644 index 0000000..7dbaf12 --- /dev/null +++ b/project/addons/dialogic/Editor/MasterTree/MasterTree.gd @@ -0,0 +1,949 @@ +tool +extends Tree + +var editor_reference +onready var timeline_editor = get_node('../../TimelineEditor') +onready var character_editor = get_node('../../CharacterEditor') +onready var value_editor = get_node('../../ValueEditor') +onready var glossary_entry_editor = get_node('../../GlossaryEntryEditor') +onready var settings_editor = get_node('../../SettingsEditor') +onready var theme_editor = get_node('../../ThemeEditor') +onready var documentation_viewer = get_node('../../DocumentationViewer') +onready var empty_editor = get_node('../../Empty') +onready var filter_tree_edit = get_node('../FilterMasterTreeEdit') + +onready var tree = self + +var timeline_icon +var character_icon +var theme_icon +var definition_icon +var glossary_icon +var documentation_icon + +var timelines_tree +var characters_tree +var definitions_tree +var themes_tree +var settings_tree +var documentation_tree + + +var item_path_before_edit = "" + +# dragging items +var dragging_item = null +var drag_preview = load("res://addons/dialogic/Editor/MasterTree/DragPreview.tscn") + +var rmb_popup_menus = {} + +var filter_tree_term = '' + +signal editor_selected(selected) + +func _ready(): + editor_reference = find_parent('EditorView') + # Tree Settings + allow_rmb_select = true + var root = tree.create_item() + tree.set_hide_root(true) + + # Scaling + var modifier = '' + var _scale = DialogicUtil.get_editor_scale(self) + + rect_min_size.x = 150 + if _scale == 1.25: + modifier = '-1.25' + rect_min_size.x = 180 + if _scale == 1.5: + modifier = '-1.25' + rect_min_size.x = 250 + if _scale == 1.75: + modifier = '-1.25' + rect_min_size.x = 250 + if _scale == 2: + modifier = '-2' + rect_min_size.x = 360 + rect_size.x = 0 + + # Icons + timeline_icon = load("res://addons/dialogic/Images/Resources/timeline" + modifier + ".svg") + character_icon = load("res://addons/dialogic/Images/Resources/character" + modifier + ".svg") + theme_icon = load("res://addons/dialogic/Images/Resources/theme" + modifier + ".svg") + definition_icon = load("res://addons/dialogic/Images/Resources/definition" + modifier + ".svg") + glossary_icon = get_icon("ListSelect", "EditorIcons") + + # Creating the root items + for tree_info in [ + # variable name editor + ["Timelines", "Timeline Root"], + ["Characters", "Character Root"], + ["Definitions", "Definition Root"], + ["Themes", "Theme Root"], + ]: + # create tree item + var sub_tree = tree.create_item(root) + # set the item + sub_tree.set_icon(0, get_icon("Folder", "EditorIcons")) + sub_tree.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) + # set info + sub_tree.set_text(0, tree_info[0]) + sub_tree.collapsed = DialogicUtil.get_folder_meta(tree_info[0], 'folded') + sub_tree.set_metadata(0, {'editor': tree_info[1]}) + # set the correct tree variable + match tree_info[0]: + "Timelines": + timelines_tree = sub_tree + "Characters": + characters_tree = sub_tree + "Definitions": + definitions_tree = sub_tree + "Themes": + themes_tree = sub_tree + + settings_tree = tree.create_item(root) + settings_tree.set_text(0, editor_reference.dialogicTranslator.translate("Settings")) + settings_tree.set_icon(0, get_icon("GDScript", "EditorIcons")) + settings_tree.set_metadata(0, {'editor': 'Settings'}) + + documentation_tree = tree.create_item(root) + documentation_tree.set_text(0, editor_reference.dialogicTranslator.translate("Help")) + documentation_tree.set_icon(0, get_icon("HelpSearch", "EditorIcons")) + documentation_tree.set_metadata(0, {'editor': 'Documentation Root', 'name':'Start', 'path':'Welcome.md'}) + + + # creates the context menus + create_rmb_context_menus() + + # connecting signals + connect('item_selected', self, '_on_item_selected') + connect('item_rmb_selected', self, '_on_item_rmb_selected') + connect('item_collapsed', self, '_on_item_collapsed') + connect('gui_input', self, '_on_gui_input') + connect('item_edited', self, '_on_item_edited') + $RenamerReset.connect("timeout", self, '_on_renamer_reset_timeout') + filter_tree_edit.connect("text_changed", self, '_on_filter_tree_edit_changed') + + # build all tree parts + build_full_tree() + + # Adding docs + build_documentation() + + # Default empty screen. + hide_all_editors() + + # AutoSave timer + $AutoSave.connect("timeout", self, '_on_autosave_timeout') + $AutoSave.start(0.5) + +## ***************************************************************************** +## BUILDING THE TREE +## ***************************************************************************** + +func build_full_tree(selected_item: String = ''): + # Adding timelines + build_timelines(selected_item) + # Adding characters + build_characters(selected_item) + # Adding Definitions + build_definitions(selected_item) + # Adding Themes + build_themes(selected_item) + + +func _clear_tree_children(parent: TreeItem): + while parent.get_children() != null: + parent.get_children().free() + + +func build_resource_folder(parent_folder_item:TreeItem, folder_data:Dictionary, selected_item:String, folder_editor:String, resource_type: String): + ## BUILD ALL THE FOLDER ITEMS (by calling this method for them) + for folder in folder_data["folders"].keys(): + var folder_item = _add_folder_item(parent_folder_item, folder, folder_editor, folder_data["folders"][folder]['metadata']) + var contains_something = build_resource_folder(folder_item, folder_data["folders"][folder], selected_item, folder_editor, resource_type) + if (not filter_tree_term.empty()) and (not contains_something): + folder_item.free() + + ## BUILD ALL THE FILE ITEMS + for file in folder_data["files"]: + # get the file_metadata + var file_metadata + match resource_type: + "Timeline": + file_metadata = DialogicUtil.get_timeline_dict()[file] + "Character": + file_metadata = DialogicUtil.get_characters_dict()[file] + "Theme": + file_metadata = DialogicUtil.get_theme_dict()[file] + "Definition": + file_metadata = DialogicUtil.get_default_definitions_dict()[file] + + # add the file item (considering the filter_term) + if (filter_tree_term == '') or (filter_tree_term.to_lower() in file_metadata['name'].to_lower()): + _add_resource_item(resource_type, parent_folder_item, file_metadata, not selected_item.empty() and file == selected_item) + + # force redraw control + update() + + return true if (parent_folder_item.get_children() != null) else false + + +func _add_folder_item(parent_item: TreeItem, folder_name: String, editor:String, meta_folder_info:Dictionary): + # create item + var folder_item:TreeItem= tree.create_item(parent_item) + # set text and icon + folder_item.set_text(0, folder_name) + folder_item.set_icon(0, get_icon("Folder", "EditorIcons")) + folder_item.set_icon_modulate(0, get_color("folder_icon_modulate", "FileDialog")) + # set metadata + folder_item.set_metadata(0, {'editor': editor, 'editable': true}) + # set collapsed + if filter_tree_term.empty(): + folder_item.collapsed = meta_folder_info['folded'] + return folder_item + + +func _add_resource_item(resource_type, parent_item, resource_data, select): + # create item + var item = tree.create_item(parent_item) + # set the text + if resource_data.has('name'): + item.set_text(0, resource_data['name']) + else: + item.set_text(0, resource_data['file']) + if not get_constant("dark_theme", "Editor"): + item.set_icon_modulate(0, get_color("property_color", "Editor")) + # set it as editable + resource_data['editable'] = true + # resource specific changes + match resource_type: + "Timeline": + item.set_icon(0, timeline_icon) + resource_data['editor'] = 'Timeline' + "Character": + item.set_icon(0, character_icon) + resource_data['editor'] = 'Character' + if resource_data.has('color'): + item.set_icon_modulate(0, resource_data['color']) + "Definition": + if resource_data['type'] == 0: + item.set_icon(0, definition_icon) + resource_data['editor'] = 'Value' + else: + item.set_icon(0, glossary_icon) + resource_data['editor'] = 'GlossaryEntry' + "Theme": + item.set_icon(0, theme_icon) + resource_data['editor'] = 'Theme' + + item.set_metadata(0, resource_data) + + if select: + item.select(0) + + +## TIMELINES +func build_timelines(selected_item: String=''): + _clear_tree_children(timelines_tree) + + DialogicUtil.update_resource_folder_structure() + var structure = DialogicUtil.get_timelines_folder_structure() + build_resource_folder(timelines_tree, structure, selected_item, "Timeline Root", "Timeline") + + +## CHARACTERS +func build_characters(selected_item: String=''): + _clear_tree_children(characters_tree) + + DialogicUtil.update_resource_folder_structure() + var structure = DialogicUtil.get_characters_folder_structure() + build_resource_folder(characters_tree, structure, selected_item, "Character Root", "Character") + + +## DEFINTIONS +func build_definitions(selected_item: String=''): + _clear_tree_children(definitions_tree) + + DialogicUtil.update_resource_folder_structure() + var structure = DialogicUtil.get_definitions_folder_structure() + build_resource_folder(definitions_tree, structure, selected_item, "Definition Root", "Definition") + + +## THEMES +func build_themes(selected_item: String=''): + _clear_tree_children(themes_tree) + + DialogicUtil.update_resource_folder_structure() + var structure = DialogicUtil.get_theme_folder_structure() + build_resource_folder(themes_tree, structure, selected_item, "Theme Root", "Theme") + + +func _on_item_collapsed(item: TreeItem): + if filter_tree_term.empty() and item != null and 'Root' in item.get_metadata(0)['editor'] and not 'Documentation' in item.get_metadata(0)['editor']: + DialogicUtil.set_folder_meta(get_item_folder(item, ''), 'folded', item.collapsed) + +func build_documentation(selected_item: String=''): + var child = documentation_tree.get_children() + while child: + child.call_recursive("call_deferred", "free") + child = child.get_next() + $DocsTreeHelper.build_documentation_tree(self, documentation_tree, {'editor':'Documentation Root', 'editable':false}, {'editor':'Documentation', 'editable':false}, filter_tree_term) + call_deferred("update") + +## ***************************************************************************** +## OPENING EDITORS +## ***************************************************************************** + +func _on_item_selected(): + # TODO: Ideally I would perform a "save" here before opening the next + # resource. Unfortunately there has been so many bugs doing that + # that I'll revisit it in the future. + # save_current_resource() + var metadata = get_selected().get_metadata(0) + match metadata['editor']: + 'Timeline': + # Remember to also update this on the `inspector_timeline_picker.gd` + timeline_editor.batches.clear() + timeline_editor.load_timeline(metadata['file']) + show_timeline_editor() + 'Character': + character_editor.load_character(metadata['file']) + show_character_editor() + 'Value': + value_editor.load_definition(metadata['id']) + show_value_editor() + 'GlossaryEntry': + glossary_entry_editor.load_definition(metadata['id']) + show_glossary_entry_editor() + 'Theme': + show_theme_editor() + theme_editor.load_theme(metadata['file']) + 'Settings': + settings_editor.update_data() + show_settings_editor() + 'Documentation', 'Documentation Root': + if metadata['path']: + documentation_viewer.load_page(metadata['path']) + show_documentatio_editor() + get_selected().collapsed = false + _: + hide_all_editors() + +func show_timeline_editor(): + emit_signal("editor_selected", 'timeline') + hide_editors() + timeline_editor.visible = true + +func show_character_editor(): + emit_signal("editor_selected", 'character') + hide_editors() + character_editor.visible = true + +func show_value_editor(): + emit_signal("editor_selected", 'definition') + hide_editors() + value_editor.visible = true + +func show_glossary_entry_editor(): + emit_signal("editor_selected", 'glossary_entry') + hide_editors() + glossary_entry_editor.visible = true + +func show_theme_editor(): + emit_signal("editor_selected", 'theme') + hide_editors() + theme_editor.visible = true + + +func show_settings_editor(): + emit_signal("editor_selected", 'theme') + hide_editors() + settings_editor.visible = true + + +func show_documentatio_editor(): + emit_signal("editor_selected", "documentation") + hide_editors() + documentation_viewer.visible = true + + +func hide_all_editors(): + emit_signal("editor_selected", 'none') + hide_editors() + empty_editor.visible = true + + +func hide_editors(): + character_editor.visible = false + timeline_editor.visible = false + value_editor.visible = false + glossary_entry_editor.visible = false + theme_editor.visible = false + settings_editor.visible = false + documentation_viewer.visible = false + empty_editor.visible = false + +## ***************************************************************************** +## CONTEXT POPUPS on RMB SELECT +## ***************************************************************************** + +func create_rmb_context_menus(): + + var timeline_popup = PopupMenu.new() + timeline_popup.add_icon_item(get_icon("Filesystem", "EditorIcons"), editor_reference.dialogicTranslator.translate('Show in File Manager')) + timeline_popup.add_icon_item(get_icon("ActionCopy", "EditorIcons"), editor_reference.dialogicTranslator.translate('Copy Timeline Name')) + timeline_popup.add_icon_item(get_icon("Rename", "EditorIcons"), editor_reference.dialogicTranslator.translate('Copy File Name')) + timeline_popup.add_icon_item(get_icon("Remove", "EditorIcons"), editor_reference.dialogicTranslator.translate('Remove Timeline')) + add_child(timeline_popup) + add_rmb_popup_style(timeline_popup) + rmb_popup_menus["Timeline"] = timeline_popup + + var character_popup = PopupMenu.new() + character_popup.add_icon_item(get_icon("Filesystem", "EditorIcons"), editor_reference.dialogicTranslator.translate('Show in File Manager')) + character_popup.add_icon_item(get_icon("Rename", "EditorIcons"), editor_reference.dialogicTranslator.translate('Copy File Name')) + character_popup.add_icon_item(get_icon("Remove", "EditorIcons"), editor_reference.dialogicTranslator.translate('Remove Character')) + add_child(character_popup) + add_rmb_popup_style(character_popup) + rmb_popup_menus["Character"] = character_popup + + var theme_popup = PopupMenu.new() + theme_popup.add_icon_item(get_icon("Filesystem", "EditorIcons"), editor_reference.dialogicTranslator.translate('Show in File Manager')) + theme_popup.add_icon_item(get_icon("Rename", "EditorIcons"), editor_reference.dialogicTranslator.translate('Copy File Name')) + theme_popup.add_icon_item(get_icon("Duplicate", "EditorIcons"), editor_reference.dialogicTranslator.translate('Duplicate Theme')) + theme_popup.add_icon_item(get_icon("Remove", "EditorIcons"), editor_reference.dialogicTranslator.translate('Remove Theme')) + add_child(theme_popup) + add_rmb_popup_style(theme_popup) + rmb_popup_menus["Theme"] = theme_popup + + var definition_popup = PopupMenu.new() + definition_popup.add_icon_item(get_icon("Edit", "EditorIcons"), editor_reference.dialogicTranslator.translate('Edit Definitions File')) + definition_popup.add_icon_item(get_icon("Rename", "EditorIcons"), editor_reference.dialogicTranslator.translate('Copy Definition ID')) + definition_popup.add_icon_item(get_icon("Remove", "EditorIcons"), editor_reference.dialogicTranslator.translate('Remove Definition entry')) + add_child(definition_popup) + add_rmb_popup_style(definition_popup) + rmb_popup_menus["Value"] = definition_popup + rmb_popup_menus["GlossaryEntry"] = definition_popup + + ## FOLDER / ROOT ITEMS + var timeline_folder_popup = PopupMenu.new() + timeline_folder_popup.add_icon_item(get_icon("Add", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Add Timeline')) + timeline_folder_popup.add_icon_item(get_icon("Folder", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Create Subfolder')) + timeline_folder_popup.add_icon_item(get_icon("Remove", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Delete Folder')) + add_child(timeline_folder_popup) + add_rmb_popup_style(timeline_folder_popup) + rmb_popup_menus['Timeline Root'] = timeline_folder_popup + + var character_folder_popup = PopupMenu.new() + character_folder_popup.add_icon_item(get_icon("Add", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Add Character')) + character_folder_popup.add_icon_item(get_icon("Folder", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Create Subfolder')) + character_folder_popup.add_icon_item(get_icon("Remove", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Delete Folder')) + add_child(character_folder_popup) + add_rmb_popup_style(character_folder_popup) + rmb_popup_menus['Character Root'] = character_folder_popup + + var theme_folder_popup = PopupMenu.new() + theme_folder_popup.add_icon_item(get_icon("Add", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Add Theme')) + theme_folder_popup.add_icon_item(get_icon("Folder", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Create Subfolder')) + theme_folder_popup.add_icon_item(get_icon("Remove", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Delete Folder')) + add_child(theme_folder_popup) + add_rmb_popup_style(theme_folder_popup) + rmb_popup_menus["Theme Root"] = theme_folder_popup + + var definition_folder_popup = PopupMenu.new() + definition_folder_popup.add_icon_item(get_icon("Add", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Add Value')) + definition_folder_popup.add_icon_item(get_icon("Add", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Add Glossary Entry')) + definition_folder_popup.add_icon_item(get_icon("Folder", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Create Subfolder')) + definition_folder_popup.add_icon_item(get_icon("Remove", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Delete Folder')) + add_child(definition_folder_popup) + add_rmb_popup_style(definition_folder_popup) + rmb_popup_menus["Definition Root"] = definition_folder_popup + + var documentation_folder_popup = PopupMenu.new() + documentation_folder_popup.add_icon_item(get_icon("Edit", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Toggle Editing Tools')) + add_child(documentation_folder_popup) + add_rmb_popup_style(documentation_folder_popup) + rmb_popup_menus["Documentation Root"] = documentation_folder_popup + + var documentation_popup = PopupMenu.new() + documentation_popup.add_icon_item(get_icon("Edit", "EditorIcons") ,editor_reference.dialogicTranslator.translate('Toggle Editing Tools')) + add_child(documentation_popup) + add_rmb_popup_style(documentation_popup) + rmb_popup_menus["Documentation"] = documentation_popup + + # Connecting context menus + timeline_popup.connect('id_pressed', self, '_on_TimelinePopupMenu_id_pressed') + character_popup.connect('id_pressed', self, '_on_CharacterPopupMenu_id_pressed') + theme_popup.connect('id_pressed', self, '_on_ThemePopupMenu_id_pressed') + definition_popup.connect('id_pressed', self, '_on_DefinitionPopupMenu_id_pressed') + documentation_popup.connect('id_pressed', self, '_on_DocumentationPopupMenu_id_pressed') + + timeline_folder_popup.connect('id_pressed', self, '_on_TimelineRootPopupMenu_id_pressed') + character_folder_popup.connect('id_pressed', self, '_on_CharacterRootPopupMenu_id_pressed') + theme_folder_popup.connect('id_pressed', self, '_on_ThemeRootPopupMenu_id_pressed') + definition_folder_popup.connect('id_pressed', self, '_on_DefinitionRootPopupMenu_id_pressed') + documentation_folder_popup.connect('id_pressed', self, '_on_DocumentationPopupMenu_id_pressed') + +func add_rmb_popup_style(popup): + var menu_background = load("res://addons/dialogic/Editor/Events/styles/ResourceMenuPanelBackground.tres") + menu_background.bg_color = get_color("base_color", "Editor") + + popup.add_stylebox_override('panel', menu_background) + popup.add_stylebox_override('hover', StyleBoxEmpty.new()) + popup.add_color_override('font_color_hover', get_color("accent_color", "Editor")) + +func _on_item_rmb_selected(position): + var item = get_selected().get_metadata(0) + if item.has('editor'): + rmb_popup_menus[item["editor"]].rect_position = get_viewport().get_mouse_position() + rmb_popup_menus[item["editor"]].popup() + +## item paths (for the folder structure management) +# this returns the folder path, or the folder the item is in (if it's not a folder) +# it makes sure the folder_path begins with @root! +func get_item_folder(item: TreeItem, root : String): + if not item: + return root + var current_path:String = get_item_path(item) + if not "Root" in item.get_metadata(0)['editor']: + current_path = DialogicUtil.get_parent_path(current_path) + if not current_path.begins_with(root): + return root + return current_path + + +func get_item_path(item: TreeItem) -> String: + if item == null: + return '' + return create_item_path_recursive(item, "").trim_suffix("/") + + +func create_item_path_recursive(item:TreeItem, path:String) -> String: + # don't use this function directly + # use get_item_path() or get_item_folder() + path = item.get_text(0)+'/'+path + if item.get_parent() == get_root(): + return path + else: + path = create_item_path_recursive(item.get_parent(), path) + return path + +## RESOURCE POPUPS + +# Timeline context menu +func _on_TimelinePopupMenu_id_pressed(id): + if id == 0: # View files + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('TIMELINE_DIR'))) + elif id == 1: # Copy to clipboard + OS.set_clipboard(get_item_path(get_selected()).replace('Timelines', '')) + elif id == 2: # Copy File name + OS.set_clipboard(get_selected().get_metadata(0).get('file')) + elif id == 3: # Remove + editor_reference.popup_remove_confirmation('Timeline') + + +# Character context menu +func _on_CharacterPopupMenu_id_pressed(id): + if id == 0: + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('CHAR_DIR'))) + elif id == 1: # Copy File name + OS.set_clipboard(get_selected().get_metadata(0).get('file')) + elif id == 2: # Remove + editor_reference.popup_remove_confirmation('Character') + + +# Theme context menu +func _on_ThemePopupMenu_id_pressed(id): + if id == 0: + OS.shell_open(ProjectSettings.globalize_path(DialogicResources.get_path('THEME_DIR'))) + elif id == 1: # Copy File name + OS.set_clipboard(get_selected().get_metadata(0).get('file')) + elif id == 2: + var filename = editor_reference.get_node('MainPanel/MasterTreeContainer/MasterTree').get_selected().get_metadata(0)['file'] + theme_editor.duplicate_theme(filename) + elif id == 3: + editor_reference.popup_remove_confirmation('Theme') + + +# Definition context menu +func _on_DefinitionPopupMenu_id_pressed(id): + if id == 0: + var paths = DialogicResources.get_config_files_paths() + OS.shell_open(ProjectSettings.globalize_path(paths['DEFAULT_DEFINITIONS_FILE'])) + elif id == 1: # Copy File name + OS.set_clipboard(get_selected().get_metadata(0).get('id')) + if id == 2: + if value_editor.visible: + editor_reference.popup_remove_confirmation('Value') + elif glossary_entry_editor.visible: + editor_reference.popup_remove_confirmation('GlossaryEntry') + +## FOLDER POPUPS + +# Timeline Folder context menu +func _on_TimelineRootPopupMenu_id_pressed(id): + if id == 0: # Add Timeline + new_timeline() + if id == 1: # add subfolder + DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + build_timelines() + if id == 2: # remove folder and substuff + if get_selected().get_parent() == get_root(): + return + editor_reference.get_node('RemoveFolderConfirmation').popup_centered() + + +# Character Folder context menu +func _on_CharacterRootPopupMenu_id_pressed(id): + if id == 0: # Add Character + new_character() + if id == 1: # add subfolder + DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + + build_characters() + if id == 2: # remove folder and substuff + if get_selected().get_parent() == get_root(): + return + editor_reference.get_node('RemoveFolderConfirmation').popup_centered() + + +# Definition Folder context menu +func _on_DefinitionRootPopupMenu_id_pressed(id): + if id == 0: # Add Value Definition + new_value_definition() + if id == 1: # Add Glossary Definition + new_glossary_entry() + if id == 2: # add subfolder + DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + build_definitions() + if id == 3: # remove folder and substuff + if get_selected().get_parent() == get_root(): + return + editor_reference.get_node('RemoveFolderConfirmation').popup_centered() + + +# Theme Folder context menu +func _on_ThemeRootPopupMenu_id_pressed(id): + if id == 0: # Add Theme + new_theme() + if id == 1: # add subfolder + DialogicUtil.add_folder(get_item_path(get_selected()), "New Folder "+str(OS.get_unix_time())) + build_themes() + if id == 2: # remove folder and substuff + if get_selected().get_parent() == get_root(): + return + editor_reference.get_node('RemoveFolderConfirmation').popup_centered() + + +func _on_DocumentationPopupMenu_id_pressed(id): + if id == 0: # edit text toggled + documentation_viewer.toggle_editing() +## ***************************************************************************** +## CREATING AND REMOVING +## ***************************************************************************** + +# creates a new timeline and opens it +# it will be added to the selected folder (if it's a timeline folder) or the Timeline root folder +func new_timeline(): + var timeline = editor_reference.get_node('MainPanel/TimelineEditor').create_timeline() + var folder = get_item_folder(get_selected(), "Timelines") + DialogicUtil.add_file_to_folder(folder, timeline['metadata']['file']) + build_timelines(timeline['metadata']['file']) + rename_selected() + + +# creates a new character and opens it +# it will be added to the selected folder (if it's a character folder) or the Character root folder +func new_character(): + var character = editor_reference.get_node("MainPanel/CharacterEditor").create_character() + var folder = get_item_folder(get_selected(), "Characters") + DialogicUtil.add_file_to_folder(folder, character['metadata']['file']) + build_characters(character['metadata']['file']) + rename_selected() + +# creates a new theme and opens it +# it will be added to the selected folder (if it's a theme folder) or the Theme root folder +func new_theme(): + var theme_file = editor_reference.get_node("MainPanel/ThemeEditor").create_theme() + var folder = get_item_folder(get_selected(), "Themes") + DialogicUtil.add_file_to_folder(folder, theme_file) + build_themes(theme_file) + rename_selected() + +# creates a new value and opens it +# it will be added to the selected folder (if it's a definition folder) or the Definition root folder +func new_value_definition(): + var definition_id = editor_reference.get_node("MainPanel/ValueEditor").create_value() + var folder = get_item_folder(get_selected(), "Definitions") + DialogicUtil.add_file_to_folder(folder, definition_id) + build_definitions(definition_id) + rename_selected() + +# creates a new glossary entry and opens it +# it will be added to the selected folder (if it's a definition folder) or the Definition root folder +func new_glossary_entry(): + var definition_id = editor_reference.get_node("MainPanel/GlossaryEntryEditor").create_glossary_entry() + var folder = get_item_folder(get_selected(), "Definitions") + DialogicUtil.add_file_to_folder(folder, definition_id) + build_definitions(definition_id) + rename_selected() + + +func remove_selected(): + var item = get_selected() + item.free() + timelines_tree.select(0) + settings_editor.update_data() + + +func rename_selected(): + yield(get_tree(), "idle_frame") + _start_rename() + edit_selected() + +## ***************************************************************************** +## DRAGGING ITEMS +## ***************************************************************************** + +func can_drop_data(position, data) -> bool: + var item = get_item_at_position(position) + if item == null: + return false + # if the data isn't empty and it's a valid DICT + if data != null and data is Dictionary and data.has('item_type'): + # if it's not trying to add a folder to a file + if not (data['item_type'] == "folder" and not 'Root' in item.get_metadata(0)["editor"]): + # if it's the same type of folder as before + if get_item_folder(item, '').split("/")[0] == data['orig_path'].split("/")[0]: + # make sure the folder/item is not a subfolder of the original folder + if data['item_type'] == "file" or (not get_item_folder(item, '').begins_with(data['orig_path'])): + return true + return false + +func drop_data(position, data): + var item = get_item_at_position(position) + var drop_section = get_drop_section_at_position(position) + if not data.has('item_type'): + return + if data['orig_path'] == get_item_folder(item, ''): + return + # dragging a folder + if data['item_type'] == 'folder': + # on a folder + if 'Root' in item.get_metadata(0)['editor']: + DialogicUtil.move_folder_to_folder(data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + # dragging a file + elif data['item_type'] == 'file': + # on a folder + if 'Root' in item.get_metadata(0)['editor']: + if data.has('file_name'): + DialogicUtil.move_file_to_folder(data['file_name'], data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + elif data.has('resource_id'): + DialogicUtil.move_file_to_folder(data['resource_id'], data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + pass # WORK TODO + # on a file + else: + DialogicUtil.move_file_to_folder(data['file_name'], data['orig_path'], get_item_folder(item, data['orig_path'].split('/')[0])) + dragging_item.queue_free() + dragging_item = null + build_full_tree() + +func get_drag_data(position): + var item = get_item_at_position(position) + # if it is a folder and it's not one of the root folders + if 'Root' in item.get_metadata(0)['editor'] and item.get_parent().get_parent(): + instance_drag_preview(item.get_icon(0), item.get_text(0)) + return {'item_type': 'folder', 'orig_path': get_item_folder(item, "")} + else: + if item.get_metadata(0).has('file'): + instance_drag_preview(item.get_icon(0), item.get_text(0)) + return {'item_type': 'file', 'orig_path': get_item_folder(item, ""), 'file_name':item.get_metadata(0)['file']} + elif item.get_metadata(0).has('id'): + instance_drag_preview(item.get_icon(0), item.get_text(0)) + return {'item_type': 'file', 'orig_path': get_item_folder(item, ""), 'resource_id':item.get_metadata(0)['id']} + return null + +func instance_drag_preview(icon, text): + dragging_item = drag_preview.instance() + dragging_item.get_node("Panel").self_modulate = get_color("base_color", "Editor") + dragging_item.get_node("Panel/HBox/Icon").texture = icon + dragging_item.get_node("Panel/HBox/Label").text = text + editor_reference.add_child(dragging_item) + +func _process(delta): + if dragging_item != null: + if Input.is_mouse_button_pressed(1): + dragging_item.rect_global_position = get_global_mouse_position()+Vector2(10,10) + else: + dragging_item.queue_free() + dragging_item = null + + +## ***************************************************************************** +## ITEM EDITING (RENAMING) +## ***************************************************************************** + +func _on_renamer_reset_timeout(): + get_selected().set_editable(0, false) + + +func _on_gui_input(event): + if event is InputEventMouseButton and event.button_index == 1: + if event.is_pressed() and event.doubleclick: + _start_rename() + + +func _start_rename(): + var item = get_selected() + var metadata = item.get_metadata(0) + if metadata.has("editable") and metadata["editable"]: + item_path_before_edit = get_item_path(item) + item.set_editable(0, true) + $RenamerReset.start(0.5) + + +func _on_item_edited(): + var item = get_selected() + var metadata = item.get_metadata(0) + if metadata['editor'] == 'Timeline': + timeline_editor.timeline_name = item.get_text(0) + save_current_resource() + build_timelines(metadata['file']) + if metadata['editor'] == 'Theme': + DialogicResources.set_theme_value(metadata['file'], 'settings', 'name', item.get_text(0)) + build_themes(metadata['file']) + if metadata['editor'] == 'Character': + character_editor.nodes['name'].text = item.get_text(0) + save_current_resource() + build_characters(metadata['file']) + if metadata['editor'] == 'Value': + value_editor.nodes['name'].text = item.get_text(0) + # Not sure why this signal doesn't triggers + value_editor._on_name_changed(item.get_text(0)) + save_current_resource() + build_definitions(metadata['id']) + if metadata['editor'] == 'GlossaryEntry': + glossary_entry_editor.nodes['name'].text = item.get_text(0) + # Not sure why this signal doesn't triggers + glossary_entry_editor._on_name_changed(item.get_text(0)) + save_current_resource() + build_definitions(metadata['id']) + + if "Root" in metadata['editor']: + if item.get_text(0) == item_path_before_edit.split("/")[-1]: + return + var result = DialogicUtil.rename_folder(item_path_before_edit, item.get_text(0)) + if result != OK: + item.set_text(0, item_path_before_edit.split("/")[-1]) + +## ***************************************************************************** +## AUTO SAVING +## ***************************************************************************** + +func _on_autosave_timeout(): + save_current_resource() + +func save_current_resource(): + if editor_reference and editor_reference.visible: #Only save if the editor is open + var item: TreeItem = get_selected() + var metadata: Dictionary + if item != null: + metadata = item.get_metadata(0) + if metadata['editor'] == 'Timeline': + timeline_editor.save_timeline() + if metadata['editor'] == 'Character': + character_editor.save_character() + if metadata['editor'] == 'Value': + value_editor.save_definition() + if metadata['editor'] == 'GlossaryEntry': + glossary_entry_editor.save_definition() + # Note: Theme files auto saves on change + + +## ***************************************************************************** +## SEARCHING/FILTERING +## ***************************************************************************** + + +func _on_filter_tree_edit_changed(value): + filter_tree_term = value + if not filter_tree_term.empty(): + timelines_tree.collapsed = false + characters_tree.collapsed = false + definitions_tree.collapsed = false + themes_tree.collapsed = false + else: + timelines_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') + characters_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') + definitions_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') + themes_tree.collapsed = DialogicUtil.get_folder_meta('Timelines', 'folded') + + if get_selected(): + build_full_tree(get_selected().get_metadata(0).get('file', '')) + else: + build_full_tree() + + # This was merged, not sure if it is properly placed + build_documentation() + + +## ***************************************************************************** +## SELECTING AN ITEM +## ***************************************************************************** + +func select_timeline_item(timeline_name): + if (timeline_name == ''): + return + + var main_item = tree.get_root().get_children() + + # wow, godots tree traversal is extremly odd, or I just don't get it + while (main_item): + + if (main_item == null): + break + + if (main_item.has_method("get_text") && main_item.get_text(0) == "Timelines"): + var item = main_item.get_children() + while (item): + + if (not item.has_method("get_metadata")): + item = item.get_next() + continue + + var meta = item.get_metadata(0) + + if (meta == null): + item = item.get_next() + continue + + if (not meta.has("editor") or meta["editor"] != "Timeline"): + item = item.get_next() + continue + + # search for filename + if (meta.has("file") and meta["file"] == timeline_name): + # select this one + item.select(0) + return; + + # search for name + if (meta.has("name") and meta["name"] == timeline_name): + # select this one + item.select(0) + return; + + item = item.get_next() + break + else: + main_item = main_item.get_next() + + # fallback + hide_all_editors() + pass + + +func select_documentation_item(docs_page_path): + if not $DocsTreeHelper.search_and_select_docs(documentation_tree, docs_page_path): + hide_all_editors() diff --git a/project/addons/dialogic/Editor/MasterTree/MasterTree.tscn b/project/addons/dialogic/Editor/MasterTree/MasterTree.tscn new file mode 100644 index 0000000..fc69c56 --- /dev/null +++ b/project/addons/dialogic/Editor/MasterTree/MasterTree.tscn @@ -0,0 +1,28 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/MasterTree/MasterTree.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Documentation/Nodes/DocsTreeHelper.tscn" type="PackedScene" id=2] + +[node name="MasterTree" type="Tree"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -874.0 +rect_min_size = Vector2( 150, 0 ) +custom_colors/drop_position_color = Color( 0.321569, 0.529412, 0.815686, 0 ) +allow_rmb_select = true +hide_root = true +drop_mode_flags = 1 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RenamerReset" type="Timer" parent="."] +one_shot = true + +[node name="AutoSave" type="Timer" parent="."] + +[node name="DocsTreeHelper" parent="." instance=ExtResource( 2 )] +margin_right = 47.0 +margin_bottom = 45.0 +mouse_filter = 2 diff --git a/project/addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.gd b/project/addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.gd new file mode 100644 index 0000000..b4a4f89 --- /dev/null +++ b/project/addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.gd @@ -0,0 +1,14 @@ +tool +extends VBoxContainer + + +func _ready(): + var HistoryCheckbox = $"GridContainer/HistoryBox/SettingsCheckbox/CheckBox" + HistoryCheckbox.connect('toggled', self, '_on_HistoryLogging_toggled') + _on_HistoryLogging_toggled(HistoryCheckbox.pressed) + + +func _on_HistoryLogging_toggled(button_pressed): + for n in $GridContainer.get_children(): + n.visible = button_pressed + $GridContainer/HistoryBox.visible = true diff --git a/project/addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.tscn b/project/addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.tscn new file mode 100644 index 0000000..5d37333 --- /dev/null +++ b/project/addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.tscn @@ -0,0 +1,341 @@ +[gd_scene load_steps=8 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Common/SectionTitle.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.gd" type="Script" id=3] +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.tscn" type="PackedScene" id=4] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 4.0 +content_margin_right = 4.0 +content_margin_top = 4.0 +content_margin_bottom = 4.0 +bg_color = Color( 0.252, 0.2718, 0.3246, 1 ) + +[sub_resource type="Image" id=4] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=3] +flags = 4 +flags = 4 +image = SubResource( 4 ) +size = Vector2( 16, 16 ) + +[node name="HistorySettings" type="VBoxContainer"] +margin_top = 258.0 +margin_right = 304.0 +margin_bottom = 390.0 +script = ExtResource( 3 ) + +[node name="SectionTitle" parent="." instance=ExtResource( 1 )] +margin_right = 336.0 +custom_styles/normal = SubResource( 1 ) +text = "History settings" +text_key = "History settings" + +[node name="GridContainer" type="GridContainer" parent="."] +margin_top = 26.0 +margin_right = 336.0 +margin_bottom = 344.0 +columns = 2 + +[node name="HistoryBox" type="HBoxContainer" parent="GridContainer"] +margin_right = 158.0 +margin_bottom = 24.0 + +[node name="SettingsCheckbox" parent="GridContainer/HistoryBox" instance=ExtResource( 4 )] +margin_right = 158.0 +margin_bottom = 24.0 +text = "Enable History" +settings_section = "history" +settings_key = "enable_history_logging" + +[node name="UseDialogTheme" parent="GridContainer" instance=ExtResource( 4 )] +margin_left = 162.0 +margin_right = 336.0 +margin_bottom = 24.0 +text = "Use default theme" +default = true +settings_section = "history" +settings_key = "enable_dynamic_theme" + +[node name="HSeparator" type="HSeparator" parent="GridContainer"] +margin_top = 28.0 +margin_right = 158.0 +margin_bottom = 32.0 + +[node name="HSeparator2" type="HSeparator" parent="GridContainer"] +margin_left = 162.0 +margin_top = 28.0 +margin_right = 336.0 +margin_bottom = 32.0 + +[node name="ShowOpenButton" parent="GridContainer" instance=ExtResource( 4 )] +margin_top = 36.0 +margin_right = 158.0 +margin_bottom = 60.0 +text = "Show open button" +default = true +settings_section = "history" +settings_key = "enable_open_button" + +[node name="ShowCloseButton" parent="GridContainer" instance=ExtResource( 4 )] +margin_left = 162.0 +margin_top = 36.0 +margin_right = 336.0 +margin_bottom = 60.0 +text = "Show close button" +default = true +settings_section = "history" +settings_key = "enable_close_button" + +[node name="LogAllChoices" parent="GridContainer" instance=ExtResource( 4 )] +margin_top = 64.0 +margin_right = 158.0 +margin_bottom = 88.0 +text = "Log all choices" +default = true +settings_section = "history" +settings_key = "log_choices" + +[node name="LogChoiceAnswer" parent="GridContainer" instance=ExtResource( 4 )] +margin_left = 162.0 +margin_top = 64.0 +margin_right = 336.0 +margin_bottom = 88.0 +text = "Log choice answer" +default = true +settings_section = "history" +settings_key = "log_answers" + +[node name="LogCharacterJoins" parent="GridContainer" instance=ExtResource( 4 )] +margin_top = 92.0 +margin_right = 158.0 +margin_bottom = 116.0 +text = "Log character joins" +default = true +settings_section = "history" +settings_key = "log_arrivals" + +[node name="LogBox" type="HBoxContainer" parent="GridContainer"] +margin_left = 162.0 +margin_top = 92.0 +margin_right = 336.0 +margin_bottom = 116.0 + +[node name="HSeparator" type="VSeparator" parent="GridContainer/LogBox"] +margin_right = 4.0 +margin_bottom = 24.0 + +[node name="JoinTextLabel" parent="GridContainer/LogBox" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 8.0 +margin_top = 5.0 +margin_right = 35.0 +margin_bottom = 19.0 +text = "Text" +text_key = "Text" + +[node name="LineEdit" type="LineEdit" parent="GridContainer/LogBox"] +margin_left = 39.0 +margin_right = 174.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +text = "has arrived" + +[node name="LogCharacterLeaves" parent="GridContainer" instance=ExtResource( 4 )] +margin_top = 120.0 +margin_right = 158.0 +margin_bottom = 144.0 +text = "Log character leaves" +default = true +settings_section = "history" +settings_key = "history_scroll_to_bottom" + +[node name="LogBox2" type="HBoxContainer" parent="GridContainer"] +margin_left = 162.0 +margin_top = 120.0 +margin_right = 336.0 +margin_bottom = 144.0 + +[node name="HSeparator" type="VSeparator" parent="GridContainer/LogBox2"] +margin_right = 4.0 +margin_bottom = 24.0 + +[node name="TLabel1" parent="GridContainer/LogBox2" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 8.0 +margin_top = 5.0 +margin_right = 35.0 +margin_bottom = 19.0 +text = "Text" +text_key = "Text" + +[node name="LineEdit" type="LineEdit" parent="GridContainer/LogBox2"] +margin_left = 39.0 +margin_right = 174.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +text = "has left" + +[node name="ScrollToBottom" parent="GridContainer" instance=ExtResource( 4 )] +margin_top = 148.0 +margin_right = 158.0 +margin_bottom = 172.0 +text = "Scroll to bottom" +default = true +settings_section = "history" +settings_key = "history_scroll_to_bottom" + +[node name="ReverseTimeline" parent="GridContainer" instance=ExtResource( 4 )] +margin_left = 162.0 +margin_top = 148.0 +margin_right = 336.0 +margin_bottom = 172.0 +text = "Reverse timeline" +settings_section = "history" +settings_key = "history_reverse_timeline" + +[node name="ShowNameColors" parent="GridContainer" instance=ExtResource( 4 )] +margin_top = 176.0 +margin_right = 158.0 +margin_bottom = 200.0 +text = "Show name colors" +default = true +settings_section = "history" +settings_key = "history_name_color_on" + +[node name="LineBreakAfterNames" parent="GridContainer" instance=ExtResource( 4 )] +margin_left = 162.0 +margin_top = 176.0 +margin_right = 336.0 +margin_bottom = 200.0 +text = "Line break after names" +settings_section = "history" +settings_key = "history_break_after_name" + +[node name="HSeparator3" type="HSeparator" parent="GridContainer"] +margin_top = 204.0 +margin_right = 158.0 +margin_bottom = 208.0 + +[node name="HSeparator4" type="HSeparator" parent="GridContainer"] +margin_left = 162.0 +margin_top = 204.0 +margin_right = 336.0 +margin_bottom = 208.0 + +[node name="TLabel8" parent="GridContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 216.0 +margin_right = 158.0 +margin_bottom = 230.0 +size_flags_horizontal = 3 +text = "History button position" +text_key = "History button position" + +[node name="PositionSelector" type="OptionButton" parent="GridContainer"] +margin_left = 162.0 +margin_top = 212.0 +margin_right = 336.0 +margin_bottom = 234.0 +text = "Top Right" +icon = SubResource( 3 ) +items = [ "Top Left", SubResource( 3 ), false, 0, null, "Top Center", SubResource( 3 ), false, 1, null, "Top Right", SubResource( 3 ), false, 2, null, "", null, false, 3, null, "Center Left", SubResource( 3 ), false, 3, null, "Center", SubResource( 3 ), false, 4, null, "Center Right", SubResource( 3 ), false, 5, null, "", null, false, 7, null, "Bottom Left", SubResource( 3 ), false, 6, null, "Bottom Center", SubResource( 3 ), false, 7, null, "Bottom Right", SubResource( 3 ), false, 8, null ] +selected = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel9" parent="GridContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 243.0 +margin_right = 158.0 +margin_bottom = 257.0 +hint_tooltip = "Choose delimiter that appears after character name" +mouse_filter = 0 +size_flags_horizontal = 3 +text = "Name delimiter" +text_key = "Name delimiter" + +[node name="CharacterDelimiter" type="LineEdit" parent="GridContainer"] +margin_left = 162.0 +margin_top = 238.0 +margin_right = 336.0 +margin_bottom = 262.0 +text = ":" + +[node name="TLabel7" parent="GridContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 271.0 +margin_right = 158.0 +margin_bottom = 285.0 +mouse_filter = 0 +text = "Screen margin" +text_key = "Screen margin" + +[node name="BoxMargin" type="HBoxContainer" parent="GridContainer"] +margin_left = 162.0 +margin_top = 266.0 +margin_right = 336.0 +margin_bottom = 290.0 + +[node name="MarginX" type="SpinBox" parent="GridContainer/BoxMargin"] +margin_right = 74.0 +margin_bottom = 24.0 +max_value = 999.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="MarginY" type="SpinBox" parent="GridContainer/BoxMargin"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +max_value = 999.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel5" parent="GridContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 299.0 +margin_right = 158.0 +margin_bottom = 313.0 +text = "Log margin" +text_key = "Log margin" + +[node name="ContainerMargin" type="HBoxContainer" parent="GridContainer"] +margin_left = 162.0 +margin_top = 294.0 +margin_right = 336.0 +margin_bottom = 318.0 + +[node name="MarginX" type="SpinBox" parent="GridContainer/ContainerMargin"] +margin_right = 74.0 +margin_bottom = 24.0 +max_value = 1e+07 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="MarginY" type="SpinBox" parent="GridContainer/ContainerMargin"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +max_value = 1e+07 +rounded = true +allow_greater = true +allow_lesser = true diff --git a/project/addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.gd b/project/addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.gd new file mode 100644 index 0000000..b573b2a --- /dev/null +++ b/project/addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.gd @@ -0,0 +1,19 @@ +tool +extends HBoxContainer + +export var text : String = '' +export var default : bool = false +export var settings_section : String = '' +export var settings_key : String = '' +var editor_reference + +func _ready(): + editor_reference = find_parent('EditorView') + # This node needs a Settings Editor parent to get the current loaded settings + $CheckBox.text = editor_reference.dialogicTranslator.translate(text) + var settings = DialogicResources.get_settings_config() + $CheckBox.pressed = settings.get_value(settings_section, settings_key, default) + $CheckBox.connect("toggled", self, "_on_toggled") + +func _on_toggled(button_pressed): + DialogicResources.set_settings_value(settings_section, settings_key, button_pressed) diff --git a/project/addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.tscn b/project/addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.tscn new file mode 100644 index 0000000..7f3739c --- /dev/null +++ b/project/addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.gd" type="Script" id=1] + +[node name="SettingsCheckbox" type="HBoxContainer"] +size_flags_horizontal = 3 +script = ExtResource( 1 ) + +[node name="CheckBox" type="CheckBox" parent="."] +margin_right = 24.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 diff --git a/project/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd b/project/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd new file mode 100644 index 0000000..85984da --- /dev/null +++ b/project/addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd @@ -0,0 +1,449 @@ +tool +extends ScrollContainer + +var editor_reference + +onready var nodes = { + # Theme + 'themes': $VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer/HBoxContainer/ThemePicker, + 'canvas_layer' : $VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer/HBoxContainer3/CanvasLayer, + + # Dialog + 'text_event_audio_default_bus' : $VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2/TextAudioDefaultBus/AudioBus, + + # Input Settings + 'delay_after_options': $VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer/LineEdit, + 'default_action_key': $VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer2/DefaultActionKey, + 'choice_hotkey_1': $'VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer4/Choice1Hotkey', + 'choice_hotkey_2': $'VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer5/Choice2Hotkey', + 'choice_hotkey_3': $'VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer6/Choice3Hotkey', + 'choice_hotkey_4': $'VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer7/Choice4Hotkey', + + # Custom Events + 'new_custom_event_open':$VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/NewCustomEvent, + 'new_custom_event_section': $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection, + 'new_custom_event_name': $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/CeName, + 'new_custom_event_directory': $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/CeDirectory, + 'new_custom_event_id': $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/CeEventId, + 'new_custom_event_create':$VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/HBoxContainer/CreateCustomEvent, + 'new_custom_event_cancel':$VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/HBoxContainer/CancelCustomEvent, + + # History Settings + 'text_arrivals': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/LogBox/LineEdit, + 'text_exits': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/LogBox2/LineEdit, + 'history_button_position': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/PositionSelector, + 'history_character_delimiter': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/CharacterDelimiter, + 'history_screen_margin_x': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/BoxMargin/MarginX, + 'history_screen_margin_y': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/BoxMargin/MarginY, + 'history_container_margin_x': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/ContainerMargin/MarginX, + 'history_container_margin_y': $VBoxContainer/HBoxContainer3/VBoxContainer2/HistorySettings/GridContainer/ContainerMargin/MarginY, + # Animations + 'default_join_animation':$VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultJoinAnimation/JoinAnimationPicker, + 'default_join_animation_length':$VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultJoinAnimation/AnimationLengthPicker, + 'default_leave_animation':$VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultLeaveAnimation/LeaveAnimationPicker, + 'default_leave_animation_length':$VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultLeaveAnimation/AnimationLengthPicker, + } + +var THEME_KEYS := [ + 'canvas_layer', + ] + +var INPUT_KEYS := [ + 'delay_after_options', + 'default_action_key', + 'choice_hotkey_1', + 'choice_hotkey_2', + 'choice_hotkey_3', + 'choice_hotkey_4', + ] + +var HISTORY_KEYS := [ + 'text_arrivals', + 'text_exits', + 'history_button_position', + 'history_character_delimiter', + 'history_screen_margin_x', + 'history_screen_margin_y', + 'history_container_margin_x', + 'history_container_margin_y' +] + +var ANIMATION_KEYS := [ + 'default_join_animation', + 'default_join_animation_length', + 'default_leave_animation', + 'default_leave_animation_length' +] + +func _ready(): + editor_reference = find_parent('EditorView') + update_bus_selector() + + update_data() + + # Themes + nodes['themes'].connect('about_to_show', self, 'build_PickerMenu') + nodes['themes'].custom_icon = load("res://addons/dialogic/Images/Resources/theme.svg") + # TODO move to theme section later + nodes['canvas_layer'].connect('value_changed', self, '_on_canvas_layer_text_changed') + + # Input + nodes['delay_after_options'].connect('text_changed', self, '_on_delay_options_text_changed') + nodes['default_action_key'].connect('pressed', self, '_on_default_action_key_presssed') + nodes['default_action_key'].connect('item_selected', self, '_on_default_action_key_item_selected') + + # Connect hotkey settings 1-4 + for i in range(1, 5): + var key = str('choice_hotkey_', i) + nodes[key].connect('pressed', self, '_on_hotkey_action_key_presssed', [key]) + nodes[key].connect('item_selected', self, '_on_default_action_key_item_selected', [key]) + + AudioServer.connect("bus_layout_changed", self, "update_bus_selector") + nodes['text_event_audio_default_bus'].connect('item_selected', self, '_on_text_audio_default_bus_item_selected') + + ## History timeline connections + nodes['history_button_position'].connect('item_selected', self, '_on_button_history_button_position_selected') + nodes['history_character_delimiter'].connect('text_changed', self, '_on_text_changed', ['history', 'history_character_delimiter']) + nodes['text_arrivals'].connect('text_changed', self, '_on_text_changed', ['history', 'text_arrivals']) + nodes['text_exits'].connect('text_changed', self, '_on_text_changed', ['history', 'text_exits']) + + for button in ['history_button_position']: + var button_positions_popup = nodes[button].get_popup() + button_positions_popup.clear() + button_positions_popup.add_icon_item( + get_icon("ControlAlignTopLeft", "EditorIcons"), "Top Left", 0) + button_positions_popup.add_icon_item( + get_icon("ControlAlignTopCenter", "EditorIcons"), "Top Center", 1) + button_positions_popup.add_icon_item( + get_icon("ControlAlignTopRight", "EditorIcons"), "Top Right", 2) + button_positions_popup.add_separator() + button_positions_popup.add_icon_item( + get_icon("ControlAlignLeftCenter", "EditorIcons"), "Center Left", 3) + button_positions_popup.add_icon_item( + get_icon("ControlAlignCenter", "EditorIcons"), "Center", 4) + button_positions_popup.add_icon_item( + get_icon("ControlAlignRightCenter", "EditorIcons"), "Center Right", 5) + button_positions_popup.add_separator() + button_positions_popup.add_icon_item( + get_icon("ControlAlignBottomLeft", "EditorIcons"), "Bottom Left", 6) + button_positions_popup.add_icon_item( + get_icon("ControlAlignBottomCenter", "EditorIcons"), "Bottom Center", 7) + button_positions_popup.add_icon_item( + get_icon("ControlAlignBottomRight", "EditorIcons"), "Bottom Right", 8) + + nodes['history_screen_margin_x'].connect("value_changed", self, '_spinbox_val_changed', ['history_screen_margin_x']) + nodes['history_screen_margin_y'].connect("value_changed", self, '_spinbox_val_changed', ['history_screen_margin_y']) + nodes['history_container_margin_x'].connect("value_changed", self, '_spinbox_val_changed', ['history_container_margin_x']) + nodes['history_container_margin_y'].connect("value_changed", self, '_spinbox_val_changed', ['history_container_margin_y']) + + ## The custom event section + nodes['new_custom_event_open'].connect("pressed", self, "new_custom_event_pressed") + nodes['new_custom_event_section'].hide() + nodes['new_custom_event_name'].connect("text_changed", self, "custom_event_name_entered") + nodes['new_custom_event_id'].connect("text_changed", self, "custom_event_id_entered") + nodes['new_custom_event_cancel'].connect("pressed", self, "cancel_custom_event") + nodes['new_custom_event_create'].connect("pressed", self, "create_custom_event") + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.set('custom_colors/font_color', get_color("error_color", "Editor")) + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/CustomEventsDocs.icon = get_icon("HelpSearch", "EditorIcons") + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/CustomEventsDocs.connect("pressed", self, 'open_custom_event_docs') + + ## The Animation Section + nodes['default_join_animation'].connect('about_to_show', self, '_on_AnimationDefault_about_to_show', [nodes['default_join_animation'], '_in']) + nodes['default_leave_animation'].connect('about_to_show', self, '_on_AnimationDefault_about_to_show', [nodes['default_leave_animation'], 'out']) + nodes['default_join_animation'].get_popup().connect('index_pressed', self, '_on_AnimationDefault_index_pressed', [nodes['default_join_animation'], 'default_join_animation']) + nodes['default_leave_animation'].get_popup().connect('index_pressed', self, '_on_AnimationDefault_index_pressed', [nodes['default_leave_animation'], 'default_leave_animation']) + nodes['default_join_animation'].custom_icon = get_icon("Animation", "EditorIcons") + nodes['default_leave_animation'].custom_icon = get_icon("Animation", "EditorIcons") + nodes['default_join_animation_length'].connect('value_changed', self, '_on_AnimationDefaultLength_value_changed', ['default_join_animation_length']) + nodes['default_leave_animation_length'].connect('value_changed', self, '_on_AnimationDefaultLength_value_changed', ['default_leave_animation_length']) + +func update_data(): + # Reloading the settings + var settings = DialogicResources.get_settings_config() + nodes['themes'].text = DialogicUtil.get_theme_dict()[settings.get_value("theme", "default", "default-theme.cfg")].get('name') + nodes['canvas_layer'].value = int(settings.get_value("theme", "canvas_layer", '1')) + load_values(settings, "input", INPUT_KEYS) + load_values(settings, "history", HISTORY_KEYS) + load_values(settings, "animations", ANIMATION_KEYS) + select_bus(settings.get_value("dialog", 'text_event_audio_default_bus', "Master")) + + +func load_values(settings: ConfigFile, section: String, key: Array): + for k in key: + if settings.has_section_key(section, k): + if nodes[k] is LineEdit: + nodes[k].text = settings.get_value(section, k) + elif nodes[k] is OptionButton or nodes[k] is MenuButton: + nodes[k].text = settings.get_value(section, k) + if section == 'animations': + nodes[k].text = DialogicUtil.beautify_filename(nodes[k].text) + elif nodes[k] is SpinBox: + nodes[k].value = settings.get_value(section, k) + else: + nodes[k].pressed = settings.get_value(section, k, false) + + +func refresh_themes(settings: ConfigFile): + # TODO move to theme section later + nodes['themes'].clear() + var theme_list = DialogicUtil.get_sorted_theme_list() + var theme_indexes = {} + var index = 0 + for theme in theme_list: + nodes['themes'].add_item(theme['name']) + nodes['themes'].set_item_metadata(index, {'file': theme['file']}) + theme_indexes[theme['file']] = index + index += 1 + + # Only one item added, then save as default + if index == 1: + set_value('theme', 'default', theme_list[0]['file']) + + # More than one theme? Select which the default one is + if index > 1: + if settings.has_section_key('theme', 'default'): + nodes['themes'].select(theme_indexes[settings.get_value('theme', 'default', null)]) + else: + # Fallback + set_value('theme', 'default', theme_list[0]['file']) + + + + + + + +func _on_delay_options_text_changed(text): + set_value('input', 'delay_after_options', text) + + +func _on_item_toggled(value: bool, section: String, key: String): + set_value(section, key, value) + + +func _on_button_history_button_position_selected(index): + set_value('history', 'history_button_position', str(index)) + + +func _spinbox_val_changed(newValue :float, spinbox_name): + set_value('history', spinbox_name, newValue) + + +func _on_default_action_key_presssed(settingName = 'default_action_key') -> void: + var settings = DialogicResources.get_settings_config() + nodes[settingName].clear() + nodes[settingName].add_item(settings.get_value('input', settingName, 'dialogic_default_action')) + for prop in ProjectSettings.get_property_list(): + if prop.name.begins_with('input/'): + nodes[settingName].add_item(prop.name.trim_prefix('input/')) + + +func _on_hotkey_action_key_presssed(settingName = 'choice_hotkey_1') -> void: + var settings = DialogicResources.get_settings_config() + nodes[settingName].clear() + nodes[settingName].add_item(settings.get_value('input', settingName, '[None]')) + nodes[settingName].add_item('[None]') + for prop in ProjectSettings.get_property_list(): + if prop.name.begins_with('input/'): + nodes[settingName].add_item(prop.name.trim_prefix('input/')) + + + +func _on_default_action_key_item_selected(index, settingName = 'default_action_key') -> void: + print(nodes[settingName].text) + set_value('input', settingName, nodes[settingName].text) + + +func _on_canvas_layer_text_changed(text) -> void: + set_value('theme', 'canvas_layer', text) + + +func _on_text_changed(text, section: String, key: String) -> void: + set_value(section, key, text) + #set_value('history', 'history_character_delimiter', text) + + +# Reading and saving data to the settings file +func set_value(section, key, value): + DialogicResources.set_settings_value(section, key, value) + + +func update_bus_selector(): + if nodes["text_event_audio_default_bus"] != null: + var previous_selected_bus_name = "" + if nodes["text_event_audio_default_bus"].get_item_count(): + previous_selected_bus_name = nodes["text_event_audio_default_bus"].get_item_text(max(0, nodes["text_event_audio_default_bus"].selected)) + + nodes["text_event_audio_default_bus"].clear() + for i in range(AudioServer.bus_count): + var bus_name = AudioServer.get_bus_name(i) + nodes["text_event_audio_default_bus"].add_item(bus_name) + + if previous_selected_bus_name == bus_name: + nodes["text_event_audio_default_bus"].select(i) + + +func select_bus(text): + for item_idx in range(nodes["text_event_audio_default_bus"].get_item_count()): + if nodes["text_event_audio_default_bus"].get_item_text(item_idx) == text: + nodes["text_event_audio_default_bus"].select(item_idx) + return + nodes["text_event_audio_default_bus"].select(0) + + +func _on_text_audio_default_bus_item_selected(index): + var text = nodes['text_event_audio_default_bus'].get_item_text(index) + set_value('dialog', 'text_event_audio_default_bus', text) + + +################################################################################ +## CUSTOM EVENT SECTION +################################################################################ + +func open_custom_event_docs(): + editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").select_documentation_item("res://addons/dialogic/Documentation/Content/Events/CustomEvents/CreateCustomEvents.md") + + +func new_custom_event_pressed(): + nodes['new_custom_event_section'].show() + nodes['new_custom_event_name'].text = '' + nodes['new_custom_event_directory'].text = '' + nodes['new_custom_event_id'].text = '' + + nodes['new_custom_event_create'].disabled = true + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "" + + +func custom_event_name_entered(text:String): + nodes['new_custom_event_directory'].text = text + + nodes['new_custom_event_create'].disabled = nodes['new_custom_event_id'].text != '' + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "" + + +func custom_event_id_entered(text): + if nodes['new_custom_event_name'].text != '': + nodes['new_custom_event_create'].disabled = false + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "" + + +func cancel_custom_event(): + nodes['new_custom_event_section'].hide() + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "" + + +func create_custom_event(): + # do checks for incomplete input + if nodes['new_custom_event_directory'].text.empty(): + print('[D] No directory specified!') + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "Enter a directory name!" + return + if nodes['new_custom_event_name'].text.empty(): + print('[D] No name specified!') + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "Enter a event name!" + return + if nodes['new_custom_event_id'].text.empty(): + print('[D] No id specified!') + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "Enter an id!" + return + + # create new directory + var dir_name = 'res://dialogic/custom-events/'+nodes['new_custom_event_directory'].text + var dir = Directory.new() + if dir.dir_exists(dir_name): + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "The folder already exists!" + print("[D] Custom Events folder '"+nodes['new_custom_event_directory'].text+"' already exists!") + return + dir.make_dir(dir_name) + + # copy all necessary files + for file in ['EventBlock.tscn', 'Stylebox.tres', 'EventPart_Example.gd', 'EventPart_Example.tscn', 'event_yourname_000.gd']: + dir.copy("res://addons/dialogic/Example Assets/CustomEvents/"+file, dir_name+"/"+file) + + # Updating the script location of the example + var scene = load(dir_name+"/EventPart_Example.tscn") + var scene_instance = scene.instance() + scene_instance.set_script(load(dir_name+"/EventPart_Example.gd")) + var packed_scene = PackedScene.new() + packed_scene.pack(scene_instance) + ResourceSaver.save(dir_name+"/EventPart_Example.tscn", packed_scene) + + # rename the event handler script + dir.rename(dir_name+'/event_yourname_000.gd', dir_name+'/event_'+nodes['new_custom_event_id'].text+'.gd') + + # edit the EventBlock scene + var event_block_scene = load(dir_name+'/EventBlock.tscn').instance(PackedScene.GEN_EDIT_STATE_INSTANCE) + event_block_scene.event_name = nodes['new_custom_event_name'].text + event_block_scene.event_data = {'event_id':nodes['new_custom_event_id'].text} + event_block_scene.event_icon = load("res://addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg") + var packed = PackedScene.new() + packed.pack(event_block_scene) + ResourceSaver.save(dir_name+'/EventBlock.tscn', packed) + + # close the section + nodes['new_custom_event_section'].hide() + + # force godot to show the folder + editor_reference.editor_interface.get_resource_filesystem().scan() + $VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer/Message.text = "" + + +################ +## ANIMATION +################ +func _on_AnimationDefault_about_to_show(picker, filter): + picker.get_popup().clear() + var animations = DialogicAnimaResources.get_available_animations() + var idx = 0 + for animation_name in animations: + if filter in animation_name: + picker.get_popup().add_icon_item(get_icon("Animation", "EditorIcons"), DialogicUtil.beautify_filename(animation_name.get_file())) + picker.get_popup().set_item_metadata(idx, {'file': animation_name.get_file()}) + idx +=1 + +func _on_AnimationDefault_index_pressed(index, picker, key): + set_value('animations', key, picker.get_popup().get_item_metadata(index)['file']) + picker.text = picker.get_popup().get_item_text(index) + +func _on_AnimationDefaultLength_value_changed(value, key): + set_value('animations', key, value) + + +########## +## THEME +########## +func build_PickerMenu(): + nodes['themes'].get_popup().clear() + var folder_structure = DialogicUtil.get_theme_folder_structure() + + ## building the root level + build_PickerMenuFolder(nodes['themes'].get_popup(), folder_structure, "MenuButton") + +# is called recursively to build all levels of the folder structure +func build_PickerMenuFolder(menu:PopupMenu, folder_structure:Dictionary, current_folder_name:String): + var index = 0 + for folder_name in folder_structure['folders'].keys(): + var submenu = PopupMenu.new() + var submenu_name = build_PickerMenuFolder(submenu, folder_structure['folders'][folder_name], folder_name) + submenu.name = submenu_name + menu.add_submenu_item(folder_name, submenu_name) + menu.set_item_icon(index, get_icon("Folder", "EditorIcons")) + menu.add_child(submenu) + nodes['themes'].update_submenu_style(submenu) + index += 1 + + var files_info = DialogicUtil.get_theme_dict() + for file in folder_structure['files']: + menu.add_item(files_info[file]['name']) + menu.set_item_icon(index, editor_reference.get_node("MainPanel/MasterTreeContainer/MasterTree").theme_icon) + menu.set_item_metadata(index, {'file':file}) + index += 1 + + if not menu.is_connected("index_pressed", self, "_on_ThemePicker_index_pressed"): + menu.connect("index_pressed", self, '_on_ThemePicker_index_pressed', [menu]) + + return current_folder_name + +func _on_ThemePicker_index_pressed(index, menu): + nodes['themes'].text = menu.get_item_text(index) + set_value('theme', 'default', menu.get_item_metadata(index)['file']) diff --git a/project/addons/dialogic/Editor/SettingsEditor/SettingsEditor.tscn b/project/addons/dialogic/Editor/SettingsEditor/SettingsEditor.tscn new file mode 100644 index 0000000..a2a2a44 --- /dev/null +++ b/project/addons/dialogic/Editor/SettingsEditor/SettingsEditor.tscn @@ -0,0 +1,631 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/SettingsEditor.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Common/SectionTitle.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/Scenes/SettingsCheckbox.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Editor/SettingsEditor/Scenes/HistorySettings.tscn" type="PackedScene" id=5] +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/ResourcePickers/ResourcePickerMenu.tscn" type="PackedScene" id=6] +[ext_resource path="res://addons/dialogic/Editor/Events/styles/InputFieldsStyle.tres" type="Theme" id=7] + +[sub_resource type="Image" id=1] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=2] +flags = 4 +flags = 4 +image = SubResource( 1 ) +size = Vector2( 16, 16 ) + +[node name="SettingsEditor" type="ScrollContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 7 ) +script = ExtResource( 1 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 1012.0 +margin_bottom = 716.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1012.0 +margin_bottom = 716.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3"] +margin_right = 398.0 +margin_bottom = 716.0 +custom_constants/separation = 16 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer"] +margin_right = 398.0 +margin_bottom = 78.0 + +[node name="SectionTitle" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer" instance=ExtResource( 2 )] +margin_right = 398.0 +text = "Theme" +text_key = "Theme" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer"] +margin_top = 26.0 +margin_right = 398.0 +margin_bottom = 50.0 + +[node name="TLabel" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer/HBoxContainer" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 98.0 +margin_bottom = 19.0 +text = "Default Theme:" +text_key = "Default" + +[node name="ThemePicker" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer/HBoxContainer" instance=ExtResource( 6 )] +margin_left = 102.0 +margin_right = 251.0 +custom_colors/font_color = Color( 0.8, 0.807843, 0.827451, 1 ) +text = "Default Theme" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer"] +margin_top = 54.0 +margin_right = 398.0 +margin_bottom = 78.0 + +[node name="TLabel3" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer/HBoxContainer3" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 83.0 +margin_bottom = 19.0 +text = "Canvas layer:" +text_key = "Canvas layer:" + +[node name="CanvasLayer" type="SpinBox" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer/HBoxContainer3"] +margin_left = 87.0 +margin_right = 163.0 +margin_bottom = 24.0 +min_value = -999.0 +max_value = 999.0 +value = 1.0 +rounded = true + +[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer"] +margin_top = 94.0 +margin_right = 398.0 +margin_bottom = 388.0 + +[node name="SectionTitle" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 2 )] +margin_right = 398.0 +text = "Dialog" +text_key = "Dialog" + +[node name="SettingsCheckbox" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 26.0 +margin_right = 398.0 +margin_bottom = 50.0 +text = "New lines will create extra messages" +default = true +settings_section = "dialog" +settings_key = "new_lines" + +[node name="SettingsCheckbox2" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 54.0 +margin_right = 398.0 +margin_bottom = 78.0 +text = "Remove empty messages" +default = true +settings_section = "dialog" +settings_key = "remove_empty_messages" + +[node name="SettingsCheckbox3" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 82.0 +margin_right = 398.0 +margin_bottom = 106.0 +text = "Auto color character names in messages" +default = true +settings_section = "dialog" +settings_key = "auto_color_names" + +[node name="SettingsCheckbox5" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 110.0 +margin_right = 398.0 +margin_bottom = 134.0 +hint_tooltip = "If disabled, background images use \"Aspect covered\" mode." +text = "Stretch background images " +default = true +settings_section = "dialog" +settings_key = "stretch_backgrounds" + +[node name="SettingsCheckbox8" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 138.0 +margin_right = 398.0 +margin_bottom = 162.0 +hint_tooltip = "Re-center portrait on each change (1.4+ behavior)" +text = "Re-center portrait on each change (1.4+ behavior)" +default = true +settings_section = "dialog" +settings_key = "recenter_portrait" + +[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2"] +margin_top = 166.0 +margin_right = 398.0 +margin_bottom = 170.0 + +[node name="TLabel6" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 174.0 +margin_right = 398.0 +margin_bottom = 188.0 +text = "Audio for Text events:" +text_key = "Audio for Text events:" + +[node name="SettingsCheckbox6" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 192.0 +margin_right = 398.0 +margin_bottom = 216.0 +text = "Enable audio for Text events" +settings_section = "dialog" +settings_key = "text_event_audio_enable" + +[node name="TextAudioDefaultBus" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2"] +margin_top = 220.0 +margin_right = 398.0 +margin_bottom = 240.0 + +[node name="TLabel8" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2/TextAudioDefaultBus" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 204.0 +margin_bottom = 17.0 +text = "Default bus for Text event audio" +text_key = "Default bus for Text event audio" + +[node name="AudioBus" type="OptionButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2/TextAudioDefaultBus"] +margin_left = 208.0 +margin_right = 281.0 +margin_bottom = 20.0 +text = "Master" +items = [ "Master", null, false, 0, null ] +selected = 0 + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2"] +margin_top = 244.0 +margin_right = 398.0 +margin_bottom = 248.0 + +[node name="TLabel9" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 252.0 +margin_right = 398.0 +margin_bottom = 266.0 +text = "Experimental Translations:" +text_key = "Experimental Translations:" + +[node name="SettingsCheckbox7" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer2" instance=ExtResource( 4 )] +margin_top = 270.0 +margin_right = 398.0 +margin_bottom = 294.0 +text = "Inputs for text events will be treated as keys for tr()" +settings_section = "dialog" +settings_key = "translations" + +[node name="VBoxContainer3" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer"] +margin_top = 404.0 +margin_right = 398.0 +margin_bottom = 454.0 + +[node name="SectionTitle" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer3" instance=ExtResource( 2 )] +margin_right = 398.0 +text = "Game saving" +text_key = "Saving" + +[node name="SettingsCheckbox8" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer3" instance=ExtResource( 4 )] +margin_top = 26.0 +margin_right = 398.0 +margin_bottom = 50.0 +text = "Autosave" +default = true +settings_section = "saving" +settings_key = "autosave" + +[node name="VBoxContainer4" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer"] +margin_top = 470.0 +margin_right = 398.0 +margin_bottom = 548.0 + +[node name="SectionTitle2" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4" instance=ExtResource( 2 )] +margin_right = 398.0 +text = "Animations" +text_key = "Animations" + +[node name="DefaultJoinAnimation" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4"] +margin_top = 26.0 +margin_right = 398.0 +margin_bottom = 50.0 + +[node name="TLabel" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultJoinAnimation" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 212.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +text = "Default Join Animation:" +text_key = "Default Join Animation:" + +[node name="JoinAnimationPicker" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultJoinAnimation" instance=ExtResource( 6 )] +margin_left = 216.0 +margin_right = 318.0 +custom_colors/font_color = Color( 0.8, 0.807843, 0.827451, 1 ) +text = "Fade In" + +[node name="AnimationLengthPicker" type="SpinBox" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultJoinAnimation"] +margin_left = 322.0 +margin_right = 398.0 +margin_bottom = 24.0 +step = 0.01 +value = 0.5 + +[node name="DefaultLeaveAnimation" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4"] +margin_top = 54.0 +margin_right = 398.0 +margin_bottom = 78.0 + +[node name="TLabel" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultLeaveAnimation" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 161.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +text = "Default Leave Animation:" +text_key = "Default Leave Animation:" + +[node name="LeaveAnimationPicker" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultLeaveAnimation" instance=ExtResource( 6 )] +margin_left = 165.0 +margin_right = 318.0 +custom_colors/font_color = Color( 0.8, 0.807843, 0.827451, 1 ) +text = "Fade Out Down" + +[node name="AnimationLengthPicker" type="SpinBox" parent="VBoxContainer/HBoxContainer3/VBoxContainer/VBoxContainer4/DefaultLeaveAnimation"] +margin_left = 322.0 +margin_right = 398.0 +margin_bottom = 24.0 +step = 0.01 +value = 0.5 + +[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3"] +margin_left = 402.0 +margin_right = 738.0 +margin_bottom = 716.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2"] +margin_right = 336.0 +margin_bottom = 310.0 + +[node name="SectionTitle2" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer" instance=ExtResource( 2 )] +margin_right = 336.0 +text = "Input" +text_key = "Input" + +[node name="SettingsCheckbox2" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer" instance=ExtResource( 4 )] +margin_top = 26.0 +margin_right = 336.0 +margin_bottom = 50.0 +text = "Autofocus choice buttons" +settings_section = "input" +settings_key = "autofocus_choices" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer"] +margin_top = 54.0 +margin_right = 336.0 +margin_bottom = 78.0 + +[node name="TLabel14" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 181.0 +margin_bottom = 19.0 +text = "Enable choice options after " +text_key = "Enable choice options after " + +[node name="LineEdit" type="LineEdit" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer"] +margin_left = 185.0 +margin_right = 245.0 +margin_bottom = 24.0 +text = "0.2" + +[node name="TLabel15" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 249.0 +margin_top = 5.0 +margin_right = 306.0 +margin_bottom = 19.0 +text = " seconds" +text_key = " seconds" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer"] +margin_top = 82.0 +margin_right = 336.0 +margin_bottom = 102.0 + +[node name="TLabel16" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer2" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 115.0 +margin_bottom = 17.0 +text = "Default action key" +text_key = "Default action key" + +[node name="DefaultActionKey" type="OptionButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer2"] +margin_left = 119.0 +margin_right = 292.0 +margin_bottom = 20.0 +hint_tooltip = "The default value is \"ui_accept\"" +text = "dialogic_default_action" + +[node name="SettingsCheckbox" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer" instance=ExtResource( 4 )] +margin_top = 106.0 +margin_right = 336.0 +margin_bottom = 130.0 +text = "Tap area covers full screen" +default = true +settings_section = "input" +settings_key = "clicking_dialog_action" + +[node name="SettingsCheckbox3" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer" instance=ExtResource( 4 )] +margin_top = 134.0 +margin_right = 336.0 +margin_bottom = 158.0 +text = "Enable default choice hotkeys" +settings_section = "input" +settings_key = "enable_default_shortcut" + +[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer"] +margin_top = 162.0 +margin_right = 336.0 +margin_bottom = 182.0 +alignment = 2 + +[node name="TLabel18" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer4" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 102.0 +margin_bottom = 17.0 +text = "Choice 1 hotkey" +text_key = "Choice 1 hotkey" + +[node name="Choice1Hotkey" type="OptionButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer4"] +margin_left = 106.0 +margin_right = 336.0 +margin_bottom = 20.0 +hint_tooltip = "The default value is No Hotkey" +size_flags_horizontal = 3 +text = "[None]" + +[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer"] +margin_top = 186.0 +margin_right = 336.0 +margin_bottom = 206.0 +alignment = 2 + +[node name="TLabel19" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer5" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 102.0 +margin_bottom = 17.0 +text = "Choice 2 hotkey" +text_key = "Choice 2 hotkey" + +[node name="Choice2Hotkey" type="OptionButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer5"] +margin_left = 106.0 +margin_right = 336.0 +margin_bottom = 20.0 +hint_tooltip = "The default value is No Hotkey" +size_flags_horizontal = 3 +text = "dialogic_setction" + +[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer"] +margin_top = 210.0 +margin_right = 336.0 +margin_bottom = 230.0 +alignment = 2 + +[node name="TLabel20" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer6" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 102.0 +margin_bottom = 17.0 +text = "Choice 3 hotkey" +text_key = "Choice 3 hotkey" + +[node name="Choice3Hotkey" type="OptionButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer6"] +margin_left = 106.0 +margin_right = 336.0 +margin_bottom = 20.0 +hint_tooltip = "The default value is No Hotkey" +size_flags_horizontal = 3 +text = "[None]" + +[node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer"] +margin_top = 234.0 +margin_right = 336.0 +margin_bottom = 254.0 +alignment = 2 + +[node name="TLabel21" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer7" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 102.0 +margin_bottom = 17.0 +text = "Choice 4 hotkey" +text_key = "Choice 4 hotkey" + +[node name="Choice4Hotkey" type="OptionButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer/HBoxContainer7"] +margin_left = 106.0 +margin_right = 336.0 +margin_bottom = 20.0 +hint_tooltip = "The default value is No Hotkey" +size_flags_horizontal = 3 +text = "[None]" + +[node name="SettingsCheckbox4" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer" instance=ExtResource( 4 )] +margin_top = 258.0 +margin_right = 336.0 +margin_bottom = 282.0 +text = "Propagate input to rest of the Tree" +default = true +settings_section = "dialog" +settings_key = "propagate_input" + +[node name="SettingsCheckbox5" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/VBoxContainer" instance=ExtResource( 4 )] +margin_top = 286.0 +margin_right = 336.0 +margin_bottom = 310.0 +text = "Stop Mouse Clicks" +default = true +settings_section = "dialog" +settings_key = "stop_mouse" + +[node name="HistorySettings" parent="VBoxContainer/HBoxContainer3/VBoxContainer2" instance=ExtResource( 5 )] +margin_top = 314.0 +margin_right = 336.0 +margin_bottom = 658.0 + +[node name="CustomEvents" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2"] +margin_top = 662.0 +margin_right = 336.0 +margin_bottom = 712.0 + +[node name="SectionTitle" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents" instance=ExtResource( 2 )] +margin_right = 336.0 +text = "Custom events" +text_key = "Custom events" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents"] +margin_top = 26.0 +margin_right = 336.0 +margin_bottom = 50.0 + +[node name="Message" type="Label" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer"] +margin_top = 5.0 +margin_right = 260.0 +margin_bottom = 19.0 +size_flags_horizontal = 3 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NewCustomEvent" type="Button" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer"] +margin_left = 264.0 +margin_right = 304.0 +margin_bottom = 24.0 +text = "New" + +[node name="CustomEventsDocs" type="ToolButton" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/HBoxContainer"] +margin_left = 308.0 +margin_right = 336.0 +margin_bottom = 24.0 +icon = SubResource( 2 ) + +[node name="CreateCustomEventSection" type="GridContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents"] +visible = false +margin_top = 54.0 +margin_right = 304.0 +margin_bottom = 158.0 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 105.0 +margin_bottom = 19.0 +text = "Event Name:" +text_key = "Event Name:" + +[node name="CeName" type="LineEdit" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection"] +margin_left = 109.0 +margin_right = 304.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="TLabel2" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 105.0 +margin_bottom = 47.0 +text = "Directory Name:" +text_key = "Directory Name:" + +[node name="CeDirectory" type="LineEdit" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection"] +margin_left = 109.0 +margin_top = 28.0 +margin_right = 304.0 +margin_bottom = 52.0 +size_flags_horizontal = 3 + +[node name="TLabel3" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection" instance=ExtResource( 3 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 105.0 +margin_bottom = 75.0 +text = "Event id:" +text_key = "Event id:" + +[node name="CeEventId" type="LineEdit" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection"] +margin_left = 109.0 +margin_top = 56.0 +margin_right = 304.0 +margin_bottom = 80.0 +size_flags_horizontal = 3 +placeholder_text = "myname_001" + +[node name="Control" type="Control" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection"] +margin_top = 84.0 +margin_right = 105.0 +margin_bottom = 104.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection"] +margin_left = 109.0 +margin_top = 84.0 +margin_right = 304.0 +margin_bottom = 104.0 +alignment = 2 + +[node name="CreateCustomEvent" type="Button" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/HBoxContainer"] +margin_left = 84.0 +margin_right = 137.0 +margin_bottom = 20.0 +text = "Create" + +[node name="CancelCustomEvent" type="Button" parent="VBoxContainer/HBoxContainer3/VBoxContainer2/CustomEvents/CreateCustomEventSection/HBoxContainer"] +margin_left = 141.0 +margin_right = 195.0 +margin_bottom = 20.0 +text = "Cancel" + +[node name="CustomEvents" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/VBoxContainer2"] +margin_top = 716.0 +margin_right = 336.0 +margin_bottom = 716.0 diff --git a/project/addons/dialogic/Editor/Theme/MainTheme.tres b/project/addons/dialogic/Editor/Theme/MainTheme.tres new file mode 100644 index 0000000..8a44629 --- /dev/null +++ b/project/addons/dialogic/Editor/Theme/MainTheme.tres @@ -0,0 +1,3 @@ +[gd_resource type="Theme" format=2] + +[resource] diff --git a/project/addons/dialogic/Editor/Theme/PickerTheme.tres b/project/addons/dialogic/Editor/Theme/PickerTheme.tres new file mode 100644 index 0000000..36b1955 --- /dev/null +++ b/project/addons/dialogic/Editor/Theme/PickerTheme.tres @@ -0,0 +1,7 @@ +[gd_resource type="Theme" format=2] + +[resource] +Button/colors/font_color = Color( 1, 1, 1, 1 ) +Button/colors/font_color_disabled = Color( 0.901961, 0.901961, 0.901961, 0.2 ) +Button/colors/font_color_hover = Color( 0.870588, 0.870588, 0.870588, 1 ) +Button/colors/font_color_pressed = Color( 1, 1, 1, 1 ) diff --git a/project/addons/dialogic/Editor/ThemeEditor/AudioPicker.gd b/project/addons/dialogic/Editor/ThemeEditor/AudioPicker.gd new file mode 100644 index 0000000..db87e89 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/AudioPicker.gd @@ -0,0 +1,113 @@ +tool +extends GridContainer + +signal data_updated(section) + +var loading = false +var editor_reference +var path = "" + +onready var n : Dictionary = { + 'enable': $"FileHBoxContainer/EnableCheckBox", + 'path': $"FileHBoxContainer/PathButton", + 'volume': $"VolumeHBoxContainer/VolumeSpinBox", + 'volume_rand_range': $"VolumeHBoxContainer/VolumeRandRangeSpinBox", + 'pitch': $"PitchHBoxContainer/PitchSpinBox", + 'pitch_rand_range': $"PitchHBoxContainer/PitchRandRangeSpinBox", + 'allow_interrupt': $"AllowInterruptCheckBox", + 'audio_bus': $"AudioBusOptionButton" +} + +func _ready(): + editor_reference = find_parent('EditorView') + + AudioServer.connect("bus_layout_changed", self, "_on_bus_layout_changed") + update_audio_bus_option_buttons() + +func set_data(data): + loading = true + n['enable'].set_pressed(data['enable']) + + path = data['path'] + _on_Path_selected(path) + n['path'].text = editor_reference.dialogicTranslator.translate('File or folder path') + n['volume'].set_value(data['volume']) + n['volume_rand_range'].set_value(data['volume_rand_range']) + n['pitch'].set_value(data['pitch']) + n['pitch_rand_range'].set_value(data['pitch_rand_range']) + n['allow_interrupt'].set_pressed(data['allow_interrupt']) + + update_audio_bus_option_buttons(data['audio_bus']) + + _set_disabled(!data['enable']) + loading = false + +func get_data(): + return { + 'enable': n['enable'].is_pressed(), + 'path': path, + 'volume': n['volume'].get_value(), + 'volume_rand_range': n['volume_rand_range'].get_value(), + 'pitch': n['pitch'].get_value(), + 'pitch_rand_range': n['pitch_rand_range'].get_value(), + 'allow_interrupt': n['allow_interrupt'].is_pressed(), + 'audio_bus': AudioServer.get_bus_name(n['audio_bus'].get_selected_id()) + } + +func _on_EnableCheckBox_toggled(button_pressed): + if not loading: emit_signal("data_updated", name.to_lower()) + _set_disabled(!button_pressed) + +func _set_disabled(disabled): + n['path'].set_disabled(disabled) + n['volume'].set_editable(!disabled) + n['volume_rand_range'].set_editable(!disabled) + n['pitch'].set_editable(!disabled) + n['pitch_rand_range'].set_editable(!disabled) + n['allow_interrupt'].set_disabled(disabled) + n['audio_bus'].set_disabled(disabled) + +func _on_PathButton_pressed(): + editor_reference.godot_dialog("*.ogg, *.wav", EditorFileDialog.MODE_OPEN_ANY) + editor_reference.godot_dialog_connect(self, "_on_Path_selected", ["dir_selected", "file_selected"]) + +func _on_Path_selected(selected_path, target = ""): + if typeof(selected_path) == TYPE_STRING and path != "": + path = selected_path + n['path'].text = DialogicResources.get_filename_from_path(path) + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_VolumeSpinBox_value_changed(value): + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_VolumeRandRangeSpinBox_value_changed(value): + n['volume_rand_range'].set_value(abs(value)) + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_PitchSpinBox_value_changed(value): + n['pitch'].set_value(max(0.01, value)) + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_PitchRandRangeSpinBox_value_changed(value): + n['pitch_rand_range'].set_value(abs(value)) + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_AllowInterruptCheckBox_toggled(button_pressed): + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_AudioBusOptionButton_item_selected(index): + if not loading: emit_signal("data_updated", name.to_lower()) + +func _on_bus_layout_changed(): + var selected_id = n['audio_bus'].get_selected_id() + var selected_text = n['audio_bus'].get_item_text(selected_id) + update_audio_bus_option_buttons(selected_text) + +func update_audio_bus_option_buttons(selected_text = ''): + n['audio_bus'].clear() + for i in range(AudioServer.bus_count): + var bus_name = AudioServer.get_bus_name(i) + n['audio_bus'].add_item(bus_name) + if bus_name == selected_text: + n['audio_bus'].select(i) + diff --git a/project/addons/dialogic/Editor/ThemeEditor/AudioPicker.tscn b/project/addons/dialogic/Editor/ThemeEditor/AudioPicker.tscn new file mode 100644 index 0000000..c7fb571 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/AudioPicker.tscn @@ -0,0 +1,146 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/AudioPicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=2] + +[node name="AudioPicker" type="GridContainer"] +margin_right = 265.0 +margin_bottom = 132.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FileLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 95.0 +margin_bottom = 19.0 +text = "Lautstärke" +text_key = "UseAudio" + +[node name="FileHBoxContainer" type="HBoxContainer" parent="."] +margin_left = 105.0 +margin_right = 265.0 +margin_bottom = 24.0 + +[node name="EnableCheckBox" type="CheckBox" parent="FileHBoxContainer"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="PathButton" type="Button" parent="FileHBoxContainer"] +margin_left = 28.0 +margin_right = 160.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +text = "File or Folder" + +[node name="VolumeLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 95.0 +margin_bottom = 47.0 +text = "Volume" +text_key = "Volume" + +[node name="VolumeHBoxContainer" type="HBoxContainer" parent="."] +margin_left = 105.0 +margin_top = 28.0 +margin_right = 265.0 +margin_bottom = 52.0 +size_flags_horizontal = 3 + +[node name="VolumeSpinBox" type="SpinBox" parent="VolumeHBoxContainer"] +margin_right = 82.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +min_value = -80.0 +step = 0.01 + +[node name="VolumeRandRangeSpinBox" type="SpinBox" parent="VolumeHBoxContainer"] +margin_left = 86.0 +margin_right = 160.0 +margin_bottom = 24.0 +hint_tooltip = "Random Range" +step = 0.01 +prefix = "±" + +[node name="PitchLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 95.0 +margin_bottom = 75.0 +text = "Pitch" +text_key = "Pitch" + +[node name="PitchHBoxContainer" type="HBoxContainer" parent="."] +margin_left = 105.0 +margin_top = 56.0 +margin_right = 265.0 +margin_bottom = 80.0 +size_flags_horizontal = 3 + +[node name="PitchSpinBox" type="SpinBox" parent="PitchHBoxContainer"] +margin_right = 82.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +step = 0.01 + +[node name="PitchRandRangeSpinBox" type="SpinBox" parent="PitchHBoxContainer"] +margin_left = 86.0 +margin_right = 160.0 +margin_bottom = 24.0 +hint_tooltip = "Random Range" +max_value = 10.0 +step = 0.01 +prefix = "±" + +[node name="InterruptLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 89.0 +margin_right = 95.0 +margin_bottom = 103.0 +text = "Allow interrupt" +text_key = "Allow interrupt" + +[node name="AllowInterruptCheckBox" type="CheckBox" parent="."] +margin_left = 105.0 +margin_top = 84.0 +margin_right = 265.0 +margin_bottom = 108.0 + +[node name="AudioBusLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 115.0 +margin_right = 95.0 +margin_bottom = 129.0 +text = "AudioBus" +text_key = "Audio Bus" + +[node name="AudioBusOptionButton" type="OptionButton" parent="."] +margin_left = 105.0 +margin_top = 112.0 +margin_right = 265.0 +margin_bottom = 132.0 +text = "Master" +items = [ "Master", null, false, 0, null ] +selected = 0 + +[connection signal="toggled" from="FileHBoxContainer/EnableCheckBox" to="." method="_on_EnableCheckBox_toggled"] +[connection signal="pressed" from="FileHBoxContainer/PathButton" to="." method="_on_PathButton_pressed"] +[connection signal="value_changed" from="VolumeHBoxContainer/VolumeSpinBox" to="." method="_on_VolumeSpinBox_value_changed"] +[connection signal="value_changed" from="VolumeHBoxContainer/VolumeRandRangeSpinBox" to="." method="_on_VolumeRandRangeSpinBox_value_changed"] +[connection signal="value_changed" from="PitchHBoxContainer/PitchSpinBox" to="." method="_on_PitchSpinBox_value_changed"] +[connection signal="value_changed" from="PitchHBoxContainer/PitchRandRangeSpinBox" to="." method="_on_PitchRandRangeSpinBox_value_changed"] +[connection signal="toggled" from="AllowInterruptCheckBox" to="." method="_on_AllowInterruptCheckBox_toggled"] +[connection signal="item_selected" from="AudioBusOptionButton" to="." method="_on_AudioBusOptionButton_item_selected"] diff --git a/project/addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.gd b/project/addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.gd new file mode 100644 index 0000000..4de6201 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.gd @@ -0,0 +1,81 @@ +tool +extends GridContainer + +signal style_modified(section) +signal picking_background(section) + +var real_file_path = 'res://addons/dialogic/Example Assets/backgrounds/background-2.png' + + +func load_style(data): + $TextColor/CheckBox.pressed = data[0] + $TextColor/ColorPickerButton.color = data[1] + + $FlatBackground/CheckBox.pressed = data[2] + $FlatBackground/ColorPickerButton.color = data[3] + + $BackgroundTexture/CheckBox.pressed = data[4] + set_path(data[5]) + + $TextureModulation/CheckBox.pressed = data[6] + $TextureModulation/ColorPickerButton.color = data[7] + + check_visible_buttons() + + +func get_style_array(): + var results = [] + results.append($TextColor/CheckBox.pressed) + results.append($TextColor/ColorPickerButton.color) + + results.append($FlatBackground/CheckBox.pressed) + results.append($FlatBackground/ColorPickerButton.color) + + results.append($BackgroundTexture/CheckBox.pressed) + results.append(real_file_path) + + results.append($TextureModulation/CheckBox.pressed) + results.append($TextureModulation/ColorPickerButton.color) + + return results + + +func set_path(path): + $BackgroundTexture/Button.text = DialogicResources.get_filename_from_path(path) + + +func check_visible_buttons(): + $FlatBackground/ColorPickerButton.visible = $FlatBackground/CheckBox.pressed + + if $FlatBackground/CheckBox.pressed: + $BackgroundTexture.visible = false + $BackgroundTextureLabel.visible = false + $TextureModulation.visible = false + $TextureModulationLabel.visible = false + else: + $BackgroundTexture.visible = true + $BackgroundTextureLabel.visible = true + $TextureModulation.visible = true + $TextureModulationLabel.visible = true + + +func _on_CheckBox_toggled(button_pressed): + emit_signal("style_modified", name.to_lower()) + check_visible_buttons() + + +func _on_ColorPickerButton_color_changed(color): + emit_signal("style_modified", name.to_lower()) + + +func _on_Button_pressed(): + emit_signal("picking_background", name.to_lower()) + + +func _on_button_texture_selected(path, target) -> void: + emit_signal("style_modified", name.to_lower()) + + +func _on_TextColor_ColorPickerButton_color_changed(color): + $TextColor/CheckBox.pressed = true + emit_signal("style_modified", name.to_lower()) diff --git a/project/addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.tscn b/project/addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.tscn new file mode 100644 index 0000000..12992a4 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.tscn @@ -0,0 +1,133 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=2] + +[node name="ButtonStylePicker" type="GridContainer"] +margin_right = 380.0 +margin_bottom = 112.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 126.0 +margin_bottom = 19.0 +text = "Text Color" +text_key = "Text Color" + +[node name="TextColor" type="HBoxContainer" parent="."] +margin_left = 136.0 +margin_right = 296.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 160, 0 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CheckBox" type="CheckBox" parent="TextColor"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="TextColor"] +margin_left = 28.0 +margin_right = 160.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +color = Color( 1, 1, 1, 1 ) + +[node name="TLabel2" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 126.0 +margin_bottom = 47.0 +text = "Flat background" +text_key = "Flat background" + +[node name="FlatBackground" type="HBoxContainer" parent="."] +margin_left = 136.0 +margin_top = 28.0 +margin_right = 296.0 +margin_bottom = 52.0 + +[node name="CheckBox" type="CheckBox" parent="FlatBackground"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="FlatBackground"] +visible = false +margin_left = 28.0 +margin_right = 160.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="BackgroundTextureLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 126.0 +margin_bottom = 75.0 +text = "Background Texture" +text_key = "Background Texture" + +[node name="BackgroundTexture" type="HBoxContainer" parent="."] +margin_left = 136.0 +margin_top = 56.0 +margin_right = 296.0 +margin_bottom = 80.0 +rect_min_size = Vector2( 123, 0 ) + +[node name="CheckBox" type="CheckBox" parent="BackgroundTexture"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="Button" type="Button" parent="BackgroundTexture"] +margin_left = 28.0 +margin_right = 160.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +text = "Don't change" + +[node name="TextureModulationLabel" parent="." instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 89.0 +margin_right = 126.0 +margin_bottom = 103.0 +text = "Texture Modulation" +text_key = "Texture Modulation" + +[node name="TextureModulation" type="HBoxContainer" parent="."] +margin_left = 136.0 +margin_top = 84.0 +margin_right = 296.0 +margin_bottom = 108.0 +rect_min_size = Vector2( 123, 0 ) + +[node name="CheckBox" type="CheckBox" parent="TextureModulation"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="TextureModulation"] +margin_left = 28.0 +margin_right = 160.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +color = Color( 1, 1, 1, 1 ) + +[connection signal="toggled" from="TextColor/CheckBox" to="." method="_on_CheckBox_toggled"] +[connection signal="color_changed" from="TextColor/ColorPickerButton" to="." method="_on_TextColor_ColorPickerButton_color_changed"] +[connection signal="toggled" from="FlatBackground/CheckBox" to="." method="_on_CheckBox_toggled"] +[connection signal="color_changed" from="FlatBackground/ColorPickerButton" to="." method="_on_ColorPickerButton_color_changed"] +[connection signal="toggled" from="BackgroundTexture/CheckBox" to="." method="_on_CheckBox_toggled"] +[connection signal="pressed" from="BackgroundTexture/Button" to="." method="_on_Button_pressed"] +[connection signal="toggled" from="TextureModulation/CheckBox" to="." method="_on_CheckBox_toggled"] +[connection signal="color_changed" from="TextureModulation/ColorPickerButton" to="." method="_on_ColorPickerButton_color_changed"] diff --git a/project/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd b/project/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd new file mode 100644 index 0000000..3d05c11 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd @@ -0,0 +1,1136 @@ +tool +extends Control + +var editor_reference +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +onready var settings_editor = get_node('../SettingsEditor') +var current_theme : String = '' +var preview_character_selected : String = 'random' +var current_choice_modifier_selected = 'hover' + +# When loading the variables to the input fields in the +# load_theme function, every element thinks the value was updated +# so it has to perform a "saving" of that property. +# The loading variable is a way to check if the values should be saved +# or not. +var loading : bool = true + + +# If the first time you open a theme it is a "full_width" one, the editor +# doesn't trigger the Panel resized() signal before the dialog resize_main() +# So what I do here, is doing a check for the first time and force a double +# refresh that will make sure that the full_width background will display +# as expected. + +# The stuff used for this hack are: +# Variable: first_time_loading_theme_full_size_bug +# Node: $FirstTimeLoadingFullSizeBug +# This function: _on_FirstTimeLoadingFullSizeBug_timeout() + +# If you know how to fix this, please let me know or send a pull request :) +var first_time_loading_theme_full_size_bug := 0 + + +# The amazing and revolutionary path system that magically works and you can't +# complain because "that is not how you are supposed to work". If there was only +# a way to set an id and then access that node via id... +# Here you have paths in all its glory. Praise the paths (っ´ω`c)♡ +onready var n : Dictionary = { + # Dialog Text + 'theme_text_shadow': $"VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2/CheckBoxShadow", + 'theme_text_shadow_color': $"VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2/ColorPickerButtonShadow", + 'theme_text_color': $"VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/ColorPickerButton", + 'theme_font': $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont/RegularFontButton", + 'theme_font_bold':$"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont/BoldFontButton", + 'theme_font_italic':$"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont/ItalicFontButton", + 'theme_shadow_offset_x': $"VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer/ShadowOffsetX", + 'theme_shadow_offset_y': $"VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer/ShadowOffsetY", + 'theme_text_speed': $"VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer/TextSpeed", + 'alignment': $"VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer/HBoxContainer3/Alignment", + 'single_portrait_mode': $"VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer/SinglePortraitModeCheckBox", + 'dont_close_after_last_event': $"VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer/DontCloseAfterLastEventCheckBox", + + # Dialog box + 'background_texture_button_visible': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3/CheckBox", + 'theme_background_image': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3/BackgroundTextureButton", + 'theme_background_color': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2/ColorPickerButton", + 'background_modulation': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/CheckBox", + 'background_modulation_color': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/ColorPickerButton", + 'background_full_width': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer7/CheckBox", + + 'dialog_box_anchor':$"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/PositionSelector", + 'size_w': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4/BoxSizeW", + 'size_h': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4/BoxSizeH", + + 'ninepatch_margin_left': $'VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxLeftRight/PatchMarginLeft', + 'ninepatch_margin_right': $'VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxLeftRight/PatchMarginRight', + 'ninepatch_margin_top': $'VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxTopBottom/PatchMarginTop', + 'ninepatch_margin_bottom': $'VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxTopBottom/PatchMarginBottom', + + 'box_margin_left': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/MarginLeft", + 'box_margin_top': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/MarginTop", + 'box_margin_right': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/MarginRight", + 'box_margin_bottom': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/MarginBottom", + 'text_margin_left': $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2/MarginLeft", + 'text_margin_top': $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2/MarginTop", + 'text_margin_right': $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2/MarginRight", + 'text_margin_bottom': $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2/MarginBottom", + + 'theme_next_image': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextIndicatorButton", + 'next_indicator_offset_x': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetX", + 'next_indicator_offset_y': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetY", + 'theme_background_color_visible': $"VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2/CheckBox", + 'next_animation': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextAnimation", + 'next_indicator_scale': $"VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer7/IndicatorScale", + + 'animation_show_time': $"VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/ShowTime/SpinBox", + 'animation_dim_color': $"VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/DimColor/ColorPickerButton", + 'animation_dim_time': $"VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/PortraitDimTime/SpinBox", + 'portraits_behind_dialog_box' :$"VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/PortraitsBehindDialogCheckBox", + + # Character Names + 'name_hidden': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer/GridContainer/NameHide", + 'name_font': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont/NameFontButton", + 'name_auto_color': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/CharacterColor", + 'name_background_visible': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2/CheckBox", + 'name_background': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2/ColorPickerButton", + 'name_image': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3/BackgroundTextureButton", + 'name_image_visible': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3/CheckBox", + 'name_shadow': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4/ColorPickerButtonShadow", + 'name_shadow_visible': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4/CheckBoxShadow", + 'name_shadow_offset_x': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer/ShadowOffsetX", + 'name_shadow_offset_y': $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer/ShadowOffsetY", + 'name_bottom_gap': $"VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5/BottomGap", + 'name_horizontal_offset': $"VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5/HorizontalOffset", + 'name_background_modulation': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6/CheckBox", + 'name_background_modulation_color': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6/ColorPickerButton", + 'name_padding_x': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer/NamePaddingX", + 'name_padding_y': $"VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer/NamePaddingY", + 'name_position': $"VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer/Positions", + + + # Choice Buttons + + 'button_fixed': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/FixedSize", + 'button_fixed_x': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeX", + 'button_fixed_y': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeY", + + 'button_padding_x': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetH", + 'button_padding_y': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetV", + 'button_separation': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/VerticalSeparation", + + 'button_layout': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/Layout", + + 'button_position_on_screen': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/PositionOnScreenOptionButton", + + 'button_offset_x': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer3/ButtonOffsetX", + 'button_offset_y': $"VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer3/ButtonOffsetY", + + # Button modifiers (Inherited scenes) + 'button_normal': $"VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer/Normal", + 'button_hover': $"VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer/Hover", + 'button_focus': $"VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer/Focus", + 'button_pressed': $"VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer/Pressed", + 'button_disabled': $"VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer/Disabled", + + # Glossary + 'glossary_title_font': $VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleFont/TitleFontButton, + 'glossary_text_font': $VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextFont/TextFontButton, + 'glossary_extra_font': $VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraFont/ExtraFontButton, + 'glossary_highlight_color': $VBoxContainer/TabContainer/Glossary/Column/GridContainer/HighlightColorPicker, + 'glossary_title_color': $VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleColorPicker, + 'glossary_text_color': $VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextColorPicker, + 'glossary_extra_color': $VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraColorPicker, + + 'glossary_background_panel': $VBoxContainer/TabContainer/Glossary/Column/GridContainer/BackgroundPanel/BgPanelButton, + + 'glossary_enabled': $VBoxContainer/TabContainer/Glossary/Column2/GridContainer/ShowGlossaryCheckBox, + + # Audio + 'audio_pickers': { + 'typing': $"VBoxContainer/TabContainer/Audio/Column/Typing", + 'waiting': $"VBoxContainer/TabContainer/Audio/Column2/Waiting", + 'passing': $"VBoxContainer/TabContainer/Audio/Column2/Passing", + 'hovering': $"VBoxContainer/TabContainer/Audio/Column3/Hovering", + 'selecting': $"VBoxContainer/TabContainer/Audio/Column3/Selecting" + }, + + # Text preview + 'text_preview': $"VBoxContainer/VBoxContainer/HBoxContainer3/TextEdit", + 'character_picker': $"VBoxContainer/VBoxContainer/HBoxContainer/CharacterPicker", +} + +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## GENERAL EDITOR STUFF +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +func _ready() -> void: + editor_reference = find_parent('EditorView') + AudioServer.connect("bus_layout_changed", self, "_on_bus_layout_changed") + # Signal connection to free up some memory + connect("visibility_changed", self, "_on_visibility_changed") + if get_constant("dark_theme", "Editor"): + $"VBoxContainer/VBoxContainer/HBoxContainer3/PreviewButton".icon = load("res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg") + else: + $"VBoxContainer/VBoxContainer/HBoxContainer3/PreviewButton".icon = load("res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg") + + $DelayPreviewTimer.one_shot = true + $DelayPreviewTimer.connect("timeout", self, '_on_DelayPreview_timer_timeout') + + var title_style = $"VBoxContainer/TabContainer/Dialog Text/Column/SectionTitle".get('custom_styles/normal') + title_style.set('bg_color', get_color("prop_category", "Editor")) + + $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont/NameFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont/BoldFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont/ItalicFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont/RegularFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleFont/TitleFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextFont/TextFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraFont/ExtraFontOpen".icon = get_icon("Edit", "EditorIcons") + $"VBoxContainer/TabContainer/Glossary/Column/GridContainer/BackgroundPanel/BGPanelOpen".icon = get_icon("Edit", "EditorIcons") + + n['text_preview'].syntax_highlighting = true + n['text_preview'].add_color_region('[', ']', get_color("axis_z_color", "Editor")) + + # Dialog Text tab + n['theme_text_shadow'].connect('toggled', self, '_on_generic_checkbox', ['text', 'shadow']) + n['single_portrait_mode'].connect('toggled', self, '_on_generic_checkbox', ['settings', 'single_portrait_mode']) + n['theme_text_speed'].connect('value_changed', self, '_on_generic_value_change', ['text','speed']) + n['dont_close_after_last_event'].connect('toggled', self, '_on_generic_checkbox', ['settings', 'dont_close_after_last_event']) + n['text_margin_left'].connect('value_changed', self, '_on_generic_value_change', ['text', 'text_margin_left']) + n['text_margin_top'].connect('value_changed', self, '_on_generic_value_change', ['text', 'text_margin_top']) + n['text_margin_right'].connect('value_changed', self, '_on_generic_value_change', ['text', 'text_margin_right']) + n['text_margin_bottom'].connect('value_changed', self, '_on_generic_value_change', ['text', 'text_margin_bottom']) + + # Dialog Box tab + n['theme_background_color_visible'].connect('toggled', self, '_on_generic_checkbox', ['background', 'use_color']) + n['background_texture_button_visible'].connect('toggled', self, '_on_generic_checkbox', ['background', 'use_image']) + n['background_modulation'].connect('toggled', self, '_on_generic_checkbox', ['background', 'modulation']) + n['background_full_width'].connect('toggled', self, '_on_generic_checkbox', ['background', 'full_width']) + n['animation_show_time'].connect('value_changed', self, '_on_generic_value_change', ['animation', 'show_time']) + + n['ninepatch_margin_left'].connect('value_changed', self, '_on_generic_value_change', ['ninepatch', 'ninepatch_margin_left']) + n['ninepatch_margin_right'].connect('value_changed', self, '_on_generic_value_change', ['ninepatch', 'ninepatch_margin_right']) + n['ninepatch_margin_top'].connect('value_changed', self, '_on_generic_value_change', ['ninepatch', 'ninepatch_margin_top']) + n['ninepatch_margin_bottom'].connect('value_changed', self, '_on_generic_value_change', ['ninepatch', 'ninepatch_margin_bottom']) + + n['box_margin_left'].connect('value_changed', self, '_on_generic_value_change', ['box', 'box_margin_left']) + n['box_margin_top'].connect('value_changed', self, '_on_generic_value_change', ['box', 'box_margin_top']) + n['box_margin_right'].connect('value_changed', self, '_on_generic_value_change', ['box', 'box_margin_right']) + n['box_margin_bottom'].connect('value_changed', self, '_on_generic_value_change', ['box', 'box_margin_bottom']) + + n['next_indicator_scale'].connect('value_changed', self, '_on_generic_value_change', ['next_indicator', 'scale']) + + n['portraits_behind_dialog_box'].connect('toggled', self, '_on_generic_value_change', ['box', 'portraits_behind_dialog_box']) + + # Name tab + n['name_shadow_visible'].connect('toggled', self, '_on_generic_checkbox', ['name', 'shadow_visible']) + n['name_background_visible'].connect('toggled', self, '_on_generic_checkbox', ['name', 'background_visible']) + n['name_image_visible'].connect('toggled', self, '_on_generic_checkbox', ['name', 'image_visible']) + n['name_background_modulation'].connect('toggled', self, '_on_generic_checkbox', ['name', 'modulation']) + + # Buttons tab + n['button_fixed'].connect('toggled', self, '_on_generic_checkbox', ['buttons', 'fixed']) + + # Choice button style modifiers + n['button_normal'].connect('picking_background', self, '_on_ButtonTextureButton_pressed') + n['button_hover'].connect('picking_background', self, '_on_ButtonTextureButton_pressed') + n['button_focus'].connect('picking_background', self, '_on_ButtonTextureButton_pressed') + n['button_pressed'].connect('picking_background', self, '_on_ButtonTextureButton_pressed') + n['button_disabled'].connect('picking_background', self, '_on_ButtonTextureButton_pressed') + + n['button_normal'].connect('style_modified', self, '_on_choice_style_modified') + n['button_hover'].connect('style_modified', self, '_on_choice_style_modified') + n['button_focus'].connect('style_modified', self, '_on_choice_style_modified') + n['button_pressed'].connect('style_modified', self, '_on_choice_style_modified') + n['button_disabled'].connect('style_modified', self, '_on_choice_style_modified') + + n['button_layout'].connect('item_selected', self, '_on_button_layout_selected') + + for button in ['dialog_box_anchor', 'button_position_on_screen', 'alignment']: + var button_positions_popup = n[button].get_popup() + button_positions_popup.clear() + button_positions_popup.add_icon_item( + get_icon("ControlAlignTopLeft", "EditorIcons"), "Top Left", 0) + button_positions_popup.add_icon_item( + get_icon("ControlAlignTopCenter", "EditorIcons"), "Top Center", 1) + button_positions_popup.add_icon_item( + get_icon("ControlAlignTopRight", "EditorIcons"), "Top Right", 2) + button_positions_popup.add_separator() + button_positions_popup.add_icon_item( + get_icon("ControlAlignLeftCenter", "EditorIcons"), "Center Left", 3) + button_positions_popup.add_icon_item( + get_icon("ControlAlignCenter", "EditorIcons"), "Center", 4) + button_positions_popup.add_icon_item( + get_icon("ControlAlignRightCenter", "EditorIcons"), "Center Right", 5) + button_positions_popup.add_separator() + button_positions_popup.add_icon_item( + get_icon("ControlAlignBottomLeft", "EditorIcons"), "Bottom Left", 6) + button_positions_popup.add_icon_item( + get_icon("ControlAlignBottomCenter", "EditorIcons"), "Bottom Center", 7) + button_positions_popup.add_icon_item( + get_icon("ControlAlignBottomRight", "EditorIcons"), "Bottom Right", 8) + + + n['button_position_on_screen'].connect('item_selected', self, '_on_button_anchor_selected') + n['dialog_box_anchor'].connect('item_selected', self, '_on_button_dialogbox_anchor_selected') + n['alignment'].connect('item_selected', self, '_on_Alignment_item_selected') + + n['button_offset_x'].connect('value_changed', self, '_on_button_offset_changed') + n['button_offset_y'].connect('value_changed', self, '_on_button_offset_changed') + + + n['name_position'].text = 'Left' + n['name_position'].connect('item_selected', self, '_on_name_position_selected') + var name_positions_popup = n['name_position'].get_popup() + name_positions_popup.clear() + name_positions_popup.add_radio_check_item('Left') + name_positions_popup.add_radio_check_item('Center') + name_positions_popup.add_radio_check_item('Right') + n['name_position'].select(0) + + # Glossary tab + n['glossary_enabled'].connect('toggled', self, '_on_generic_checkbox', ['definitions','show_glossary']) + + # Audio tab + for name in n['audio_pickers']: + n['audio_pickers'][name].connect('data_updated', self, '_on_audio_data_updated') + + # Character Picker + n['character_picker'].connect('item_selected', self, 'character_picker_selected') + + ## Translation + $"VBoxContainer/VBoxContainer/HBoxContainer3/PreviewButton".text = " "+editor_reference.dialogicTranslator.translate('Preview changes') + $VBoxContainer/TabContainer.set_tab_title(0, editor_reference.dialogicTranslator.translate('DialogTextTabTitle')) + $VBoxContainer/TabContainer.set_tab_title(1, editor_reference.dialogicTranslator.translate('DialogBoxTabTitle')) + $VBoxContainer/TabContainer.set_tab_title(2, editor_reference.dialogicTranslator.translate('NameLabelTabTitle')) + $VBoxContainer/TabContainer.set_tab_title(3, editor_reference.dialogicTranslator.translate('ChoiceButtonTabTitle')) + $VBoxContainer/TabContainer.set_tab_title(4, editor_reference.dialogicTranslator.translate('GlossaryTabTitle')) + $VBoxContainer/TabContainer.set_tab_title(5, editor_reference.dialogicTranslator.translate('AudioTabTitle')) + + + # Force preview update + _on_visibility_changed() + + +func character_picker_update(): + n['character_picker'].clear() + n['character_picker'].add_item('Random Character') + n['character_picker'].set_item_metadata(0, 'random') + + var characters : Array = DialogicUtil.get_character_list() + var character_array = [] + for c in characters: + if 'theme' in c['data']: + if c['data']['theme'] == '': + character_array.append(c) + elif c['data']['theme'] == current_theme: + character_array.append(c) + else: + pass + else: + pass + + var index = 1 + for c in character_array: + n['character_picker'].add_item(c['name']) + n['character_picker'].set_item_metadata(index, c['file']) + index += 1 + + + + +func character_picker_selected(index): + preview_character_selected = n['character_picker'].get_item_metadata(index) + n['character_picker'].text = n['character_picker'].get_item_text(index) + _on_PreviewButton_pressed() + + +func load_theme(filename): + loading = true + current_theme = filename + character_picker_update() + var theme = DialogicResources.get_theme_config(filename) + var default_background = 'res://addons/dialogic/Example Assets/backgrounds/background-2.png' + # Settings + n['single_portrait_mode'].pressed = theme.get_value('settings', 'single_portrait_mode', false) # Currently in Dialog Text tab + n['dont_close_after_last_event'].pressed = theme.get_value('settings', 'dont_close_after_last_event', false) + + n['animation_dim_color'].color = Color(theme.get_value('animation', 'dim_color', '#ff808080')) + n['animation_dim_time'].value = theme.get_value('animation', 'dim_time', 0.5) + + # Background + n['theme_background_image'].text = DialogicResources.get_filename_from_path(theme.get_value('background', 'image', default_background)) + n['background_texture_button_visible'].pressed = theme.get_value('background', 'use_image', true) + n['theme_background_color'].color = Color(theme.get_value('background', 'color', '#ff000000')) + n['theme_background_color_visible'].pressed = theme.get_value('background', 'use_color', false) + n['theme_next_image'].text = DialogicResources.get_filename_from_path(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png')) + n['next_indicator_scale'].value = theme.get_value('next_indicator', 'scale', 0.4) + var next_indicator_offset = theme.get_value('next_indicator', 'offset', Vector2(13,10)) + n['next_indicator_offset_x'].value = next_indicator_offset.x + n['next_indicator_offset_y'].value = next_indicator_offset.y + + n['background_modulation'].pressed = theme.get_value('background', 'modulation', false) + n['background_modulation_color'].color = Color(theme.get_value('background', 'modulation_color', '#ffffffff')) + n['background_full_width'].pressed = theme.get_value('background', 'full_width', false) + n['portraits_behind_dialog_box'].pressed = theme.get_value('box', 'portraits_behind_dialog_box', true) + + var size_value = theme.get_value('box', 'size', Vector2(910, 167)) + n['size_w'].value = size_value.x + n['size_h'].value = size_value.y + n['dialog_box_anchor'].select(theme.get_value('box', 'anchor', 9)) + # TODO: remove backups in 2.0 + + n['ninepatch_margin_left'].value = theme.get_value('ninepatch', 'ninepatch_margin_left', theme.get_value('ninepatch', 'ninepatch_margin_left', 0)) + n['ninepatch_margin_right'].value = theme.get_value('ninepatch', 'ninepatch_margin_right', theme.get_value('ninepatch', 'ninepatch_margin_right', 0)) + n['ninepatch_margin_top'].value = theme.get_value('ninepatch', 'ninepatch_margin_top', theme.get_value('ninepatch', 'ninepatch_margin_top', 0)) + n['ninepatch_margin_bottom'].value = theme.get_value('ninepatch', 'ninepatch_margin_bottom', theme.get_value('ninepatch', 'ninepatch_margin_bottom', 0)) + + n['box_margin_left'].value = theme.get_value('box', 'box_margin_left', theme.get_value('box', 'box_margin_left', 40)) + n['box_margin_top'].value = theme.get_value('box', 'box_margin_top', theme.get_value('box', 'box_margin_top', 40)) + n['box_margin_right'].value = theme.get_value('box', 'box_margin_right', theme.get_value('box', 'box_margin_right', -40)) + n['box_margin_bottom'].value = theme.get_value('box', 'box_margin_bottom', theme.get_value('box', 'box_margin_bottom', -40)) + + # Buttons + n['button_padding_x'].value = theme.get_value('buttons', 'padding', Vector2(5,5)).x + n['button_padding_y'].value = theme.get_value('buttons', 'padding', Vector2(5,5)).y + n['button_separation'].value = theme.get_value('buttons', 'gap', 5) + n['button_fixed'].pressed = theme.get_value('buttons', 'fixed', false) + n['button_fixed_x'].value = theme.get_value('buttons', 'fixed_size', Vector2(130,40)).x + n['button_fixed_y'].value = theme.get_value('buttons', 'fixed_size', Vector2(130,40)).y + + n['button_layout'].selected = theme.get_value('buttons', 'layout', 0) + n['button_position_on_screen'].selected = theme.get_value('buttons', 'anchor', 5) + + n['button_offset_x'].value = theme.get_value('buttons', 'offset', Vector2(0,0)).x + n['button_offset_y'].value = theme.get_value('buttons', 'offset', Vector2(0,0)).y + + + var default_style = [false, Color.white, false, Color.black, true, default_background, false, Color.white] + var hover_style = [true, Color( 0.698039, 0.698039, 0.698039, 1 ), false, Color.black, true, default_background, false, Color.white] + n['button_normal'].load_style(theme.get_value('buttons', 'normal', default_style)) + n['button_hover'].load_style(theme.get_value('buttons', 'hover', hover_style)) + n['button_focus'].load_style(theme.get_value('buttons', 'focus', hover_style)) + n['button_pressed'].load_style(theme.get_value('buttons', 'pressed', default_style)) + n['button_disabled'].load_style(theme.get_value('buttons', 'disabled', default_style)) + + toggle_button_customization_fields(theme.get_value('buttons', 'use_native', false), theme.get_value('buttons', 'use_custom', false)) + + # Definitions + n['glossary_highlight_color'].color = Color(theme.get_value('definitions', 'color', "#ffffffff")) + + n['glossary_title_font'].text = DialogicResources.get_filename_from_path(theme.get_value('definitions', 'font', "res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres")) + n['glossary_title_color'].color = Color(theme.get_value('definitions', 'title_color', "#ffffffff")) + + n['glossary_text_font'].text = DialogicResources.get_filename_from_path(theme.get_value('definitions', 'text_font', "res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres")) + n['glossary_text_color'].color = Color(theme.get_value('definitions', 'text_color', "#ffffffff")) + + n['glossary_extra_font'].text = DialogicResources.get_filename_from_path(theme.get_value('definitions', 'extra_font', "res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres")) + n['glossary_extra_color'].color = Color(theme.get_value('definitions', 'extra_color', "#ffffffff")) + + n['glossary_background_panel'].text = DialogicResources.get_filename_from_path(theme.get_value('definitions', 'background_panel', "res://addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres")) + + n['glossary_enabled'].pressed = theme.get_value('definitions', 'show_glossary', true) + + # Text + n['theme_text_speed'].value = theme.get_value('text','speed', 2) + n['theme_font'].text = DialogicResources.get_filename_from_path(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres')) + n['theme_font_bold'].text = DialogicResources.get_filename_from_path(theme.get_value('text', 'bold_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres')) + n['theme_font_italic'].text = DialogicResources.get_filename_from_path(theme.get_value('text', 'italic_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres')) + n['theme_text_color'].color = Color(theme.get_value('text', 'color', '#ffffffff')) + n['theme_text_shadow'].pressed = theme.get_value('text', 'shadow', false) + n['theme_text_shadow_color'].color = Color(theme.get_value('text', 'shadow_color', '#9e000000')) + n['theme_shadow_offset_x'].value = theme.get_value('text', 'shadow_offset', Vector2(2,2)).x + n['theme_shadow_offset_y'].value = theme.get_value('text', 'shadow_offset', Vector2(2,2)).y + n['text_margin_left'].value = theme.get_value('text', 'text_margin_left', 20) + n['text_margin_top'].value = theme.get_value('text', 'text_margin_top', 10) + n['text_margin_right'].value = theme.get_value('text', 'text_margin_right', -20) + n['text_margin_bottom'].value = theme.get_value('text', 'text_margin_bottom', -10) + n['alignment'].select(n['alignment'].get_item_index(theme.get_value('text', 'alignment', 0))) + + + # Name + n['name_hidden'].pressed = theme.get_value('name', 'is_hidden', false) + n['name_font'].text = DialogicResources.get_filename_from_path(theme.get_value('name', 'font', 'res://addons/dialogic/Example Assets/Fonts/NameFont.tres')) + n['name_auto_color'].pressed = theme.get_value('name', 'auto_color', true) + n['name_background_visible'].pressed = theme.get_value('name', 'background_visible', false) + n['name_background'].color = Color(theme.get_value('name', 'background', "#ff000000")) + n['name_image_visible'].pressed = theme.get_value('name', 'image_visible', false) + + n['name_image'].text = DialogicResources.get_filename_from_path(theme.get_value('name', 'image', 'res://addons/dialogic/Example Assets/backgrounds/background-2.png')) + n['name_background_modulation'].pressed = theme.get_value('name', 'modulation', false) + n['name_background_modulation_color'].color = Color(theme.get_value('name', 'modulation_color', '#ffffffff')) + + n['name_padding_x'].value = theme.get_value('name', 'name_padding', Vector2(10,0)).x + n['name_padding_y'].value = theme.get_value('name', 'name_padding', Vector2(10,0)).y + + n['name_shadow'].color = Color(theme.get_value('name', 'shadow', "#9e000000")) + n['name_shadow_visible'].pressed = theme.get_value('name', 'shadow_visible', true) + n['name_shadow_offset_x'].value = theme.get_value('name', 'shadow_offset', Vector2(2,2)).x + n['name_shadow_offset_y'].value = theme.get_value('name', 'shadow_offset', Vector2(2,2)).y + n['name_bottom_gap'].value = theme.get_value('name', 'bottom_gap', 48) + n['name_horizontal_offset'].value = theme.get_value('name', 'horizontal_offset', 0) + + n['name_position'].select(theme.get_value('name', 'position', 0)) + + # Audio + var default_audio_file = "res://addons/dialogic/Example Assets/Sound Effects/Beep.wav" + var default_audio_data = { + 'enable': false, + 'path': default_audio_file, + 'volume': 0.0, + 'volume_rand_range': 0.0, + 'pitch': 1.0, + 'pitch_rand_range': 0.0, + 'allow_interrupt': true, + 'audio_bus': AudioServer.get_bus_name(0) + } + + for name in n['audio_pickers']: + n['audio_pickers'][name].set_data(theme.get_value('audio', name, default_audio_data)) + + # Next indicator animations + var animations = ['Up and down', 'Pulse', 'Static'] # TODO: dynamically get all the animations from the Dialog.tscn NextIndicator + n['next_animation'].clear() + var next_animation_selected = theme.get_value('next_indicator', 'animation', 'Up and down') + var nix = 0 + for a in animations: + n['next_animation'].add_item(a) + if a == next_animation_selected: + n['next_animation'].select(nix) + nix += 1 + + # Preview text + n['text_preview'].text = theme.get_value('text', 'preview', 'This is preview text. You can use [color=#A5EFAC]BBCode[/color] to style it.\n[wave amp=50 freq=2]You can even use effects![/wave]') + + # Finished loading + loading = false + # Updating the preview + _on_PreviewButton_pressed() + # Update name fields + _update_name_fields_editable() + + +func create_theme() -> String: + var theme_file : String = 'theme-' + str(OS.get_unix_time()) + '.cfg' + DialogicResources.add_theme(theme_file) + load_theme(theme_file) + # Check if it is the only theme to set as default + if DialogicUtil.get_theme_list().size() == 1: + #print('only theme, setting as default') + settings_editor.set_value('theme', 'default', theme_file) + return theme_file + + +func duplicate_theme(from_filename) -> void: + var duplicate_theme : String = 'theme-' + str(OS.get_unix_time()) + '.cfg' + DialogicResources.duplicate_theme(from_filename, duplicate_theme) + DialogicResources.set_theme_value(duplicate_theme, 'settings', 'name', duplicate_theme) + master_tree.build_themes(duplicate_theme) + load_theme(duplicate_theme) + + +func _on_visibility_changed() -> void: + if visible: + # Refreshing the dialog + if not loading: _on_PreviewButton_pressed() + if first_time_loading_theme_full_size_bug == 0: + yield(get_tree().create_timer(0.01), "timeout") + for i in $VBoxContainer/Panel.get_children(): + i.resize_main() + first_time_loading_theme_full_size_bug += 1 + else: + # Erasing all previews since them keeps working on background + for i in $VBoxContainer/Panel.get_children(): + i.queue_free() + +func _update_name_fields_editable() -> void: + var hide_name_labels = n['name_hidden'].pressed + + # Disable all other fieds if the 'name_hidden' field is enabled + n['name_font'].disabled = hide_name_labels + n['name_auto_color'].disabled = hide_name_labels + n['name_shadow'].disabled = hide_name_labels + n['name_shadow_visible'].disabled = hide_name_labels + n['name_shadow_offset_x'].editable = not hide_name_labels + n['name_shadow_offset_y'].editable = not hide_name_labels + n['name_background_visible'].disabled = hide_name_labels + n['name_background'].disabled = hide_name_labels + n['name_image_visible'].disabled = hide_name_labels + n['name_image'].disabled = hide_name_labels + n['name_background_modulation'].disabled = hide_name_labels + n['name_background_modulation_color'].disabled = hide_name_labels + n['name_padding_x'].editable = not hide_name_labels + n['name_padding_y'].editable = not hide_name_labels + n['name_position'].disabled = hide_name_labels + n['name_horizontal_offset'].editable = not hide_name_labels + n['name_bottom_gap'].editable = not hide_name_labels + + $"VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont/NameFontOpen".disabled = hide_name_labels + +## ------------ Preview ------------------------------------ + +func _on_DelayPreview_timer_timeout() -> void: + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_PreviewButton_pressed() -> void: + for i in $VBoxContainer/Panel.get_children(): + i.free() + var preview_dialog = Dialogic.start('', '', "res://addons/dialogic/Nodes/DialogNode.tscn", false) + preview_dialog.preview = true + + if n['character_picker']: # Sometimes it can't find the node + if n['character_picker'].text == 'Random Character': + var characters : Array = DialogicUtil.get_character_list() + var character_array = [] + for c in characters: + if 'theme' in c['data']: + if c['data']['theme'] == '': + character_array.append(c) + elif c['data']['theme'] == current_theme: + character_array.append(c) + + if character_array.size(): + character_array.shuffle() + preview_character_selected = character_array[0]['file'] + + preview_dialog.dialog_script = { + "events":[ + { 'event_id':'dialogic_024', "set_theme": current_theme }, + { 'event_id':'dialogic_001', "character": preview_character_selected, "portrait":"", "text":n['text_preview'].text } + ] + } + preview_dialog.dialog_script = DialogicParser.parse_characters(preview_dialog.dialog_script) + $VBoxContainer/Panel.add_child(preview_dialog) + + # maintaining the preview panel big enough for the dialog box + var box_size = preview_dialog.current_theme.get_value('box', 'size', Vector2(910, 167)).y + var bottom_gap = preview_dialog.current_theme.get_value('box', 'bottom_gap', 40) + var top_gap = preview_dialog.current_theme.get_value('box', 'bottom_gap', 40) + var extra = 90 + $VBoxContainer/Panel.rect_min_size.y = box_size + extra + bottom_gap + $VBoxContainer/Panel.rect_size.y = 0 + preview_dialog.call_deferred('resize_main') + + +func _on_Preview_text_changed() -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text', 'preview', n['text_preview'].text) + +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +## THEME OPTIONS +## ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## ------------ GENERICS + +func _on_generic_checkbox(button_pressed, section, key, update_preview = true) -> void: + # Many methods here are the same, so I want to replace all those instances + # with this generic checkbox logic. TODO + if loading: + return + DialogicResources.set_theme_value(current_theme, section, key, button_pressed) + if update_preview: + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_generic_value_change(value, section, key, update_preview = true) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, section, key, value) + if update_preview: + _on_PreviewButton_pressed() # Refreshing the preview + + +## ------------ DIALOG TEXT TAB ------------------------------------ + +# Fonts +func _on_FontButton_pressed() -> void: + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_Font_selected") + + +func _on_Font_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text','font', path) + n['theme_font'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_FontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres'))) + + +func _on_BoldFontButton_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_BoldFont_selected") + + +func _on_BoldFont_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text','bold_font', path) + n['theme_font_bold'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_BoldFontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('text', 'bold_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres'))) + + +func _on_ItalicFontButton_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_ItalicFont_selected") + + +func _on_ItalicFont_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text', 'italic_font', path) + n['theme_font_italic'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_ItalicFontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('text', 'italic_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres'))) + + +func _on_NameFont_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_NameFont_selected") + + +func _on_NameFont_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'font', path) + n['name_font'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_NameFontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('name', 'font', 'res://addons/dialogic/Example Assets/Fonts/NameFont.tres'))) + + +func _on_Alignment_item_selected(index) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text', 'alignment', n['alignment'].get_item_id(index)) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_ColorPickerButton_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text','color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +func _on_ColorPickerButtonShadow_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text','shadow_color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +func _on_ShadowOffset_value_changed(_value) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'text','shadow_offset', Vector2(n['theme_shadow_offset_x'].value,n['theme_shadow_offset_y'].value)) + _on_PreviewButton_pressed() # Refreshing the preview + + +## ------------ DIALOG BOX TAB ------------------------------------ + +func _on_BoxSize_value_changed(value) -> void: + if loading: + return + var size_value = Vector2(n['size_w'].value, n['size_h'].value) + DialogicResources.set_theme_value(current_theme, 'box', 'size', size_value) + _on_PreviewButton_pressed() # Refreshing the preview + +func _on_button_dialogbox_anchor_selected(index): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'box', 'anchor', index) + _on_PreviewButton_pressed() # Refreshing the preview + + +# Background Texture +func _on_BackgroundTextureButton_pressed() -> void: + editor_reference.godot_dialog("*.png") + editor_reference.godot_dialog_connect(self, "_on_background_selected") + + +func _on_background_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'background','image', path) + n['theme_background_image'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_ColorPicker_Background_texture_modulation_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'background', 'modulation_color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + +# Background Color +func _on_BackgroundColor_ColorPickerButton_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'background', 'color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + +# Dim Color +func _on_DimColor_ColorPickerButton_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'animation', 'dim_color', '#' + color.to_html()) + +#Fade Time +func _on_PortraitDimTime_value_changed(value): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'animation', 'dim_time', value) + + +# Next indicator +func _on_NextIndicatorButton_pressed() -> void: + editor_reference.godot_dialog("*.png") + editor_reference.godot_dialog_connect(self, "_on_indicator_selected") + + +func _on_indicator_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'next_indicator','image', path) + n['theme_next_image'].text = DialogicResources.get_filename_from_path(path) + # Since people will probably want the sprite on fresh values and the default + # ones are for the custom dialogic theme, I reset the next indicator properties + # here so they can set the scale and offset they want. + DialogicResources.set_theme_value(current_theme, 'next_indicator', 'scale', 1) + DialogicResources.set_theme_value(current_theme, 'offset', 'scale', Vector2(10,10)) + n['next_indicator_scale'].value = 1 + n['next_indicator_offset_x'].value = 10 + n['next_indicator_offset_y'].value = 10 + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_NextAnimation_item_selected(index) -> void: + DialogicResources.set_theme_value(current_theme, 'next_indicator', 'animation', n['next_animation'].get_item_text(index)) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_NextOffset_value_changed(value): + if loading: + return + var offset_value = Vector2(n['next_indicator_offset_x'].value, n['next_indicator_offset_y'].value) + DialogicResources.set_theme_value(current_theme, 'next_indicator', 'offset', offset_value) + _on_PreviewButton_pressed() # Refreshing the preview + + +## ------------ NAME LABEL TAB ------------------------------------ + +# Text Visibility +func _on_name_hide_toggled(button_pressed) -> void: + if loading: + return + + DialogicResources.set_theme_value(current_theme, 'name', 'is_hidden', button_pressed) + _on_PreviewButton_pressed() # Refreshing the preview + _update_name_fields_editable() + +# Text Color +func _on_name_auto_color_toggled(button_pressed) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'auto_color', button_pressed) + _on_PreviewButton_pressed() # Refreshing the preview + + +# Background Color +func _on_name_background_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'background', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +# Background Texture +func _on_name_image_pressed() -> void: + editor_reference.godot_dialog("*.png") + editor_reference.godot_dialog_connect(self, "_on_name_texture_selected") + + +func _on_name_texture_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'image', path) + n['name_image'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_ColorPicker_NameLabel_modulation_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'modulation_color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +func _on_name_shadow_color_changed(color) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'shadow', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +func _on_name_ShadowOffset_value_changed(_value) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name','shadow_offset', + Vector2(n['name_shadow_offset_x'].value, n['name_shadow_offset_y'].value)) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_name_padding_value_changed(_value) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name','name_padding', + Vector2(n['name_padding_x'].value, n['name_padding_y'].value)) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_name_BottomGap_value_changed(value) -> void: + if loading: + return + # Todo in 2.0: Replace for a single Vector2 instead of two variables + DialogicResources.set_theme_value(current_theme, 'name', 'bottom_gap', n['name_bottom_gap'].value) + DialogicResources.set_theme_value(current_theme, 'name', 'horizontal_offset', n['name_horizontal_offset'].value) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_name_position_selected(index): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'name', 'position', index) + _on_PreviewButton_pressed() # Refreshing the preview + +## ------------ CHOICE BUTTON TAB -------------------------------- +func _on_ButtonSize_value_changed(value): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons','fixed_size', Vector2(n['button_fixed_x'].value,n['button_fixed_y'].value)) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_ButtonOffset_value_changed(value) -> void: + if loading: + return + var final_vector = Vector2( + n['button_padding_x'].value, + n['button_padding_y'].value + ) + DialogicResources.set_theme_value(current_theme, 'buttons', 'padding', final_vector) + + +func _on_button_layout_selected(index): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons', 'layout', index) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_button_anchor_selected(index): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons', 'anchor', index) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_button_offset_changed(_value): + if loading: + return + var offset_vector = Vector2(n['button_offset_x'].value, n['button_offset_y'].value) + DialogicResources.set_theme_value(current_theme, 'buttons', 'offset', offset_vector) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_VerticalSeparation_value_changed(value) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons', 'gap', n['button_separation'].value) + + +# Background Texture +func _on_button_texture_toggled(button_pressed) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons', 'use_image', button_pressed) + + +func _on_ButtonTextureButton_pressed(section = '') -> void: + editor_reference.godot_dialog("*.png") + if section != '': + # Special modifier + current_choice_modifier_selected = section + editor_reference.godot_dialog_connect(self, "_on_modifier_button_image_selected") + + +func _on_modifier_button_image_selected(path, _target): + if loading: + return + n['button_' + current_choice_modifier_selected].set_path(path) + n['button_' + current_choice_modifier_selected].real_file_path = path + n['button_' + current_choice_modifier_selected].get_node('BackgroundTexture/Button').text = DialogicResources.get_filename_from_path(path) + _on_choice_style_modified(current_choice_modifier_selected) + + +func _on_choice_style_modified(section): + DialogicResources.set_theme_value(current_theme, 'buttons', section, n['button_' + section].get_style_array()) + +func _on_native_button_toggled(button_pressed) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons', 'use_native', button_pressed) + toggle_button_customization_fields(button_pressed, false) + + +func toggle_button_customization_fields(native_enabled: bool, custom_enabled: bool) -> void: + var customization_disabled = native_enabled or custom_enabled + n['button_padding_x'].editable = not customization_disabled + n['button_padding_y'].editable = not customization_disabled + + +func _on_CustomButtonsCheckBox_toggled(button_pressed): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'buttons', 'use_custom', button_pressed) + toggle_button_customization_fields(false, button_pressed) + + +func _on_CustomButtonsButton_pressed(): + editor_reference.godot_dialog("*.tscn") + editor_reference.godot_dialog_connect(self, "_on_custom_button_selected") + + +## ------------ GLOSSARY TAB ------------------------------------ + +## TITLE FONT +func _on_Glossary_TitleFontButton_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_Glossary_TitleFont_selected") + + +func _on_Glossary_TitleFontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('definitions', 'font', 'res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres'))) + + +func _on_Glossary_TitleFont_selected(path, target) -> void: + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'font', path) + n['glossary_title_font'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_Glossary_TitleColorPicker_color_changed(color): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'title_color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +## TEXT +func _on_Glossary_TextFontButton_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_Glossary_TextFont_selected") + + +func _on_Glossary_TextFont_selected(path, target): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'text_font', path) + n['glossary_text_font'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_Glossary_TextFontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('definitions', 'text_font', 'res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres'))) + + +func _on_Glossary_TextColorPicker_color_changed(color): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'text_color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +## EXTRA FONT +func _on_Glossary_ExtraFontButton_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_Glossary_ExtraFont_selected") + + +func _on_Glossary_ExtraFont_selected(path, target): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'extra_font', path) + n['glossary_extra_font'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + + +func _on_Glossary_ExtraFontOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('definitions', 'extra_font', 'res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres'))) + + +func _on_Glossary_ExtraColorPicker_color_changed(color): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'extra_color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + + +## HIGHLIGHT COLOR +func _on_Glossary_HighlightColorPicker_color_changed(color): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'color', '#' + color.to_html()) + $DelayPreviewTimer.start(0.5) # Calling a timer so the update doesn't get triggered many times + +## BACKGROUNDPANEL + + +func _on_BgPanelSelection_pressed(): + editor_reference.godot_dialog("*.tres") + editor_reference.godot_dialog_connect(self, "_on_Glossary_BackgroundPanel_selected") + + +func _on_BGPanelOpen_pressed(): + var theme = DialogicResources.get_theme_config(current_theme) + editor_reference.editor_interface.inspect_object(load(theme.get_value('definitions', 'background_panel', 'res://addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres'))) + + +func _on_Glossary_BackgroundPanel_selected(path, target): + if loading: + return + DialogicResources.set_theme_value(current_theme, 'definitions', 'background_panel', path) + n['glossary_background_panel'].text = DialogicResources.get_filename_from_path(path) + _on_PreviewButton_pressed() # Refreshing the preview + +## ------------ AUDIO TAB ------------------------------------ +func _on_audio_data_updated(section): + DialogicResources.set_theme_value(current_theme, 'audio', section, n['audio_pickers'][section].get_data()) + _on_PreviewButton_pressed() + + diff --git a/project/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn b/project/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn new file mode 100644 index 0000000..9c2cea2 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/ThemeEditor.tscn @@ -0,0 +1,2204 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/ThemeEditor.gd" type="Script" id=2] +[ext_resource path="res://addons/dialogic/Editor/Common/SectionTitle.tscn" type="PackedScene" id=3] +[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/ButtonStylePicker.tscn" type="PackedScene" id=6] +[ext_resource path="res://addons/dialogic/Editor/ThemeEditor/AudioPicker.tscn" type="PackedScene" id=7] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=8] + +[sub_resource type="Image" id=9] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=8] +flags = 4 +flags = 4 +image = SubResource( 9 ) +size = Vector2( 16, 16 ) + +[sub_resource type="Image" id=10] +data = { +"data": PoolByteArray( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ), +"format": "LumAlpha8", +"height": 16, +"mipmaps": false, +"width": 16 +} + +[sub_resource type="ImageTexture" id=6] +flags = 4 +flags = 4 +image = SubResource( 10 ) +size = Vector2( 16, 16 ) + +[node name="ThemeEditor" type="ScrollContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = -6.0 +margin_bottom = 311.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 1018.0 +margin_bottom = 911.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 15 + +[node name="Panel" type="Panel" parent="VBoxContainer"] +margin_right = 1018.0 +margin_bottom = 290.0 +rect_min_size = Vector2( 0, 290 ) + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer"] +margin_top = 305.0 +margin_right = 1018.0 +margin_bottom = 389.0 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] +margin_right = 1018.0 +margin_bottom = 20.0 + +[node name="CharacterPicker" type="OptionButton" parent="VBoxContainer/VBoxContainer/HBoxContainer"] +margin_right = 145.0 +margin_bottom = 20.0 +text = "Random Character" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/VBoxContainer"] +margin_top = 24.0 +margin_right = 1018.0 +margin_bottom = 84.0 +custom_constants/separation = 10 + +[node name="TextEdit" type="TextEdit" parent="VBoxContainer/VBoxContainer/HBoxContainer3"] +margin_right = 864.0 +margin_bottom = 60.0 +rect_min_size = Vector2( 400, 60 ) +size_flags_horizontal = 3 +text = "This is [i]preview[/i] text. You can use [color=#A5EFAC]BBCode[/color] to [b]style[/b] it. +[wave amp=50 freq=2]You can even use effects![/wave]" +syntax_highlighting = true +wrap_enabled = true + +[node name="PreviewButton" type="Button" parent="VBoxContainer/VBoxContainer/HBoxContainer3"] +margin_left = 874.0 +margin_right = 1018.0 +margin_bottom = 60.0 +text = " Preview changes" +icon = ExtResource( 1 ) + +[node name="TabContainer" type="TabContainer" parent="VBoxContainer"] +margin_top = 404.0 +margin_right = 1018.0 +margin_bottom = 911.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +tab_align = 0 +all_tabs_in_front = true +drag_to_rearrange_enabled = true + +[node name="Dialog Text" type="HBoxContainer" parent="VBoxContainer/TabContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +custom_constants/separation = 10 +__meta__ = { +"_tab_name": "Dialog Text" +} + +[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"] +margin_right = 270.0 +margin_bottom = 471.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Text/Column" instance=ExtResource( 3 )] +text = "Fonts" +text_key = "Fonts" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 100.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 4.0 +margin_right = 79.0 +margin_bottom = 18.0 +text = "Regular Font" +text_key = "Regular Font" + +[node name="RegularFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer"] +margin_left = 89.0 +margin_right = 239.0 +margin_bottom = 22.0 + +[node name="RegularFontButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont"] +margin_top = 1.0 +margin_right = 118.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultFont" + +[node name="RegularFontOpen" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont"] +margin_left = 122.0 +margin_right = 150.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 30.0 +margin_right = 79.0 +margin_bottom = 44.0 +text = "Bold Font" +text_key = "Bold Font" + +[node name="BoldFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer"] +margin_left = 89.0 +margin_top = 26.0 +margin_right = 239.0 +margin_bottom = 48.0 + +[node name="BoldFontButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont"] +margin_top = 1.0 +margin_right = 118.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultBoldFont" + +[node name="BoldFontOpen" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont"] +margin_left = 122.0 +margin_right = 150.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 56.0 +margin_right = 79.0 +margin_bottom = 70.0 +text = "Italic Font" +text_key = "Italic Font" + +[node name="ItalicFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer"] +margin_left = 89.0 +margin_top = 52.0 +margin_right = 239.0 +margin_bottom = 74.0 + +[node name="ItalicFontButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont"] +margin_top = 1.0 +margin_right = 118.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultItalicFont" + +[node name="ItalicFontOpen" type="Button" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont"] +margin_left = 122.0 +margin_right = 150.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="SectionTitle2" parent="VBoxContainer/TabContainer/Dialog Text/Column" instance=ExtResource( 3 )] +margin_top = 104.0 +margin_bottom = 126.0 +text = "Margin" +text_key = "Margin" + +[node name="GridContainer2" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column"] +margin_top = 130.0 +margin_right = 270.0 +margin_bottom = 238.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel7" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 95.0 +margin_bottom = 19.0 +text = "Margin Left" +text_key = "Margin Left" + +[node name="MarginLeft" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] +margin_left = 105.0 +margin_right = 179.0 +margin_bottom = 24.0 +min_value = -999.0 +max_value = 999.0 +value = 20.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel9" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 95.0 +margin_bottom = 47.0 +text = "Margin Top" +text_key = "Margin Top" + +[node name="MarginTop" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] +margin_left = 105.0 +margin_top = 28.0 +margin_right = 179.0 +margin_bottom = 52.0 +min_value = -999.0 +max_value = 999.0 +value = 10.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel10" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 95.0 +margin_bottom = 75.0 +text = "Margin Right" +text_key = "Margin Right" + +[node name="MarginRight" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] +margin_left = 105.0 +margin_top = 56.0 +margin_right = 179.0 +margin_bottom = 80.0 +min_value = -999.0 +max_value = 999.0 +value = -20.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel11" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 89.0 +margin_right = 95.0 +margin_bottom = 103.0 +text = "Margin Bottom" +text_key = "Margin Bottom" + +[node name="MarginBottom" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer2"] +margin_left = 105.0 +margin_top = 84.0 +margin_right = 179.0 +margin_bottom = 108.0 +min_value = -999.0 +max_value = 999.0 +value = -10.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Text"] +margin_left = 280.0 +margin_right = 284.0 +margin_bottom = 471.0 + +[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"] +margin_left = 294.0 +margin_right = 564.0 +margin_bottom = 471.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Text/Column2" instance=ExtResource( 3 )] +text = "Colors" +text_key = "Colors" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column2"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 118.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 8.0 +margin_right = 91.0 +margin_bottom = 22.0 +text = "Text Color" +text_key = "Text Color" + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer"] +margin_left = 101.0 +margin_right = 259.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 50, 30 ) +color = Color( 1, 1, 1, 1 ) + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 42.0 +margin_right = 91.0 +margin_bottom = 56.0 +text = "Shadow" +text_key = "Shadow" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer"] +margin_left = 101.0 +margin_top = 34.0 +margin_right = 259.0 +margin_bottom = 64.0 + +[node name="CheckBoxShadow" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2"] +margin_right = 24.0 +margin_bottom = 30.0 + +[node name="ColorPickerButtonShadow" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2"] +margin_left = 28.0 +margin_right = 158.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 50, 30 ) +size_flags_horizontal = 3 +color = Color( 0, 0, 0, 0.619608 ) + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 73.0 +margin_right = 91.0 +margin_bottom = 87.0 +text = "Shadow Offset" +text_key = "Shadow Offset" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer"] +margin_left = 101.0 +margin_top = 68.0 +margin_right = 259.0 +margin_bottom = 92.0 +custom_constants/separation = 10 + +[node name="ShadowOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer"] +margin_right = 74.0 +margin_bottom = 24.0 +value = 2.0 +rounded = true +allow_lesser = true +prefix = "X" + +[node name="ShadowOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer"] +margin_left = 84.0 +margin_right = 158.0 +margin_bottom = 24.0 +value = 2.0 +rounded = true +allow_lesser = true +prefix = "Y" + +[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Text"] +margin_left = 574.0 +margin_right = 578.0 +margin_bottom = 471.0 + +[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text"] +margin_left = 588.0 +margin_right = 873.0 +margin_bottom = 471.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Text/Column3" instance=ExtResource( 3 )] +margin_right = 285.0 +text = "Behaviour" +text_key = "Behaviour" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column3"] +margin_top = 26.0 +margin_right = 285.0 +margin_bottom = 132.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 177.0 +margin_bottom = 19.0 +text = "Speed (bigger = slower)" +text_key = "Speed (bigger = slower)" + +[node name="TextSpeed" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] +margin_left = 187.0 +margin_right = 285.0 +margin_bottom = 24.0 +max_value = 10.0 +step = 0.01 +value = 2.0 + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 32.0 +margin_right = 177.0 +margin_bottom = 46.0 +text = "Alignment" +text_key = "Alignment" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] +margin_left = 187.0 +margin_top = 28.0 +margin_right = 285.0 +margin_bottom = 50.0 + +[node name="Alignment" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer/HBoxContainer3"] +margin_right = 98.0 +margin_bottom = 22.0 +size_flags_horizontal = 3 +text = "Top Left" +icon = SubResource( 6 ) +items = [ "Top Left", SubResource( 8 ), false, 0, null, "Top Center", SubResource( 8 ), false, 1, null, "Top Right", SubResource( 8 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 8 ), false, 3, null, "Center", SubResource( 8 ), false, 4, null, "Center Right", SubResource( 8 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 8 ), false, 6, null, "Bottom Center", SubResource( 8 ), false, 7, null, "Bottom Right", SubResource( 8 ), false, 8, null ] +selected = 0 + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 59.0 +margin_right = 177.0 +margin_bottom = 73.0 +text = "Single Portrait Mode" +text_key = "Single Portrait Mode" + +[node name="SinglePortraitModeCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] +margin_left = 187.0 +margin_top = 54.0 +margin_right = 285.0 +margin_bottom = 78.0 + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 87.0 +margin_right = 177.0 +margin_bottom = 101.0 +text = "Don't Close After Last Event" +text_key = "Don't Close After Last Event" + +[node name="DontCloseAfterLastEventCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Text/Column3/GridContainer"] +margin_left = 187.0 +margin_top = 82.0 +margin_right = 285.0 +margin_bottom = 106.0 + +[node name="Dialog Box" type="HBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +custom_constants/separation = 10 +__meta__ = { +"_tab_name": "Dialog Box" +} + +[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"] +margin_right = 319.0 +margin_bottom = 615.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Box/Column" instance=ExtResource( 3 )] +margin_right = 319.0 +text_key = "Visuals" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column"] +margin_top = 26.0 +margin_right = 319.0 +margin_bottom = 162.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 157.0 +margin_bottom = 19.0 +text = "Background Color" +text_key = "Background Color" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] +margin_left = 167.0 +margin_right = 319.0 +margin_bottom = 24.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2"] +margin_left = 28.0 +margin_right = 152.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 157.0 +margin_bottom = 47.0 +text = "Background Texture" +text_key = "Background Texture" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] +margin_left = 167.0 +margin_top = 28.0 +margin_right = 319.0 +margin_bottom = 52.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3"] +margin_right = 24.0 +margin_bottom = 24.0 +pressed = true + +[node name="BackgroundTextureButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3"] +margin_left = 28.0 +margin_right = 152.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +text = "background-2" + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 157.0 +margin_bottom = 75.0 +text = "Texture Modulation" +text_key = "Texture Modulation" + +[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] +margin_left = 167.0 +margin_top = 56.0 +margin_right = 319.0 +margin_bottom = 80.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6"] +margin_left = 28.0 +margin_right = 152.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="TLabel6" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 89.0 +margin_right = 157.0 +margin_bottom = 103.0 +text = "9-Patch Margin Left/Right" +text_key = "9-Patch Margin Left/Right" + +[node name="NinePatchBoxLeftRight" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] +margin_left = 167.0 +margin_top = 84.0 +margin_right = 319.0 +margin_bottom = 108.0 + +[node name="PatchMarginLeft" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxLeftRight"] +margin_right = 74.0 +margin_bottom = 24.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="PatchMarginRight" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxLeftRight"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +max_value = 999.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel7" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 117.0 +margin_right = 157.0 +margin_bottom = 131.0 +text = "9-Patch Margin Top/Bottom" +text_key = "9-Patch Margin Top/Bottom" + +[node name="NinePatchBoxTopBottom" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer"] +margin_left = 167.0 +margin_top = 112.0 +margin_right = 319.0 +margin_bottom = 136.0 + +[node name="PatchMarginTop" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxTopBottom"] +margin_right = 74.0 +margin_bottom = 24.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="PatchMarginBottom" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/NinePatchBoxTopBottom"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +max_value = 999.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="SectionTitle2" parent="VBoxContainer/TabContainer/Dialog Box/Column" instance=ExtResource( 3 )] +margin_top = 166.0 +margin_right = 319.0 +margin_bottom = 188.0 +text = "Size and Position" +text_key = "Size and Position" + +[node name="GridContainer2" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column"] +margin_top = 136.0 +margin_right = 270.0 +margin_bottom = 326.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 104.0 +margin_bottom = 19.0 +text = "Full width" +text_key = "Full width" + +[node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_right = 266.0 +margin_bottom = 24.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer7"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="TLabel6" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 104.0 +margin_bottom = 47.0 +text = "Box size (pixels)" +text_key = "Box size (pixels)" + +[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_top = 28.0 +margin_right = 266.0 +margin_bottom = 52.0 + +[node name="BoxSizeW" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4"] +margin_right = 74.0 +margin_bottom = 24.0 +value = 100.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="BoxSizeH" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +max_value = 999.0 +value = 167.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel8" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 60.0 +margin_right = 104.0 +margin_bottom = 74.0 +text = "Position" +text_key = "Position" + +[node name="PositionSelector" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_top = 56.0 +margin_right = 266.0 +margin_bottom = 78.0 +text = "Top Left" +icon = SubResource( 6 ) +items = [ "Top Left", SubResource( 8 ), false, 0, null, "Top Center", SubResource( 8 ), false, 1, null, "Top Right", SubResource( 8 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 8 ), false, 3, null, "Center", SubResource( 8 ), false, 4, null, "Center Right", SubResource( 8 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 8 ), false, 6, null, "Bottom Center", SubResource( 8 ), false, 7, null, "Bottom Right", SubResource( 8 ), false, 8, null ] +selected = 0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel7" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 87.0 +margin_right = 104.0 +margin_bottom = 101.0 +text = "Margin Left" +text_key = "Margin Left" + +[node name="MarginLeft" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_top = 82.0 +margin_right = 266.0 +margin_bottom = 106.0 +min_value = -999.0 +max_value = 999.0 +value = 40.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel9" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 115.0 +margin_right = 104.0 +margin_bottom = 129.0 +text = "Margin Top" +text_key = "Margin Top" + +[node name="MarginTop" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_top = 110.0 +margin_right = 266.0 +margin_bottom = 134.0 +min_value = -999.0 +max_value = 999.0 +value = 40.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel10" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 143.0 +margin_right = 104.0 +margin_bottom = 157.0 +text = "Margin Right" +text_key = "Margin Right" + +[node name="MarginRight" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_top = 138.0 +margin_right = 266.0 +margin_bottom = 162.0 +min_value = -999.0 +max_value = 999.0 +value = -40.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel11" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 171.0 +margin_right = 104.0 +margin_bottom = 185.0 +text = "Margin Bottom" +text_key = "Margin Bottom" + +[node name="MarginBottom" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2"] +margin_left = 114.0 +margin_top = 166.0 +margin_right = 266.0 +margin_bottom = 190.0 +min_value = -999.0 +max_value = 999.0 +value = -40.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Box"] +margin_left = 329.0 +margin_right = 333.0 +margin_bottom = 615.0 + +[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"] +margin_left = 343.0 +margin_right = 613.0 +margin_bottom = 615.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Box/Column2" instance=ExtResource( 3 )] +text = "Next Indicator" +text_key = "Next Indicator" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 126.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 66.0 +margin_bottom = 17.0 +text = "Image" +text_key = "Image" + +[node name="NextIndicatorButton" type="Button" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] +margin_left = 76.0 +margin_right = 228.0 +margin_bottom = 20.0 +text = "next-indicator" + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 27.0 +margin_right = 66.0 +margin_bottom = 41.0 +text = "Animation" +text_key = "Animation" + +[node name="NextAnimation" type="OptionButton" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] +margin_left = 76.0 +margin_top = 24.0 +margin_right = 228.0 +margin_bottom = 44.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 53.0 +margin_right = 66.0 +margin_bottom = 67.0 +text = "Scale" +text_key = "Scale" + +[node name="HBoxContainer7" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] +margin_left = 76.0 +margin_top = 48.0 +margin_right = 228.0 +margin_bottom = 72.0 + +[node name="IndicatorScale" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer7"] +margin_right = 74.0 +margin_bottom = 24.0 +max_value = 999.0 +step = 0.1 +value = 1.0 +allow_greater = true +allow_lesser = true + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 81.0 +margin_right = 66.0 +margin_bottom = 95.0 +text = "Offset" +text_key = "Offset" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer"] +margin_left = 76.0 +margin_top = 76.0 +margin_right = 228.0 +margin_bottom = 100.0 + +[node name="NextOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2"] +margin_right = 74.0 +margin_bottom = 24.0 +max_value = 1e+07 +value = 10.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="NextOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +max_value = 1e+07 +value = 20.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Dialog Box"] +margin_left = 623.0 +margin_right = 627.0 +margin_bottom = 615.0 + +[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box"] +margin_left = 637.0 +margin_right = 907.0 +margin_bottom = 615.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Dialog Box/Column3" instance=ExtResource( 3 )] +text = "Behaviour" +text_key = "Behaviour" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 130.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 175.0 +margin_bottom = 19.0 +text = "Fade in time:" +text_key = "Fade in time:" + +[node name="ShowTime" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] +margin_left = 185.0 +margin_right = 259.0 +margin_bottom = 24.0 + +[node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/ShowTime"] +margin_right = 74.0 +margin_bottom = 24.0 +max_value = 999.0 +step = 0.1 +value = 0.5 +allow_greater = true + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 31.0 +margin_right = 175.0 +margin_bottom = 45.0 +text = "Portraits Dim Color" +text_key = "Portraits Dim Color" + +[node name="DimColor" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] +margin_left = 185.0 +margin_top = 28.0 +margin_right = 259.0 +margin_bottom = 48.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/DimColor"] +margin_right = 74.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +color = Color( 0.501961, 0.501961, 0.501961, 1 ) + +[node name="TLabel5" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 57.0 +margin_right = 175.0 +margin_bottom = 71.0 +text = "Portrait Dim time:" +text_key = "Portrait Dim time:" + +[node name="PortraitDimTime" type="HBoxContainer" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] +margin_left = 185.0 +margin_top = 52.0 +margin_right = 259.0 +margin_bottom = 76.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SpinBox" type="SpinBox" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/PortraitDimTime"] +margin_right = 74.0 +margin_bottom = 24.0 +max_value = 999.0 +step = 0.1 +value = 0.5 +allow_greater = true + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 85.0 +margin_right = 175.0 +margin_bottom = 99.0 +text = "Portraits Behind Dialog Box" +text_key = "Portraits Behind Dialog Box" + +[node name="PortraitsBehindDialogCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer"] +margin_left = 185.0 +margin_top = 80.0 +margin_right = 259.0 +margin_bottom = 104.0 + +[node name="Name Label" type="HBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +custom_constants/separation = 10 +__meta__ = { +"_tab_name": "Name Label" +} + +[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"] +margin_right = 287.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column"] +margin_right = 287.0 +margin_bottom = 50.0 + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer" instance=ExtResource( 3 )] +margin_right = 287.0 +text = "Behaviour" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer"] +margin_top = 26.0 +margin_right = 287.0 +margin_bottom = 50.0 +columns = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 112.0 +margin_bottom = 19.0 +text = "Hide name labels" +text_key = "Hide name labels" + +[node name="NameHide" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer/GridContainer"] +margin_left = 116.0 +margin_right = 140.0 +margin_bottom = 24.0 + +[node name="VBoxContainer2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column"] +margin_top = 54.0 +margin_right = 287.0 +margin_bottom = 192.0 + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2" instance=ExtResource( 3 )] +margin_right = 287.0 +text = "Text" +text_key = "Text" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2"] +margin_top = 26.0 +margin_right = 287.0 +margin_bottom = 138.0 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 4.0 +margin_right = 125.0 +margin_bottom = 18.0 +text = "Name label Font" +text_key = "Name label Font" + +[node name="RegularFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] +margin_left = 129.0 +margin_right = 287.0 +margin_bottom = 22.0 + +[node name="NameFontButton" type="Button" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont"] +margin_top = 1.0 +margin_right = 126.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultFont" + +[node name="NameFontOpen" type="Button" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont"] +margin_left = 130.0 +margin_right = 158.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 31.0 +margin_right = 125.0 +margin_bottom = 45.0 +text = "Use character Color" +text_key = "Use character Color" + +[node name="CharacterColor" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] +margin_left = 129.0 +margin_top = 26.0 +margin_right = 287.0 +margin_bottom = 50.0 + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 62.0 +margin_right = 125.0 +margin_bottom = 76.0 +text = "Shadow" +text_key = "Shadow" + +[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] +margin_left = 129.0 +margin_top = 54.0 +margin_right = 287.0 +margin_bottom = 84.0 + +[node name="CheckBoxShadow" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4"] +margin_right = 24.0 +margin_bottom = 30.0 + +[node name="ColorPickerButtonShadow" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4"] +margin_left = 28.0 +margin_right = 158.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 50, 30 ) +size_flags_horizontal = 3 +color = Color( 0, 0, 0, 0.619608 ) + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 93.0 +margin_right = 125.0 +margin_bottom = 107.0 +text = "Shadow Offset" +text_key = "Shadow Offset" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer"] +margin_left = 129.0 +margin_top = 88.0 +margin_right = 287.0 +margin_bottom = 112.0 +custom_constants/separation = 10 + +[node name="ShadowOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer"] +margin_right = 74.0 +margin_bottom = 24.0 +value = 2.0 +rounded = true +allow_lesser = true +prefix = "X" + +[node name="ShadowOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer"] +margin_left = 84.0 +margin_right = 158.0 +margin_bottom = 24.0 +value = 2.0 +rounded = true +allow_lesser = true +prefix = "Y" + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Name Label"] +margin_left = 297.0 +margin_right = 301.0 +margin_bottom = 495.0 + +[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"] +margin_left = 311.0 +margin_right = 599.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column2" instance=ExtResource( 3 )] +margin_right = 288.0 +text = "Box" +text_key = "Box" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column2"] +margin_top = 26.0 +margin_right = 288.0 +margin_bottom = 134.0 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 126.0 +margin_bottom = 19.0 +text = "Background Color" +text_key = "Background Color" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] +margin_left = 130.0 +margin_right = 288.0 +margin_bottom = 24.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2"] +margin_left = 28.0 +margin_right = 158.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 126.0 +margin_bottom = 47.0 +text = "Background Texture" +text_key = "Background Texture" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] +margin_left = 130.0 +margin_top = 28.0 +margin_right = 288.0 +margin_bottom = 52.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3"] +margin_right = 24.0 +margin_bottom = 24.0 +pressed = true + +[node name="BackgroundTextureButton" type="Button" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3"] +margin_left = 28.0 +margin_right = 158.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 +text = "background-2" + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 126.0 +margin_bottom = 75.0 +text = "Texture Modulation" +text_key = "Texture Modulation" + +[node name="HBoxContainer6" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] +margin_left = 130.0 +margin_top = 56.0 +margin_right = 288.0 +margin_bottom = 80.0 + +[node name="CheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ColorPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6"] +margin_left = 28.0 +margin_right = 158.0 +margin_bottom = 24.0 +size_flags_horizontal = 3 + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 89.0 +margin_right = 126.0 +margin_bottom = 103.0 +text = "Box Padding" +text_key = "Box Padding" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer"] +margin_left = 130.0 +margin_top = 84.0 +margin_right = 288.0 +margin_bottom = 108.0 +custom_constants/separation = 10 + +[node name="NamePaddingX" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer"] +margin_right = 74.0 +margin_bottom = 24.0 +step = 0.1 +value = 10.0 +allow_greater = true +allow_lesser = true + +[node name="NamePaddingY" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer"] +margin_left = 84.0 +margin_right = 158.0 +margin_bottom = 24.0 +step = 0.1 +allow_greater = true +allow_lesser = true + +[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Name Label"] +margin_left = 609.0 +margin_right = 613.0 +margin_bottom = 495.0 + +[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Name Label"] +margin_left = 623.0 +margin_right = 893.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Name Label/Column3" instance=ExtResource( 3 )] +text = "Placement" +text_key = "Placement" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Name Label/Column3"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 74.0 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 3.0 +margin_right = 52.0 +margin_bottom = 17.0 +text = "Position" +text_key = "Position" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer"] +margin_left = 56.0 +margin_right = 208.0 +margin_bottom = 20.0 + +[node name="Positions" type="OptionButton" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer"] +margin_right = 152.0 +margin_bottom = 20.0 +size_flags_horizontal = 3 +text = "Left" +items = [ "Left", null, false, -1, null, "Center", null, false, 0, null, "Right", null, false, 1, null ] +selected = 0 + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 29.0 +margin_right = 52.0 +margin_bottom = 43.0 +text = "Offset" +text_key = "Offset" + +[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer"] +margin_left = 56.0 +margin_top = 24.0 +margin_right = 208.0 +margin_bottom = 48.0 + +[node name="HorizontalOffset" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5"] +margin_right = 74.0 +margin_bottom = 24.0 +step = 0.1 +allow_greater = true +allow_lesser = true + +[node name="BottomGap" type="SpinBox" parent="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +step = 0.1 +value = 48.0 +allow_greater = true +allow_lesser = true + +[node name="Choice Buttons" type="HBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +custom_constants/separation = 10 +__meta__ = { +"_tab_name": "Choice Buttons" +} + +[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons"] +margin_right = 380.0 +margin_bottom = 488.0 +rect_min_size = Vector2( 380, 0 ) +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Choice Buttons/Column" instance=ExtResource( 3 )] +margin_right = 380.0 +text = "Button Style" +text_key = "Button Style" + +[node name="TabContainer" type="TabContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column"] +margin_top = 26.0 +margin_right = 380.0 +margin_bottom = 170.0 +tab_align = 0 + +[node name="Normal" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="Hover" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="Focus" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="Pressed" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="Disabled" parent="VBoxContainer/TabContainer/Choice Buttons/Column/TabContainer" instance=ExtResource( 6 )] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Choice Buttons"] +margin_left = 390.0 +margin_right = 394.0 +margin_bottom = 488.0 + +[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons"] +margin_left = 404.0 +margin_right = 713.0 +margin_bottom = 488.0 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Choice Buttons/Column2" instance=ExtResource( 3 )] +margin_right = 309.0 +text = "Placement" +text_key = "Placement" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2"] +margin_top = 26.0 +margin_right = 309.0 +margin_bottom = 184.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 119.0 +margin_bottom = 19.0 +text = "Box padding" +text_key = "Box padding" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] +margin_left = 129.0 +margin_right = 309.0 +margin_bottom = 24.0 + +[node name="TextOffsetV" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer"] +margin_right = 74.0 +margin_bottom = 24.0 +value = 5.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TextOffsetH" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +value = 5.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 33.0 +margin_right = 119.0 +margin_bottom = 47.0 +text = "Fixed button size" +text_key = "Fixed button size" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] +margin_left = 129.0 +margin_top = 28.0 +margin_right = 309.0 +margin_bottom = 52.0 + +[node name="FixedSize" type="CheckBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"] +margin_right = 24.0 +margin_bottom = 24.0 + +[node name="ButtonSizeX" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"] +margin_left = 28.0 +margin_right = 102.0 +margin_bottom = 24.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="ButtonSizeY" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2"] +margin_left = 106.0 +margin_right = 180.0 +margin_bottom = 24.0 +rounded = true +allow_greater = true +allow_lesser = true + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 61.0 +margin_right = 119.0 +margin_bottom = 75.0 +text = "Separation" +text_key = "Separation" + +[node name="VerticalSeparation" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] +margin_left = 129.0 +margin_top = 56.0 +margin_right = 309.0 +margin_bottom = 80.0 +value = 5.0 +rounded = true +allow_lesser = true + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 87.0 +margin_right = 119.0 +margin_bottom = 101.0 +text = "Button layout" +text_key = "Button layout" + +[node name="Layout" type="OptionButton" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] +margin_left = 129.0 +margin_top = 84.0 +margin_right = 309.0 +margin_bottom = 104.0 +size_flags_horizontal = 3 +text = "Vertical" +items = [ "Vertical", null, false, 0, null, "Horizontal", null, false, 1, null ] +selected = 0 + +[node name="TLabel5" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 112.0 +margin_right = 119.0 +margin_bottom = 126.0 +text = "Position on screen" +text_key = "Position on screen" + +[node name="PositionOnScreenOptionButton" type="OptionButton" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] +margin_left = 129.0 +margin_top = 108.0 +margin_right = 309.0 +margin_bottom = 130.0 +size_flags_horizontal = 3 +text = "Top Left" +icon = SubResource( 6 ) +items = [ "Top Left", SubResource( 8 ), false, 0, null, "Top Center", SubResource( 8 ), false, 1, null, "Top Right", SubResource( 8 ), false, 2, null, "", null, false, -1, null, "Center Left", SubResource( 8 ), false, 3, null, "Center", SubResource( 8 ), false, 4, null, "Center Right", SubResource( 8 ), false, 5, null, "", null, false, -1, null, "Bottom Left", SubResource( 8 ), false, 6, null, "Bottom Center", SubResource( 8 ), false, 7, null, "Bottom Right", SubResource( 8 ), false, 8, null ] +selected = 0 + +[node name="TLabel6" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 139.0 +margin_right = 119.0 +margin_bottom = 153.0 +text = "Offset x-y" +text_key = "Offset x-y" + +[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer"] +margin_left = 129.0 +margin_top = 134.0 +margin_right = 309.0 +margin_bottom = 158.0 + +[node name="ButtonOffsetX" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer3"] +margin_right = 74.0 +margin_bottom = 24.0 +rounded = true +allow_lesser = true + +[node name="ButtonOffsetY" type="SpinBox" parent="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer3"] +margin_left = 78.0 +margin_right = 152.0 +margin_bottom = 24.0 +rounded = true +allow_lesser = true + +[node name="Glossary" type="HBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +custom_constants/separation = 10 +__meta__ = { +"_tab_name": "Glossary" +} + +[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Glossary"] +margin_right = 270.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Glossary/Column" instance=ExtResource( 3 )] +text_key = "Visuals" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Glossary/Column"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 82.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Glossary/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 8.0 +margin_right = 116.0 +margin_bottom = 22.0 +text = "Word color" +text_key = "Word color" + +[node name="HighlightColorPicker" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Glossary/Column/GridContainer"] +margin_left = 126.0 +margin_right = 244.0 +margin_bottom = 30.0 +rect_min_size = Vector2( 50, 30 ) +color = Color( 0.215686, 0.654902, 0.67451, 1 ) + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Glossary/Column/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 38.0 +margin_right = 116.0 +margin_bottom = 52.0 +text = "Background Panel" +text_key = "Background Panel" + +[node name="BackgroundPanel" type="HBoxContainer" parent="VBoxContainer/TabContainer/Glossary/Column/GridContainer"] +margin_left = 126.0 +margin_top = 34.0 +margin_right = 244.0 +margin_bottom = 56.0 + +[node name="BgPanelButton" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column/GridContainer/BackgroundPanel"] +margin_top = 1.0 +margin_right = 86.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultFont" + +[node name="BGPanelOpen" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column/GridContainer/BackgroundPanel"] +margin_left = 90.0 +margin_right = 118.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Glossary"] +margin_left = 280.0 +margin_right = 284.0 +margin_bottom = 495.0 + +[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Glossary"] +margin_left = 294.0 +margin_right = 564.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Glossary/Column3" instance=ExtResource( 3 )] +text = "Text" +text_key = "Text" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Glossary/Column3"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 202.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 4.0 +margin_right = 89.0 +margin_bottom = 18.0 +text = "Title Font" +text_key = "Title Font" + +[node name="TitleFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer"] +margin_left = 99.0 +margin_right = 217.0 +margin_bottom = 22.0 + +[node name="TitleFontButton" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleFont"] +margin_top = 1.0 +margin_right = 86.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultFont" + +[node name="TitleFontOpen" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleFont"] +margin_left = 90.0 +margin_right = 118.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="TLabel2" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 34.0 +margin_right = 89.0 +margin_bottom = 48.0 +text = "Title color" +text_key = "Title color" + +[node name="TitleColorPicker" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer"] +margin_left = 99.0 +margin_top = 26.0 +margin_right = 217.0 +margin_bottom = 56.0 +rect_min_size = Vector2( 50, 30 ) +color = Color( 0.215686, 0.654902, 0.67451, 1 ) + +[node name="TLabel3" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 64.0 +margin_right = 89.0 +margin_bottom = 78.0 +text = "Text Font" +text_key = "Text Font" + +[node name="TextFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer"] +margin_left = 99.0 +margin_top = 60.0 +margin_right = 217.0 +margin_bottom = 82.0 + +[node name="TextFontButton" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextFont"] +margin_top = 1.0 +margin_right = 86.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultFont" + +[node name="TextFontOpen" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextFont"] +margin_left = 90.0 +margin_right = 118.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="TLabel4" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 94.0 +margin_right = 89.0 +margin_bottom = 108.0 +text = "Text color" +text_key = "Text color" + +[node name="TextColorPicker" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer"] +margin_left = 99.0 +margin_top = 86.0 +margin_right = 217.0 +margin_bottom = 116.0 +rect_min_size = Vector2( 50, 30 ) +color = Color( 0.215686, 0.654902, 0.67451, 1 ) + +[node name="TLabel5" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 124.0 +margin_right = 89.0 +margin_bottom = 138.0 +text = "Extra Font" +text_key = "Extra Font" + +[node name="ExtraFont" type="HBoxContainer" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer"] +margin_left = 99.0 +margin_top = 120.0 +margin_right = 217.0 +margin_bottom = 142.0 + +[node name="ExtraFontButton" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraFont"] +margin_top = 1.0 +margin_right = 86.0 +margin_bottom = 21.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +text = "DefaultFont" + +[node name="ExtraFontOpen" type="Button" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraFont"] +margin_left = 90.0 +margin_right = 118.0 +margin_bottom = 22.0 +size_flags_vertical = 4 +icon = SubResource( 8 ) + +[node name="TLabel6" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 154.0 +margin_right = 89.0 +margin_bottom = 168.0 +text = "Extra color" +text_key = "Extra color" + +[node name="ExtraColorPicker" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Glossary/Column3/GridContainer"] +margin_left = 99.0 +margin_top = 146.0 +margin_right = 217.0 +margin_bottom = 176.0 +rect_min_size = Vector2( 50, 30 ) +color = Color( 0.215686, 0.654902, 0.67451, 1 ) + +[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Glossary"] +margin_left = 574.0 +margin_right = 578.0 +margin_bottom = 495.0 + +[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Glossary"] +margin_left = 588.0 +margin_right = 858.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Glossary/Column2" instance=ExtResource( 3 )] +text = "Behaviour" +text_key = "Behaviour" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer/TabContainer/Glossary/Column2"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 50.0 +size_flags_horizontal = 3 +custom_constants/hseparation = 10 +columns = 2 + +[node name="TLabel" parent="VBoxContainer/TabContainer/Glossary/Column2/GridContainer" instance=ExtResource( 8 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_top = 5.0 +margin_right = 59.0 +margin_bottom = 19.0 +text = "Show" +text_key = "Show" + +[node name="ShowGlossaryCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Glossary/Column2/GridContainer"] +margin_left = 69.0 +margin_right = 93.0 +margin_bottom = 24.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Audio" type="HBoxContainer" parent="VBoxContainer/TabContainer"] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 4.0 +margin_top = 32.0 +margin_right = -4.0 +margin_bottom = -4.0 +custom_constants/separation = 10 +__meta__ = { +"_tab_name": "Audio" +} + +[node name="Column" type="VBoxContainer" parent="VBoxContainer/TabContainer/Audio"] +margin_right = 270.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Audio/Column" instance=ExtResource( 3 )] +text = "Typing Sound Effects" +text_key = "Typing Sound Effects" + +[node name="Typing" parent="VBoxContainer/TabContainer/Audio/Column" instance=ExtResource( 7 )] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 158.0 + +[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Audio"] +margin_left = 280.0 +margin_right = 284.0 +margin_bottom = 495.0 + +[node name="Column2" type="VBoxContainer" parent="VBoxContainer/TabContainer/Audio"] +margin_left = 294.0 +margin_right = 564.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Audio/Column2" instance=ExtResource( 3 )] +text = "Next Sound Effects" +text_key = "Next Sound Effects" + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Audio/Column2"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 40.0 +text = "Waiting" +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Waiting" parent="VBoxContainer/TabContainer/Audio/Column2" instance=ExtResource( 7 )] +margin_top = 44.0 +margin_right = 270.0 +margin_bottom = 176.0 + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Audio/Column2"] +margin_top = 180.0 +margin_right = 270.0 +margin_bottom = 184.0 + +[node name="Label2" type="Label" parent="VBoxContainer/TabContainer/Audio/Column2"] +margin_top = 188.0 +margin_right = 270.0 +margin_bottom = 202.0 +text = "Passing" +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Passing" parent="VBoxContainer/TabContainer/Audio/Column2" instance=ExtResource( 7 )] +margin_top = 206.0 +margin_right = 270.0 +margin_bottom = 338.0 + +[node name="VSeparator2" type="VSeparator" parent="VBoxContainer/TabContainer/Audio"] +margin_left = 574.0 +margin_right = 578.0 +margin_bottom = 495.0 + +[node name="Column3" type="VBoxContainer" parent="VBoxContainer/TabContainer/Audio"] +margin_left = 588.0 +margin_right = 858.0 +margin_bottom = 495.0 +rect_min_size = Vector2( 270, 0 ) + +[node name="SectionTitle" parent="VBoxContainer/TabContainer/Audio/Column3" instance=ExtResource( 3 )] +text = "Choice Sound Effects" +text_key = "Choice Sound Effects" + +[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Audio/Column3"] +margin_top = 26.0 +margin_right = 270.0 +margin_bottom = 40.0 +text = "Hovering" +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Hovering" parent="VBoxContainer/TabContainer/Audio/Column3" instance=ExtResource( 7 )] +margin_top = 44.0 +margin_right = 270.0 +margin_bottom = 176.0 + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Audio/Column3"] +margin_top = 180.0 +margin_right = 270.0 +margin_bottom = 184.0 + +[node name="Label2" type="Label" parent="VBoxContainer/TabContainer/Audio/Column3"] +margin_top = 188.0 +margin_right = 270.0 +margin_bottom = 202.0 +text = "Selecting" +align = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Selecting" parent="VBoxContainer/TabContainer/Audio/Column3" instance=ExtResource( 7 )] +margin_top = 206.0 +margin_right = 270.0 +margin_bottom = 338.0 + +[node name="DelayPreviewTimer" type="Timer" parent="."] +one_shot = true + +[connection signal="text_changed" from="VBoxContainer/VBoxContainer/HBoxContainer3/TextEdit" to="." method="_on_Preview_text_changed"] +[connection signal="pressed" from="VBoxContainer/VBoxContainer/HBoxContainer3/PreviewButton" to="." method="_on_PreviewButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont/RegularFontButton" to="." method="_on_FontButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/RegularFont/RegularFontOpen" to="." method="_on_FontOpen_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont/BoldFontButton" to="." method="_on_BoldFontButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/BoldFont/BoldFontOpen" to="." method="_on_BoldFontOpen_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont/ItalicFontButton" to="." method="_on_ItalicFontButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Text/Column/GridContainer/ItalicFont/ItalicFontOpen" to="." method="_on_ItalicFontOpen_pressed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/ColorPickerButton" to="." method="_on_ColorPickerButton_color_changed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer2/ColorPickerButtonShadow" to="." method="_on_ColorPickerButtonShadow_color_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer/ShadowOffsetX" to="." method="_on_ShadowOffset_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Text/Column2/GridContainer/HBoxContainer/ShadowOffsetY" to="." method="_on_ShadowOffset_value_changed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer2/ColorPickerButton" to="." method="_on_BackgroundColor_ColorPickerButton_color_changed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer3/BackgroundTextureButton" to="." method="_on_BackgroundTextureButton_pressed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer/HBoxContainer6/ColorPickerButton" to="." method="_on_ColorPicker_Background_texture_modulation_color_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4/BoxSizeW" to="." method="_on_BoxSize_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column/GridContainer2/HBoxContainer4/BoxSizeH" to="." method="_on_BoxSize_value_changed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextIndicatorButton" to="." method="_on_NextIndicatorButton_pressed"] +[connection signal="item_selected" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/NextAnimation" to="." method="_on_NextAnimation_item_selected"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetX" to="." method="_on_NextOffset_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column2/GridContainer/HBoxContainer2/NextOffsetY" to="." method="_on_NextOffset_value_changed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/DimColor/ColorPickerButton" to="." method="_on_DimColor_ColorPickerButton_color_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Dialog Box/Column3/GridContainer/PortraitDimTime/SpinBox" to="." method="_on_PortraitDimTime_value_changed"] +[connection signal="toggled" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer/GridContainer/NameHide" to="." method="_on_name_hide_toggled"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont/NameFontButton" to="." method="_on_NameFont_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/RegularFont/NameFontOpen" to="." method="_on_NameFontOpen_pressed"] +[connection signal="toggled" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/CharacterColor" to="." method="_on_name_auto_color_toggled"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer4/ColorPickerButtonShadow" to="." method="_on_name_shadow_color_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer/ShadowOffsetX" to="." method="_on_name_ShadowOffset_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column/VBoxContainer2/GridContainer/HBoxContainer/ShadowOffsetY" to="." method="_on_name_ShadowOffset_value_changed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer2/ColorPickerButton" to="." method="_on_name_background_color_changed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer3/BackgroundTextureButton" to="." method="_on_name_image_pressed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer6/ColorPickerButton" to="." method="_on_ColorPicker_NameLabel_modulation_color_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer/NamePaddingX" to="." method="_on_name_padding_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column2/GridContainer/HBoxContainer/NamePaddingY" to="." method="_on_name_padding_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5/HorizontalOffset" to="." method="_on_name_BottomGap_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Name Label/Column3/GridContainer/HBoxContainer5/BottomGap" to="." method="_on_name_BottomGap_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetV" to="." method="_on_ButtonOffset_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer/TextOffsetH" to="." method="_on_ButtonOffset_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeX" to="." method="_on_ButtonSize_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/HBoxContainer2/ButtonSizeY" to="." method="_on_ButtonSize_value_changed"] +[connection signal="value_changed" from="VBoxContainer/TabContainer/Choice Buttons/Column2/GridContainer/VerticalSeparation" to="." method="_on_VerticalSeparation_value_changed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Glossary/Column/GridContainer/HighlightColorPicker" to="." method="_on_Glossary_HighlightColorPicker_color_changed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column/GridContainer/BackgroundPanel/BgPanelButton" to="." method="_on_BgPanelSelection_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column/GridContainer/BackgroundPanel/BGPanelOpen" to="." method="_on_BGPanelOpen_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleFont/TitleFontButton" to="." method="_on_Glossary_TitleFontButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleFont/TitleFontOpen" to="." method="_on_Glossary_TitleFontOpen_pressed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TitleColorPicker" to="." method="_on_Glossary_TitleColorPicker_color_changed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextFont/TextFontButton" to="." method="_on_Glossary_TextFontButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextFont/TextFontOpen" to="." method="_on_Glossary_TextFontOpen_pressed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/TextColorPicker" to="." method="_on_Glossary_TextColorPicker_color_changed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraFont/ExtraFontButton" to="." method="_on_Glossary_ExtraFontButton_pressed"] +[connection signal="pressed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraFont/ExtraFontOpen" to="." method="_on_Glossary_ExtraFontOpen_pressed"] +[connection signal="color_changed" from="VBoxContainer/TabContainer/Glossary/Column3/GridContainer/ExtraColorPicker" to="." method="_on_Glossary_ExtraColorPicker_color_changed"] diff --git a/project/addons/dialogic/Editor/ThemeEditor/default-theme.cfg b/project/addons/dialogic/Editor/ThemeEditor/default-theme.cfg new file mode 100644 index 0000000..ffc0195 --- /dev/null +++ b/project/addons/dialogic/Editor/ThemeEditor/default-theme.cfg @@ -0,0 +1,3 @@ +[settings] + +name="Default Theme" diff --git a/project/addons/dialogic/Editor/TimelineEditor/EventButton.gd b/project/addons/dialogic/Editor/TimelineEditor/EventButton.gd new file mode 100644 index 0000000..9b1d721 --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/EventButton.gd @@ -0,0 +1,16 @@ +tool +extends Button + +export (String) var EventName = '' + +func get_drag_data(position): + var preview_label = Label.new() + + if (self.text != ''): + preview_label.text = text + else: + preview_label.text = 'Add Event %s' % [ EventName ] + + set_drag_preview(preview_label) + + return { "source": "EventButton", "event_name": EventName } diff --git a/project/addons/dialogic/Editor/TimelineEditor/FlexContainer.gd b/project/addons/dialogic/Editor/TimelineEditor/FlexContainer.gd new file mode 100644 index 0000000..f2e4806 --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/FlexContainer.gd @@ -0,0 +1,119 @@ +tool +extends Container + +# The flow container will fit as many children in a row as it can +# using their minimum size, and will then continue on the next row. +# Does not use SIZE_EXPAND flags of children. + +# TODO: half-respect vertical SIZE_EXPAND flags by expanding the child to match +# the tallest child in that row? +# TODO: Respect scaled children? +# TODO: Can we find a way to intuitively use a child's horizontal SIZE_EXPAND +# flag? + +export var horizontal_margin: float = 5 +export var vertical_margin: float = 5 + +# Used to make our parent re-evaluate our size when we have to create more or +# less rows to fit in all the children. +var _reported_height_at_last_minimum_size_call: float = 0 + + +func _init() -> void: + size_flags_horizontal = SIZE_EXPAND_FILL + + +func _ready(): + pass + + +func _get_minimum_size() -> Vector2: + var max_child_width: float = 0 + + for child in get_children(): + if not child.has_method("get_combined_minimum_size"): + break + + var requested_size: Vector2 = child.get_combined_minimum_size() + if requested_size.x > max_child_width: + max_child_width = requested_size.x + + var height := _calculate_layout(false) + _reported_height_at_last_minimum_size_call = height + + return Vector2(max_child_width, height) + + +func _notification(what): + if (what==NOTIFICATION_SORT_CHILDREN): + var height = _calculate_layout(true) + + if height != _reported_height_at_last_minimum_size_call: + _make_parent_reevaluate_our_size() + +# If apply is true, the children will actually be moved to the calculated +# locations. +# Returns the resulting height. +func _calculate_layout(apply: bool) -> float: + var child_position: Vector2 = Vector2(0, 0) + var row_height: float = 0 + var container_width: float = rect_size.x + var num_children_in_current_row: float = 0 + + for child in get_children(): + if not child.has_method("get_combined_minimum_size"): + continue + if not child.visible: + continue + + var child_min_size: Vector2 = child.get_combined_minimum_size() + + if num_children_in_current_row > 0: + child_position.x += horizontal_margin + + if child_position.x + child_min_size.x > container_width: + # Go to the next row. + child_position = Vector2(0, child_position.y + row_height + vertical_margin) + row_height = 0 + num_children_in_current_row = 0 + + if apply: + fit_child_in_rect(child, Rect2(child_position, child_min_size)) + + if child_min_size.y > row_height: + row_height = child_min_size.y + + child_position.x += child_min_size.x + num_children_in_current_row += 1 + + return child_position.y + row_height + + +func _make_parent_reevaluate_our_size(): + # Hacky solution. Once there is a function for this, use it. + rect_min_size = Vector2(0, 20000) + rect_min_size = Vector2(0, 0) + + +# Code by https://github.com/Wcubed/horizontal_flow_container +# MIT License + +# Copyright (c) 2020 Wybe Westra + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + #SOFTWARE. diff --git a/project/addons/dialogic/Editor/TimelineEditor/SmallEventButton.gd b/project/addons/dialogic/Editor/TimelineEditor/SmallEventButton.gd new file mode 100644 index 0000000..5c71b59 --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/SmallEventButton.gd @@ -0,0 +1,63 @@ +tool +extends Button + +export(String) var visible_name = "" +export (String) var event_id = 'dialogic_099' +export (Color) var event_color = Color('#48a2a2a2') +export(Texture) var event_icon = null setget set_icon +export (int) var event_category := 0 +export (int) var sorting_index := 0 +var editor_reference + +func _ready(): + editor_reference = find_parent('EditorView') + self_modulate = Color(1,1,1) + if visible_name != '': + text = visible_name + hint_tooltip = editor_reference.dialogicTranslator.translate(hint_tooltip) + var _scale = DialogicUtil.get_editor_scale(self) + rect_min_size = Vector2(30,30) + rect_min_size = rect_min_size * _scale + icon = null + var t_rect = $TextureRect + var c_border = $ColorBorder + c_border.self_modulate = event_color + c_border.rect_min_size.x = 5 * _scale + c_border.rect_size.x = 5 * _scale + t_rect.margin_left = 18 * _scale + # Another programming crime was commited + # a switch statement is missing + # what a horrible sight + # elif I have you on my mind + if _scale == 2 or _scale == 1.75: + t_rect.rect_scale = Vector2(1, 1) + elif _scale == 1.5: + t_rect.rect_scale = Vector2(0.8, 0.8) + elif _scale == 0.75: + t_rect.rect_scale = Vector2(0.4, 0.4) + else: + t_rect.rect_scale = Vector2(0.6, 0.6) + + add_color_override("font_color", get_color("font_color", "Editor")) + add_color_override("font_color_hover", get_color("accent_color", "Editor")) + t_rect.modulate = get_color("font_color", "Editor") + + +func set_icon(texture): + #icon = texture + event_icon = texture + var _scale = DialogicUtil.get_editor_scale(self) + $TextureRect.texture = texture + + +func get_drag_data(position): + var preview_label = Label.new() + + if (self.text != ''): + preview_label.text = text + else: + preview_label.text = 'Add Event %s' % [ hint_tooltip ] + + set_drag_preview(preview_label) + + return { "source": "EventButton", "event_id": event_id } diff --git a/project/addons/dialogic/Editor/TimelineEditor/SmallEventButton.tscn b/project/addons/dialogic/Editor/TimelineEditor/SmallEventButton.tscn new file mode 100644 index 0000000..0d166cb --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/SmallEventButton.tscn @@ -0,0 +1,70 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/SmallEventButton.gd" type="Script" id=1] + +[sub_resource type="StyleBoxEmpty" id=3] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 1, 1, 1, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 1, 1, 1, 0 ) +corner_radius_top_left = 4 +corner_radius_bottom_left = 4 + +[sub_resource type="StyleBoxFlat" id=2] +draw_center = false +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.0980392, 0.0980392, 0.0980392, 0.784314 ) +corner_radius_top_left = 4 +corner_radius_top_right = 4 +corner_radius_bottom_right = 4 +corner_radius_bottom_left = 4 + +[node name="SmallEventButton" type="Button"] +margin_right = 40.0 +margin_bottom = 40.0 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +custom_colors/font_color_hover = Color( 0, 0, 0, 1 ) +custom_styles/focus = SubResource( 3 ) +flat = true +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorBorder" type="Panel" parent="."] +self_modulate = Color( 0.635294, 0.635294, 0.635294, 0.282353 ) +show_behind_parent = true +anchor_bottom = 1.0 +mouse_filter = 2 +custom_styles/panel = SubResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Border" type="Panel" parent="."] +show_behind_parent = true +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +custom_styles/panel = SubResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +modulate = Color( 0, 0, 0, 1 ) +anchor_top = 0.5 +anchor_bottom = 0.5 +margin_left = 18.0 +rect_scale = Vector2( 0.6, 0.6 ) +size_flags_horizontal = 0 +size_flags_vertical = 0 +expand = true +stretch_mode = 4 diff --git a/project/addons/dialogic/Editor/TimelineEditor/TimelineArea.gd b/project/addons/dialogic/Editor/TimelineEditor/TimelineArea.gd new file mode 100644 index 0000000..a5dc4dc --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/TimelineArea.gd @@ -0,0 +1,209 @@ +tool +extends ScrollContainer + +# store last attempts since godot sometimes misses drop events +var _is_drag_receiving = false +var _last_event_button_drop_attempt = '' +var _mouse_exited = false + +# todo, getting timeline like this is prone to fail someday +onready var timeline_editor = get_parent() + +func _ready(): + connect("mouse_entered", self, '_on_mouse_entered') + connect("mouse_exited", self, '_on_mouse_exited') + connect("gui_input", self, '_on_gui_input') + + +func can_drop_data(position, data): + if data != null and data is Dictionary and data.has("source"): + if data["source"] == "EventButton": + if _last_event_button_drop_attempt.empty(): + timeline_editor.create_drag_and_drop_event(data["event_id"]) + _is_drag_receiving = true + _last_event_button_drop_attempt = data["event_id"] + return true + return false + + +func cancel_drop(): + _is_drag_receiving = false + _last_event_button_drop_attempt = '' + timeline_editor.cancel_drop_event() + + +func drop_data(position, data): + # add event + if (data["source"] == "EventButton"): + timeline_editor.drop_event() + _is_drag_receiving = false + _last_event_button_drop_attempt = '' + + +func _on_mouse_exited(): + if _is_drag_receiving and not _mouse_exited: + var preview_label = Label.new() + preview_label.text = "Cancel" + set_drag_preview(preview_label) + _mouse_exited = true + + +func _on_mouse_entered(): + if _is_drag_receiving and _mouse_exited: + var preview_label = Label.new() + preview_label.text = "Insert Event" + set_drag_preview(preview_label) + _mouse_exited = false + + +func _input(event): + if (event is InputEventMouseButton and is_visible_in_tree() and event.button_index == BUTTON_LEFT): + if (_mouse_exited and _is_drag_receiving): + cancel_drop() + + +func _on_gui_input(event): + # godot sometimes misses drop events + if (event is InputEventMouseButton and event.button_index == BUTTON_LEFT): + if (_is_drag_receiving): + if (_last_event_button_drop_attempt != ''): + drop_data(Vector2.ZERO, { "source": "EventButton", "event_id": _last_event_button_drop_attempt} ) + _is_drag_receiving = false + + +func rendering_scale_correction(s, vector:Vector2) -> Vector2: + if s == 1.25: + return vector - Vector2(3, 2) + if s == 1.5: + return vector - Vector2(6, 6) + if s == 1.75: + return vector - Vector2(6, 7) + if s == 2: + return vector - Vector2(13, 8) + return vector + + + +func _draw(): + var timeline_children = $TimeLine.get_children() + var timeline_lenght = timeline_children.size() + var line_color = Color("#4D4D4D") + var test_color = Color(1,0,0,0.5) + var _scale = DialogicUtil.get_editor_scale(self) + var line_width = 3 * _scale + var pos = Vector2(32 * _scale, 51 * _scale) + + pos = rendering_scale_correction(_scale, pos) + + for event in $TimeLine.get_children(): + if not 'event_data' in event: + continue + + # If the event is the last one, don't draw anything aftwards + if timeline_children[timeline_lenght-1] == event: + return + + # Drawing long lines on questions and conditions + if event.event_name == 'Question' or event.event_name == 'Condition': + var keep_going = true + var end_reference + for e in timeline_children: + if keep_going: + if e.get_index() > event.get_index(): + if e.current_indent_level == event.current_indent_level: + if e.event_name == 'End Branch': + end_reference = e + keep_going = false + if e.event_name == 'Question' or event.event_name == 'Condition': + keep_going = false + if keep_going == false: + if end_reference: + # This line_size thing should be fixed, not sure why it is different when + # the indent level is 0 and when it is bigger. + var line_size = 0 + if event.current_indent_level > 0: + line_size = (event.indent_size * event.current_indent_level) + (4 * _scale) + # end the line_size thingy + + # Drawing the line from the Question/Condition node to the End Branch one. + draw_rect(Rect2( + Vector2(pos.x + line_size -scroll_horizontal, pos.y-scroll_vertical)+event.rect_position, + Vector2(line_width, + (end_reference.rect_global_position.y - event.rect_global_position.y) - (43 * _scale)) + ), + line_color, true) + + # Drawing other lines and archs + var next_event = timeline_children[event.get_index() + 1] + if event.current_indent_level > 0: + # Line at current indent + var line_size = (event.indent_size * event.current_indent_level) + (4 * _scale) + if next_event.event_name != 'End Branch' and event.event_name != 'Choice': + if event.event_name != 'Question' and next_event.event_name == 'Choice': + # Skip drawing lines before going to the next choice + pass + else: + draw_rect(Rect2( + Vector2(pos.x + line_size -scroll_horizontal, pos.y - scroll_vertical)+event.rect_position, + Vector2(line_width, event.rect_size.y - (40 * _scale)) + ), + line_color, + true) + else: + # Root (level 0) Vertical Line + draw_rect(Rect2( + Vector2(pos.x-scroll_horizontal, pos.y - scroll_vertical)+event.rect_position, + Vector2(line_width, event.rect_size.y - (40 * _scale)) + ), + line_color, + true) + + # Drawing arc + if event.event_name == 'Choice': + # Connecting with the question + var arc_start = Vector2( + (event.indent_size * (event.current_indent_level)) + (16.2 * _scale), + 5 + ) + var arc_point_count = 12 * _scale + var arc_radius = 24 * _scale + var start_angle = 90 + var end_angle = 185 + + if event.current_indent_level == 1: + arc_start.x = (event.indent_size * (event.current_indent_level)) + (12.5 * _scale) + + arc_start = rendering_scale_correction(_scale, arc_start) + + draw_arc( + Vector2(arc_start.x-scroll_horizontal, arc_start.y - scroll_vertical) + event.rect_position, + arc_radius, + deg2rad(start_angle), + deg2rad(end_angle), + arc_point_count, #point count + line_color, + line_width - (1 * _scale), + true + ) + + # Don't draw arc if next event is another choice event + if next_event.event_name == "Choice" or next_event.event_name == "End Branch": + continue + + # Connecting with the next event + + arc_start.x = (event.indent_size * (event.current_indent_level + 1)) + (16 * _scale) + arc_start.y = (pos.y + (8 * _scale)) + + arc_start = rendering_scale_correction(_scale, arc_start) + + draw_arc( + Vector2(arc_start.x-scroll_horizontal, arc_start.y - scroll_vertical) + event.rect_position, + arc_radius, + deg2rad(start_angle), + deg2rad(end_angle), + arc_point_count, + line_color, + line_width - (1 * _scale), + true + ) diff --git a/project/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd b/project/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd new file mode 100644 index 0000000..4c9cc9d --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd @@ -0,0 +1,1124 @@ +tool +extends HSplitContainer + +var editor_reference +var timeline_name: String = '' +var timeline_file: String = '' +var current_timeline: Dictionary = {} +var TimelineUndoRedo := UndoRedo.new() + +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +onready var timeline = $TimelineArea/TimeLine +onready var events_warning = $ScrollContainer/EventContainer/EventsWarning +onready var custom_events_container = $ScrollContainer/EventContainer/CustomEventsContainer + +var hovered_item = null +var selected_style : StyleBoxFlat = load("res://addons/dialogic/Editor/Events/styles/selected_styleboxflat.tres") +var saved_style : StyleBoxFlat +var selected_items : Array = [] + +var event_scenes : Dictionary = {} + +var currently_draged_event_type = null +var move_start_position = null +var moving_piece = null +var piece_was_dragged = false + +var custom_events = {} + +var id_to_scene_name = { + #Main events + 'dialogic_001':'TextEvent', + 'dialogic_002':'Character', + #Logic + 'dialogic_010':'Question', + 'dialogic_011':'Choice', + 'dialogic_012':'Condition', + 'dialogic_013':'EndBranch', + 'dialogic_014':'SetValue', + 'dialogic_015':'LabelEvent', + 'dialogic_016':'GoTo Event', + #Timeline + 'dialogic_020':'ChangeTimeline', + 'dialogic_021':'ChangeBackground', + 'dialogic_022':'CloseDialog', + 'dialogic_023':'WaitSeconds', + 'dialogic_024':'SetTheme', + 'dialogic_025':'SetGlossary', + 'dialogic_026':'SaveEvent', + #Audio + 'dialogic_030':'AudioEvent', + 'dialogic_031':'BackgroundMusic', + #Godot + 'dialogic_040':'EmitSignal', + 'dialogic_041':'ChangeScene', + 'dialogic_042':'CallNode', + #Afterlife + 'dialogic_050':'NoSkipEvent', + } + +var event_data + +var batches = [] +var building_timeline = true +signal selection_updated +signal batch_loaded +signal timeline_loaded + +func _ready(): + editor_reference = find_parent('EditorView') + connect("batch_loaded", self, '_on_batch_loaded') + var modifier = '' + var _scale = get_constant("inspector_margin", "Editor") + _scale = _scale * 0.125 + $ScrollContainer.rect_min_size.x = 180 + if _scale == 1.25: + modifier = '-1.25' + $ScrollContainer.rect_min_size.x = 200 + if _scale == 1.5: + modifier = '-1.25' + $ScrollContainer.rect_min_size.x = 200 + if _scale == 1.75: + modifier = '-1.25' + $ScrollContainer.rect_min_size.x = 390 + if _scale == 2: + modifier = '-2' + $ScrollContainer.rect_min_size.x = 390 + + var style = $TimelineArea.get('custom_styles/bg') + style.set('bg_color', get_color("dark_color_1", "Editor")) + + update_custom_events() + $TimelineArea.connect('resized', self, 'add_extra_scroll_area_to_timeline', []) + + # We create the event buttons + event_data = _read_event_data() + var buttonScene = load("res://addons/dialogic/Editor/TimelineEditor/SmallEventButton.tscn") + for b in event_data: + if typeof(b['event_data']) == TYPE_DICTIONARY: + var button = buttonScene.instance() + # Button properties + button.visible_name = ' ' + b['event_name'] + button.event_id = b['event_data']['event_id'] + button.set_icon(b['event_icon']) + button.event_color = b['event_color'] + button.event_category = b.get('event_category', 0) + button.sorting_index = b.get('sorting_index', 9999) + # Connecting the signal + if button.event_id == 'dialogic_010': + button.connect('pressed', self, "_on_ButtonQuestion_pressed", []) + elif button.event_id == 'dialogic_012': # Condition + button.connect('pressed', self, "_on_ButtonCondition_pressed", []) + else: + button.connect('pressed', self, "_create_event_button_pressed", [button.event_id]) + # Adding it to its section + get_node("ScrollContainer/EventContainer/FlexContainer" + str(button.event_category + 1)).add_child(button) + while button.get_index() != 0 and button.sorting_index < get_node("ScrollContainer/EventContainer/FlexContainer" + str(button.event_category + 1)).get_child(button.get_index()-1).sorting_index: + get_node("ScrollContainer/EventContainer/FlexContainer" + str(button.event_category + 1)).move_child(button, button.get_index()-1) + +# handles dragging/moving of events +func _process(delta): + if moving_piece != null: + var current_position = get_global_mouse_position() + var node_position = moving_piece.rect_global_position.y + var height = get_block_height(moving_piece) + var up_offset = get_block_height(get_block_above(moving_piece)) + var down_offset = get_block_height(get_block_below(moving_piece)) + if up_offset != null: + up_offset = (up_offset / 2) + 5 + if current_position.y < node_position - up_offset: + move_block(moving_piece, 'up') + piece_was_dragged = true + if down_offset != null: + down_offset = height + (down_offset / 2) + 5 + if current_position.y > node_position + down_offset: + move_block(moving_piece, 'down') + piece_was_dragged = true + + +# SIGNAL handles input on the events mainly for selection and moving events +func _on_event_block_gui_input(event, item: Node): + if event is InputEventMouseButton and event.button_index == 1: + if (not event.is_pressed()): + if (piece_was_dragged and moving_piece != null and move_start_position): + var to_position = moving_piece.get_index() + if move_start_position != to_position: + # move it back so the DO action works. (Kinda stupid but whatever) + move_block_to_index(to_position, move_start_position) + TimelineUndoRedo.create_action("[D] Moved event (type '"+moving_piece.event_data.event_id+"').") + TimelineUndoRedo.add_do_method(self, "move_block_to_index", move_start_position, to_position) + TimelineUndoRedo.add_undo_method(self, "move_block_to_index", to_position, move_start_position) + TimelineUndoRedo.commit_action() + move_start_position = null + else: + select_item(item) + if (moving_piece != null): + + indent_events() + piece_was_dragged = false + moving_piece = null + elif event.is_pressed(): + moving_piece = item + move_start_position = moving_piece.get_index() + if not _is_item_selected(item): + pass#piece_was_dragged = true + else: + piece_was_dragged = false + + +## ***************************************************************************** +## SHORTCUTS +## ***************************************************************************** + +func _input(event): + # some shortcuts need to get handled in the common input event + # especially CTRL-based + # because certain godot controls swallow events (like textedit) + # we protect this with is_visible_in_tree to not + # invoke a shortcut by accident + if get_focus_owner() is TextEdit: + return + if (event is InputEventKey and event is InputEventWithModifiers and is_visible_in_tree()): + # CTRL Z # UNDO + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_Z + and event.echo == false + ): + TimelineUndoRedo.undo() + indent_events() + get_tree().set_input_as_handled() + if (event is InputEventKey and event is InputEventWithModifiers and is_visible_in_tree()): + # CTRL +SHIFT+ Z # REDO + if (event.pressed + and event.alt == false + and event.shift == true + and (event.control == true or event.command == true) + and event.scancode == KEY_Z + and event.echo == false + ) or (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_Y + and event.echo == false): + TimelineUndoRedo.redo() + indent_events() + get_tree().set_input_as_handled() + if (event is InputEventKey and event is InputEventWithModifiers and is_visible_in_tree()): + # UP + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == false or event.command == false) + and event.scancode == KEY_UP + and event.echo == false + ): + # select previous + if (len(selected_items) == 1): + var prev = max(0, selected_items[0].get_index() - 1) + var prev_node = timeline.get_child(prev) + if (prev_node != selected_items[0]): + selected_items = [] + select_item(prev_node) + get_tree().set_input_as_handled() + + + # DOWN + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == false or event.command == false) + and event.scancode == KEY_DOWN + and event.echo == false + ): + # select next + if (len(selected_items) == 1): + var next = min(timeline.get_child_count() - 1, selected_items[0].get_index() + 1) + var next_node = timeline.get_child(next) + if (next_node != selected_items[0]): + selected_items = [] + select_item(next_node) + get_tree().set_input_as_handled() + + # DELETE + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == false or event.command == false) + and event.scancode == KEY_DELETE + and event.echo == false + ): + if (len(selected_items) != 0): + var events_indexed = get_events_indexed(selected_items) + TimelineUndoRedo.create_action("[D] Deleting "+str(len(selected_items))+" event(s).") + TimelineUndoRedo.add_do_method(self, "delete_events_indexed", events_indexed) + TimelineUndoRedo.add_undo_method(self, "add_events_indexed", events_indexed) + TimelineUndoRedo.commit_action() + get_tree().set_input_as_handled() + + # CTRL T + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_T + and event.echo == false + ): + var at_index = -1 + if selected_items: + at_index = selected_items[-1].get_index()+1 + else: + at_index = timeline.get_child_count() + TimelineUndoRedo.create_action("[D] Add Text event.") + TimelineUndoRedo.add_do_method(self, "create_event", "dialogic_001", {'no-data': true}, true, at_index, true) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", at_index, 1) + TimelineUndoRedo.commit_action() + get_tree().set_input_as_handled() + + # CTRL A + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_A + and event.echo == false + ): + if (len(selected_items) != 0): + select_all_items() + get_tree().set_input_as_handled() + + # CTRL SHIFT A + if (event.pressed + and event.alt == false + and event.shift == true + and (event.control == true or event.command == true) + and event.scancode == KEY_A + and event.echo == false + ): + if (len(selected_items) != 0): + deselect_all_items() + get_tree().set_input_as_handled() + + # CTRL C + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_C + and event.echo == false + ): + copy_selected_events() + get_tree().set_input_as_handled() + + # CTRL V + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_V + and event.echo == false + ): + var events_list = paste_check() + var paste_position = -1 + if selected_items: + paste_position = selected_items[-1].get_index() + else: + paste_position = timeline.get_child_count()-1 + TimelineUndoRedo.create_action("[D] Pasting "+str(len(events_list))+" event(s).") + TimelineUndoRedo.add_do_method(self, "add_events_at_index", events_list, paste_position) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", paste_position+1, len(events_list)) + TimelineUndoRedo.commit_action() + get_tree().set_input_as_handled() + + # CTRL X + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_X + and event.echo == false + ): + var events_indexed = get_events_indexed(selected_items) + TimelineUndoRedo.create_action("[D] Cut "+str(len(selected_items))+" event(s).") + TimelineUndoRedo.add_do_method(self, "cut_events_indexed", events_indexed) + TimelineUndoRedo.add_undo_method(self, "add_events_indexed", events_indexed) + TimelineUndoRedo.commit_action() + get_tree().set_input_as_handled() + + # CTRL D + if (event.pressed + and event.alt == false + and event.shift == false + and (event.control == true or event.command == true) + and event.scancode == KEY_D + and event.echo == false + ): + + if len(selected_items) > 0: + var events = get_events_indexed(selected_items).values() + var at_index = selected_items[-1].get_index() + TimelineUndoRedo.create_action("[D] Duplicate "+str(len(events))+" event(s).") + TimelineUndoRedo.add_do_method(self, "add_events_at_index", events, at_index) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", at_index, len(events)) + TimelineUndoRedo.commit_action() + get_tree().set_input_as_handled() + +func _unhandled_key_input(event): + if (event is InputEventWithModifiers): + # ALT UP + if (event.pressed + and event.alt == true + and event.shift == false + and (event.control == false or event.command == false) + and event.scancode == KEY_UP + and event.echo == false + ): + # move selected up + if (len(selected_items) == 1): + move_block(selected_items[0], "up") + indent_events() + get_tree().set_input_as_handled() + + # ALT DOWN + if (event.pressed + and event.alt == true + and event.shift == false + and (event.control == false or event.command == false) + and event.scancode == KEY_DOWN + and event.echo == false + ): + # move selected down + if (len(selected_items) == 1): + move_block(selected_items[0], "down") + indent_events() + get_tree().set_input_as_handled() + +## ***************************************************************************** +## DELETING, COPY, PASTE +## ***************************************************************************** + +func get_events_indexed(events:Array) -> Dictionary: + var indexed_dict = {} + for event in events: + indexed_dict[event.get_index()] = event.event_data.duplicate(true) + return indexed_dict + +func select_indexed_events(indexed_events:Dictionary) -> void: + selected_items = [] + for event_index in indexed_events.keys(): + selected_items.append(timeline.get_child(event_index)) + +func add_events_indexed(indexed_events:Dictionary) -> void: + var indexes = indexed_events.keys() + indexes.sort() + var events = [] + for event_idx in indexes: + deselect_all_items() + events.append(create_event(indexed_events[event_idx].event_id, indexed_events[event_idx])) + timeline.move_child(events[-1], event_idx) + + selected_items = events + visual_update_selection() + +func delete_events_indexed(indexed_events:Dictionary) -> void: + select_indexed_events(indexed_events) + delete_selected_events() + +func delete_selected_events(): + if len(selected_items) == 0: + return + + # get next element + var next = min(timeline.get_child_count() - 1, selected_items[-1].get_index() + 1) + var next_node = timeline.get_child(next) + if _is_item_selected(next_node): + next_node = null + + for event in selected_items: + event.get_parent().remove_child(event) + event.queue_free() + + # select next + if (next_node != null): + select_item(next_node, false) + else: + if (timeline.get_child_count() > 0): + next_node = timeline.get_child(max(0, timeline.get_child_count() - 1)) + if (next_node != null): + select_item(next_node, false) + else: + deselect_all_items() + + indent_events() + + +func cut_selected_events(): + copy_selected_events() + delete_selected_events() + + +func cut_events_indexed(indexed_events:Dictionary) -> void: + select_indexed_events(indexed_events) + cut_selected_events() + + +func copy_selected_events(): + if len(selected_items) == 0: + return + var event_copy_array = [] + for item in selected_items: + event_copy_array.append(item.event_data) + + OS.clipboard = JSON.print( + { + "events":event_copy_array, + "dialogic_version": editor_reference.version_string, + "project_name": ProjectSettings.get_setting("application/config/name") + }) + +func paste_check(): + var clipboard_parse = JSON.parse(OS.clipboard).result + + if typeof(clipboard_parse) == TYPE_DICTIONARY: + if clipboard_parse.has("dialogic_version"): + if clipboard_parse['dialogic_version'] != editor_reference.version_string: + print("[D] Be careful when copying from older versions!") + if clipboard_parse.has("project_name"): + if clipboard_parse['project_name'] != ProjectSettings.get_setting("application/config/name"): + print("[D] Be careful when copying from another project!") + if clipboard_parse.has('events'): + return clipboard_parse['events'] + +func remove_events_at_index(at_index:int, amount:int = 1)-> void: + selected_items = [] + for i in range(0, amount): + selected_items.append(timeline.get_child(at_index + i)) + delete_selected_events() + +func add_events_at_index(event_list:Array, at_index:int) -> void: + if at_index != -1: + event_list.invert() + selected_items = [timeline.get_child(at_index)] + else: + selected_items = [] + + var new_items = [] + for item in event_list: + if typeof(item) == TYPE_DICTIONARY and item.has('event_id'): + new_items.append(create_event(item['event_id'], item)) + selected_items = new_items + sort_selection() + visual_update_selection() + indent_events() + +func paste_events_indexed(indexed_events): + pass + +func duplicate_events_indexed(indexed_events): + pass + +## ***************************************************************************** +## BLOCK SELECTION +## ***************************************************************************** + +func _is_item_selected(item: Node): + return item in selected_items + + +func select_item(item: Node, multi_possible:bool = true): + if item == null: + return + + if Input.is_key_pressed(KEY_CONTROL) and multi_possible: + # deselect the item if it is selected + if _is_item_selected(item): + selected_items.erase(item) + else: + selected_items.append(item) + elif Input.is_key_pressed(KEY_SHIFT) and multi_possible: + + if len(selected_items) == 0: + selected_items = [item] + else: + var index = selected_items[-1].get_index() + var goal_idx = item.get_index() + while true: + if index < goal_idx: index += 1 + else: index -= 1 + if not timeline.get_child(index) in selected_items: + selected_items.append(timeline.get_child(index)) + + if index == goal_idx: + break + else: + if len(selected_items) == 1: + if _is_item_selected(item): + selected_items.erase(item) + else: + selected_items = [item] + else: + selected_items = [item] + + sort_selection() + + visual_update_selection() + + +# checks all the events and sets their styles (selected/deselected) +func visual_update_selection(): + for item in timeline.get_children(): + item.visual_deselect() + for item in selected_items: + item.visual_select() + + +## Sorts the selection using 'custom_sort_selection' +func sort_selection(): + selected_items.sort_custom(self, 'custom_sort_selection') + + +## Compares two event blocks based on their position in the timeline +func custom_sort_selection(item1, item2): + return item1.get_index() < item2.get_index() + + +## Helpers +func select_all_items(): + selected_items = [] + for event in timeline.get_children(): + selected_items.append(event) + visual_update_selection() + + +func deselect_all_items(): + selected_items = [] + visual_update_selection() + +## ***************************************************************************** +## SPECIAL BLOCK OPERATIONS +## ***************************************************************************** + +# SIGNAL handles the actions of the small menu on the right +func _on_event_options_action(action: String, item: Node): + ### WORK TODO + if action == "remove": + delete_selected_events() + else: + move_block(item, action) + indent_events() + + +func delete_event(event): + event.get_parent().remove_child(event) + event.queue_free() + + +## ***************************************************************************** +## CREATING NEW EVENTS USING THE BUTTONS +## ***************************************************************************** + +# Event Creation signal for buttons +func _create_event_button_pressed(event_id): + var at_index = -1 + if selected_items: + at_index = selected_items[-1].get_index()+1 + else: + at_index = timeline.get_child_count() + TimelineUndoRedo.create_action("[D] Add event.") + TimelineUndoRedo.add_do_method(self, "create_event", event_id, {'no-data': true}, true, at_index, true) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", at_index, 1) + TimelineUndoRedo.commit_action() + scroll_to_piece(at_index) + indent_events() + + +# the Question button adds multiple blocks +func _on_ButtonQuestion_pressed() -> void: + var at_index = -1 + if selected_items: + at_index = selected_items[-1].get_index()+1 + else: + at_index = timeline.get_child_count() + TimelineUndoRedo.create_action("[D] Add question events.") + TimelineUndoRedo.add_do_method(self, "create_question", at_index) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", at_index, 4) + TimelineUndoRedo.commit_action() + +func create_question(at_position): + if at_position == 0: selected_items = [] + else: selected_items = [timeline.get_child(at_position-1)] + if len(selected_items) != 0: + # Events are added bellow the selected node + # So we must reverse the adding order + create_event("dialogic_013", {'no-data': true}, true) + create_event("dialogic_011", {'no-data': true}, true) + create_event("dialogic_011", {'no-data': true}, true) + create_event("dialogic_010", {'no-data': true}, true) + else: + create_event("dialogic_010", {'no-data': true}, true) + create_event("dialogic_011", {'no-data': true}, true) + create_event("dialogic_011", {'no-data': true}, true) + create_event("dialogic_013", {'no-data': true}, true) + + +# the Condition button adds multiple blocks +func _on_ButtonCondition_pressed() -> void: + var at_index = -1 + if selected_items: + at_index = selected_items[-1].get_index()+1 + else: + at_index = timeline.get_child_count() + TimelineUndoRedo.create_action("[D] Add condition events.") + TimelineUndoRedo.add_do_method(self, "create_condition", at_index) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", at_index, 2) + TimelineUndoRedo.commit_action() + +func create_condition(at_position): + if at_position == 0: selected_items = [] + else: selected_items = [timeline.get_child(at_position-1)] + if len(selected_items) != 0: + # Events are added bellow the selected node + # So we must reverse the adding order + create_event("dialogic_013", {'no-data': true}, true) + create_event("dialogic_012", {'no-data': true}, true) + else: + create_event("dialogic_012", {'no-data': true}, true) + create_event("dialogic_013", {'no-data': true}, true) + + +func update_custom_events() -> void: + ## CLEANUP + custom_events = {} + + # cleaning the 'old' buttons + for child in custom_events_container.get_children(): + child.queue_free() + + var path:String = "res://dialogic/custom-events" + + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + # goes through all the folders in the custom events folder + while file_name != "": + # if it found a folder + if dir.current_is_dir() and not file_name in ['.', '..']: + # look through that folder + #print("Found custom event folder: " + file_name) + var event = load(path.plus_file(file_name).plus_file('EventBlock.tscn')).instance() + if event: + custom_events[event.event_data['event_id']] = { + 'event_block_scene' :path.plus_file(file_name).plus_file('EventBlock.tscn'), + 'event_name' : event.event_name, + 'event_icon' : event.event_icon + } + event.queue_free() + else: + print("[D] An error occurred when trying to access a custom event.") + + + else: + pass # files in the directory are ignored + file_name = dir.get_next() + + # After we finishing checking, if any events exist, show the panel + if custom_events.size() == 0: + custom_events_container.hide() + $ScrollContainer/EventContainer/CustomEventsHeadline.hide() + else: + custom_events_container.show() + $ScrollContainer/EventContainer/CustomEventsHeadline.show() + else: + print("[D] An error occurred when trying to access the custom events folder.") + + ## VISUAL UPDATE + + + # adding new ones + for custom_event_id in custom_events.keys(): + var button = load('res://addons/dialogic/Editor/TimelineEditor/SmallEventButton.tscn').instance() + #button.set_script(preload("EventButton.gd")) + button.event_id = custom_event_id + button.visible_name = ' ' + custom_events[custom_event_id]['event_name'] + if custom_events[custom_event_id]['event_icon']: + button.set_icon(custom_events[custom_event_id]['event_icon']) + #button.event_color = TODO + button.connect("pressed", self, "_create_event_button_pressed", [custom_event_id]) + custom_events_container.add_child(button) + +## ***************************************************************************** +## DRAG AND DROP +## ***************************************************************************** + +# Creates a ghost event for drag and drop +func create_drag_and_drop_event(event_id: String): + var index = get_index_under_cursor() + var piece = create_event(event_id) + currently_draged_event_type = event_id + timeline.move_child(piece, index) + moving_piece = piece + piece_was_dragged = true + set_event_ignore_save(piece, true) + select_item(piece) + return piece + + +func drop_event(): + if moving_piece != null: + var at_index = moving_piece.get_index() + moving_piece.queue_free() + TimelineUndoRedo.create_action("[D] Add event.") + TimelineUndoRedo.add_do_method(self, "create_event", currently_draged_event_type, {'no-data': true}, true, at_index, true) + TimelineUndoRedo.add_undo_method(self, "remove_events_at_index", at_index, 1) + TimelineUndoRedo.commit_action() + moving_piece = null + piece_was_dragged = false + indent_events() + add_extra_scroll_area_to_timeline() + + + +func cancel_drop_event(): + if moving_piece != null: + moving_piece = null + piece_was_dragged = false + delete_selected_events() + deselect_all_items() + + +## ***************************************************************************** +## CREATING THE TIMELINE +## ***************************************************************************** + +# Adding an event to the timeline +func create_event(event_id: String, data: Dictionary = {'no-data': true} , indent: bool = false, at_index: int = -1, auto_select: bool = false): + var piece = null + + # check if it's a custom event + if event_id in custom_events.keys(): + piece = load(custom_events[event_id]['event_block_scene']).instance() + # check if it's a builtin event + elif event_id in id_to_scene_name.keys(): + piece = load("res://addons/dialogic/Editor/Events/" + id_to_scene_name[event_id] + ".tscn").instance() + # else use dummy event + else: + piece = load("res://addons/dialogic/Editor/Events/DummyEvent.tscn").instance() + + # load the piece with data + piece.editor_reference = editor_reference + + if data.has('no-data') == false: + piece.event_data = data + + if at_index == -1: + if len(selected_items) != 0: + timeline.add_child_below_node(selected_items[0], piece) + else: + timeline.add_child(piece) + else: + timeline.add_child(piece) + timeline.move_child(piece, at_index) + + piece.connect("option_action", self, '_on_event_options_action', [piece]) + piece.connect("gui_input", self, '_on_event_block_gui_input', [piece]) + + events_warning.visible = false + if auto_select: + select_item(piece, false) + # Spacing + add_extra_scroll_area_to_timeline() + # Indent on create + if indent: + indent_events() + + if not building_timeline: + piece.focus() + + return piece + + +func load_timeline(filename: String): + clear_timeline() + update_custom_events() + if timeline_file != filename: + TimelineUndoRedo.clear_history() + building_timeline = true + timeline_file = filename + + var data = DialogicResources.get_timeline_json(filename) + if data['metadata'].has('name'): + timeline_name = data['metadata']['name'] + else: + timeline_name = data['metadata']['file'] + data = data['events'] + + var page = 1 + var batch_size = 12 + while batch_events(data, batch_size, page).size() != 0: + batches.append(batch_events(data, batch_size, page)) + page += 1 + load_batch(batches) + # Reset the scroll position + $TimelineArea.scroll_vertical = 0 + + + +func batch_events(array, size, batch_number): + return array.slice((batch_number - 1) * size, batch_number * size - 1) + + +func load_batch(data): + #print('[D] Loading batch') + var current_batch = batches.pop_front() + if current_batch: + for i in current_batch: + create_event(i['event_id'], i, false, timeline.get_child_count()) + emit_signal("batch_loaded") + + +func _on_batch_loaded(): + if batches.size() > 0: + yield(get_tree().create_timer(0.01), "timeout") + load_batch(batches) + else: + events_warning.visible = false + indent_events() + building_timeline = false + emit_signal("timeline_loaded") + add_extra_scroll_area_to_timeline() + + + +func clear_timeline(): + deselect_all_items() + for event in timeline.get_children(): + event.free() + + +## ***************************************************************************** +## BLOCK GETTERS +## ***************************************************************************** + +func get_block_above(block): + var block_index = block.get_index() + var item = null + if block_index > 0: + item = timeline.get_child(block_index - 1) + return item + + +func get_block_below(block): + var block_index = block.get_index() + var item = null + if block_index < timeline.get_child_count() - 1: + item = timeline.get_child(block_index + 1) + return item + + +func get_block_height(block): + if block != null: + return block.rect_size.y + else: + return null + + +func get_index_under_cursor(): + var current_position = get_global_mouse_position() + var top_pos = 0 + for i in range(timeline.get_child_count()): + var c = timeline.get_child(i) + if c.rect_global_position.y < current_position.y: + top_pos = i + return top_pos + + +# ordering blocks in timeline +func move_block(block, direction): + var block_index = block.get_index() + if direction == 'up': + if block_index > 0: + timeline.move_child(block, block_index - 1) + $TimelineArea.update() + return true + if direction == 'down': + timeline.move_child(block, block_index + 1) + $TimelineArea.update() + return true + return false + +func move_block_to_index(block_index, index): + timeline.move_child(timeline.get_child(block_index), index) + +## ***************************************************************************** +## TIMELINE CREATION AND SAVING +## ***************************************************************************** + + +func create_timeline(): + timeline_file = 'timeline-' + str(OS.get_unix_time()) + '.json' + var timeline = { + "events": [], + "metadata":{ + "dialogic-version": editor_reference.version_string, + "file": timeline_file + } + } + DialogicResources.set_timeline(timeline) + return timeline + +# Saving +func generate_save_data(): + var info_to_save = { + 'metadata': { + 'dialogic-version': editor_reference.version_string, + 'name': timeline_name, + 'file': timeline_file + }, + 'events': [] + } + for event in timeline.get_children(): + # Checking that the event is not waiting to be removed + # or that it is not a drag and drop placeholder + if not get_event_ignore_save(event) and event.is_queued_for_deletion() == false: + info_to_save['events'].append(event.event_data) + return info_to_save + + +func set_event_ignore_save(event: Node, ignore: bool): + event.ignore_save = ignore + + +func get_event_ignore_save(event: Node) -> bool: + return event.ignore_save + + +func save_timeline() -> void: + if timeline_file != '' and building_timeline == false: + var info_to_save = generate_save_data() + DialogicResources.set_timeline(info_to_save) + #print('[+] Saving: ' , timeline_file) + + +## ***************************************************************************** +## UTILITIES/HELPERS +## ***************************************************************************** + +# Scrolling +func scroll_to_piece(piece_index) -> void: + var height = 0 + for i in range(0, piece_index): + height += $TimelineArea/TimeLine.get_child(i).rect_size.y + if height < $TimelineArea.scroll_vertical or height > $TimelineArea.scroll_vertical+$TimelineArea.rect_size.y-(200*DialogicUtil.get_editor_scale(self)): + $TimelineArea.scroll_vertical = height + +# Event Indenting +func indent_events() -> void: + # Now indenting + var indent: int = 0 + var starter: bool = false + var event_list: Array = timeline.get_children() + var question_index: int = 0 + var question_indent = {} + if event_list.size() < 2: + return + # Resetting all the indents + for event in event_list: + var indent_node + + event.set_indent(0) + + # Adding new indents + for event in event_list: + # since there are indicators now, not all elements + # in this list have an event_data property + if (not "event_data" in event): + continue + + + if event.event_data['event_id'] == 'dialogic_011': + if question_index > 0: + indent = question_indent[question_index] + 1 + starter = true + elif event.event_data['event_id'] == 'dialogic_010' or event.event_data['event_id'] == 'dialogic_012': + indent += 1 + starter = true + question_index += 1 + question_indent[question_index] = indent + elif event.event_data['event_id'] == 'dialogic_013': + if question_indent.has(question_index): + indent = question_indent[question_index] + indent -= 1 + question_index -= 1 + if indent < 0: + indent = 0 + else: + event.remove_warning('This event is not connected to any Question or Condition but it should!') + else: + event.set_warning('This event is not connected to any Question or Condition but it should!') + + if indent > 0: + # Keep old behavior for items without template + if starter: + event.set_indent(indent - 1) + else: + event.set_indent(indent) + starter = false + $TimelineArea.update() + + +# called from the toolbar +func fold_all_nodes(): + for event in timeline.get_children(): + event.set_expanded(false) + add_extra_scroll_area_to_timeline() + + +# called from the toolbar +func unfold_all_nodes(): + for event in timeline.get_children(): + event.set_expanded(true) + add_extra_scroll_area_to_timeline() + +func get_current_events_anchors(): + var anchors = {} + for event in timeline.get_children(): + if "event_data" in event: + if event.event_data['event_id'] == 'dialogic_015': + anchors[event.event_data['id']] = event.event_data['name'] + return anchors + +func add_extra_scroll_area_to_timeline(): + if timeline.get_children().size() > 4: + timeline.rect_min_size.y = 0 + timeline.rect_size.y = 0 + if timeline.rect_size.y + 200 > $TimelineArea.rect_size.y: + timeline.rect_min_size = Vector2(0, timeline.rect_size.y + 200) + + +# Functions for reading the event data and coloring the buttons +func _read_event_data(): + var dir = 'res://addons/dialogic/Editor/Events/' + var file = File.new() + var config = ConfigFile.new() + var events_data = [] + for f in DialogicUtil.list_dir(dir): + if '.tscn' in f: + if 'DummyEvent' in f: + # Need to figure out what to do with this one + pass + else: + var scene = load(dir + '/' + f).get_state() + var c = {} + for p in scene.get_node_property_count(0): + c[scene.get_node_property_name(0,p)] = scene.get_node_property_value(0, p) + events_data.append(c) + return events_data + + +func play_timeline(): + DialogicResources.set_settings_value('QuickTimelineTest', 'timeline_file', timeline_file) + editor_reference.editor_interface.play_custom_scene('res://addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.tscn') diff --git a/project/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn b/project/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn new file mode 100644 index 0000000..17cbc33 --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/TimelineEditor.tscn @@ -0,0 +1,282 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://addons/dialogic/Images/Tutorials/arrow-down.svg" type="Texture" id=13] +[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/TimelineEditor.gd" type="Script" id=17] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=21] +[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/TimelineArea.gd" type="Script" id=22] +[ext_resource path="res://addons/dialogic/Editor/Theme/MainTheme.tres" type="Theme" id=28] +[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/FlexContainer.gd" type="Script" id=29] + +[sub_resource type="StyleBoxFlat" id=1] +content_margin_left = 5.0 +content_margin_right = 5.0 +content_margin_top = 5.0 +content_margin_bottom = 5.0 +bg_color = Color( 0, 0, 0, 1 ) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color( 0.0980392, 0.113725, 0.152941, 1 ) + +[sub_resource type="StyleBoxFlat" id=2] +draw_center = false +border_width_left = 2 +border_color = Color( 0.8, 0.8, 0.8, 0 ) + +[sub_resource type="StyleBoxFlat" id=3] +content_margin_right = 6.0 +content_margin_top = 10.0 +content_margin_bottom = 10.0 +bg_color = Color( 0.94902, 1, 0.482353, 1 ) +corner_radius_top_left = 5 +corner_radius_top_right = 5 +corner_radius_bottom_right = 5 +corner_radius_bottom_left = 5 + +[node name="TimelineEditor" type="HSplitContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_bottom = 138.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme = ExtResource( 28 ) +split_offset = 7 +script = ExtResource( 17 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TimelineArea" type="ScrollContainer" parent="."] +margin_right = 832.0 +margin_bottom = 738.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/bg = SubResource( 1 ) +script = ExtResource( 22 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TimeLine" type="VBoxContainer" parent="TimelineArea"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 827.0 +margin_bottom = 733.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="ScrollContainer" type="ScrollContainer" parent="."] +margin_left = 844.0 +margin_right = 1024.0 +margin_bottom = 738.0 +rect_min_size = Vector2( 180, 0 ) +custom_styles/bg = SubResource( 2 ) + +[node name="EventContainer" type="VBoxContainer" parent="ScrollContainer"] +margin_left = 2.0 +margin_right = 186.0 +margin_bottom = 939.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_constants/separation = 9 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="EventsWarning" type="PanelContainer" parent="ScrollContainer/EventContainer"] +margin_right = 184.0 +margin_bottom = 68.0 +custom_styles/panel = SubResource( 3 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/EventContainer/EventsWarning"] +margin_top = 10.0 +margin_right = 178.0 +margin_bottom = 58.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="ScrollContainer/EventContainer/EventsWarning/HBoxContainer"] +margin_right = 40.0 +margin_bottom = 48.0 +rect_min_size = Vector2( 40, 40 ) +texture = ExtResource( 13 ) +stretch_mode = 4 + +[node name="Label" type="Label" parent="ScrollContainer/EventContainer/EventsWarning/HBoxContainer"] +margin_left = 44.0 +margin_right = 178.0 +margin_bottom = 48.0 +rect_min_size = Vector2( 100, 0 ) +size_flags_horizontal = 3 +size_flags_vertical = 1 +custom_colors/font_color = Color( 0, 0, 0, 1 ) +text = "Add an event to start building your timeline" +autowrap = true + +[node name="HBoxContainer6" type="HBoxContainer" parent="ScrollContainer/EventContainer"] +margin_top = 77.0 +margin_right = 184.0 +margin_bottom = 91.0 + +[node name="TLabel" parent="ScrollContainer/EventContainer/HBoxContainer6" instance=ExtResource( 21 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 77.0 +margin_bottom = 14.0 +text = "Main Events" +text_key = "Main Events" + +[node name="HSeparator2" type="HSeparator" parent="ScrollContainer/EventContainer/HBoxContainer6"] +margin_left = 81.0 +margin_right = 184.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 + +[node name="FlexContainer1" type="Container" parent="ScrollContainer/EventContainer"] +margin_top = 100.0 +margin_right = 184.0 +margin_bottom = 145.0 +size_flags_horizontal = 3 +script = ExtResource( 29 ) + +[node name="HBoxContainer5" type="HBoxContainer" parent="ScrollContainer/EventContainer"] +margin_top = 154.0 +margin_right = 184.0 +margin_bottom = 168.0 + +[node name="TLabel2" parent="ScrollContainer/EventContainer/HBoxContainer5" instance=ExtResource( 21 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 33.0 +margin_bottom = 14.0 +text = "Logic" +text_key = "Logic" + +[node name="HSeparator2" type="HSeparator" parent="ScrollContainer/EventContainer/HBoxContainer5"] +margin_left = 37.0 +margin_right = 184.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 + +[node name="FlexContainer2" type="Container" parent="ScrollContainer/EventContainer"] +margin_top = 177.0 +margin_right = 184.0 +margin_bottom = 272.0 +size_flags_horizontal = 3 +script = ExtResource( 29 ) + +[node name="HBoxContainer3" type="HBoxContainer" parent="ScrollContainer/EventContainer"] +margin_top = 281.0 +margin_right = 184.0 +margin_bottom = 295.0 + +[node name="TLabel3" parent="ScrollContainer/EventContainer/HBoxContainer3" instance=ExtResource( 21 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 56.0 +margin_bottom = 14.0 +text = "Timeline" +text_key = "Timeline" + +[node name="HSeparator2" type="HSeparator" parent="ScrollContainer/EventContainer/HBoxContainer3"] +margin_left = 60.0 +margin_right = 184.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 + +[node name="FlexContainer3" type="Container" parent="ScrollContainer/EventContainer"] +margin_top = 304.0 +margin_right = 184.0 +margin_bottom = 449.0 +size_flags_horizontal = 3 +script = ExtResource( 29 ) + +[node name="HBoxContainer4" type="HBoxContainer" parent="ScrollContainer/EventContainer"] +margin_top = 458.0 +margin_right = 184.0 +margin_bottom = 472.0 + +[node name="TLabel4" parent="ScrollContainer/EventContainer/HBoxContainer4" instance=ExtResource( 21 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 37.0 +margin_bottom = 14.0 +text = "Audio" +text_key = "Audio" + +[node name="HSeparator2" type="HSeparator" parent="ScrollContainer/EventContainer/HBoxContainer4"] +margin_left = 41.0 +margin_right = 184.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 + +[node name="FlexContainer4" type="Container" parent="ScrollContainer/EventContainer"] +margin_top = 481.0 +margin_right = 184.0 +margin_bottom = 576.0 +size_flags_horizontal = 3 +script = ExtResource( 29 ) + +[node name="HBoxContainer" type="HBoxContainer" parent="ScrollContainer/EventContainer"] +margin_top = 585.0 +margin_right = 184.0 +margin_bottom = 599.0 + +[node name="TLabel5" parent="ScrollContainer/EventContainer/HBoxContainer" instance=ExtResource( 21 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 39.0 +margin_bottom = 14.0 +text = "Godot" +text_key = "Godot" + +[node name="HSeparator2" type="HSeparator" parent="ScrollContainer/EventContainer/HBoxContainer"] +margin_left = 43.0 +margin_right = 184.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 + +[node name="FlexContainer5" type="Container" parent="ScrollContainer/EventContainer"] +margin_top = 608.0 +margin_right = 184.0 +margin_bottom = 678.0 +size_flags_horizontal = 3 +script = ExtResource( 29 ) + +[node name="CustomEventsHeadline" type="HBoxContainer" parent="ScrollContainer/EventContainer"] +margin_top = 687.0 +margin_right = 184.0 +margin_bottom = 701.0 + +[node name="TLabel6" parent="ScrollContainer/EventContainer/CustomEventsHeadline" instance=ExtResource( 21 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 95.0 +margin_bottom = 14.0 +text = "Custom Events" +text_key = "Custom Events" + +[node name="HSeparator2" type="HSeparator" parent="ScrollContainer/EventContainer/CustomEventsHeadline"] +margin_left = 99.0 +margin_right = 184.0 +margin_bottom = 14.0 +size_flags_horizontal = 3 + +[node name="CustomEventsContainer" type="Container" parent="ScrollContainer/EventContainer"] +margin_top = 710.0 +margin_right = 184.0 +margin_bottom = 830.0 +size_flags_horizontal = 3 +script = ExtResource( 29 ) + +[node name="Spacer" type="Control" parent="ScrollContainer/EventContainer"] +margin_top = 839.0 +margin_right = 184.0 +margin_bottom = 939.0 +rect_min_size = Vector2( 0, 100 ) diff --git a/project/addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.gd b/project/addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.gd new file mode 100644 index 0000000..52f8c21 --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.gd @@ -0,0 +1,13 @@ +extends Node + +func _ready(): + var dialog = Dialogic.start(DialogicResources.get_settings_value('QuickTimelineTest', 'timeline_file', '')) + dialog.connect('dialogic_signal', self, '_on_DialogNode_dialogic_signal') + dialog.connect('timeline_end', self, '_on_DialogNode_timeline_end') + add_child(dialog) + +func _on_DialogNode_dialogic_signal(argument): + print('Signal recieved. Argument: ', argument) + +func _on_DialogNode_timeline_end(timeline): + get_tree().quit() diff --git a/project/addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.tscn b/project/addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.tscn new file mode 100644 index 0000000..0face71 --- /dev/null +++ b/project/addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/TimelineEditor/TimelineTestingScene.gd" type="Script" id=1] + +[node name="TimelineTestingScene" type="Node"] +script = ExtResource( 1 ) diff --git a/project/addons/dialogic/Editor/ValueEditor/ValueEditor.gd b/project/addons/dialogic/Editor/ValueEditor/ValueEditor.gd new file mode 100644 index 0000000..73ad91c --- /dev/null +++ b/project/addons/dialogic/Editor/ValueEditor/ValueEditor.gd @@ -0,0 +1,65 @@ +tool +extends ScrollContainer + +var editor_reference +onready var master_tree = get_node('../MasterTreeContainer/MasterTree') +var current_definition = null + +onready var nodes = { + 'name' : $VBoxContainer/HBoxContainer/VBoxContainer/Name, + 'value_editor': $VBoxContainer/HBoxContainer/Value, + 'value': $VBoxContainer/HBoxContainer/Value/ValueInput, + } + +func _ready(): + editor_reference = find_parent('EditorView') + reset_editor() + nodes['name'].connect('text_changed', self, '_on_name_changed') + nodes['name'].connect('focus_exited', self, '_update_name_on_tree') + + +func is_selected(id: String): + return current_definition != null and current_definition['id'] == id + + +func load_definition(id): + current_definition = DialogicResources.get_default_definition_item(id) + reset_editor() + nodes['name'].editable = true + nodes['name'].text = current_definition['name'] + nodes['value'].text = current_definition['value'] + +func reset_editor(): + nodes['name'].text = '' + nodes['value'].text = '' + + +func _on_name_changed(text): + if current_definition != null: + save_definition() + + +func _input(event): + if event is InputEventKey and event.pressed: + if nodes['name'].has_focus(): + if event.scancode == KEY_ENTER: + nodes['name'].release_focus() + + +func _update_name_on_tree(): + var item = master_tree.get_selected() + item.set_text(0, nodes['name'].text) + if current_definition != null: + save_definition() + master_tree.build_definitions(current_definition['id']) + + +func create_value() -> String: + var id = DialogicUtil.generate_random_id() + DialogicResources.set_default_definition_variable(id, 'New value', '') + return id + + +func save_definition(): + if current_definition != null and current_definition['id'] != '': + DialogicResources.set_default_definition_variable(current_definition['id'], nodes['name'].text, nodes['value'].text) diff --git a/project/addons/dialogic/Editor/ValueEditor/ValueEditor.tscn b/project/addons/dialogic/Editor/ValueEditor/ValueEditor.tscn new file mode 100644 index 0000000..1641896 --- /dev/null +++ b/project/addons/dialogic/Editor/ValueEditor/ValueEditor.tscn @@ -0,0 +1,62 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/ValueEditor/ValueEditor.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Editor/Common/TLabel.tscn" type="PackedScene" id=2] + +[node name="ValueEditor" type="ScrollContainer"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +margin_right = 1024.0 +margin_bottom = 600.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 1024.0 +margin_bottom = 48.0 +custom_constants/separation = 16 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] +margin_right = 300.0 +margin_bottom = 48.0 +rect_min_size = Vector2( 300, 0 ) +custom_constants/separation = 10 + +[node name="NameLabel" parent="VBoxContainer/HBoxContainer/VBoxContainer" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 300.0 +margin_bottom = 14.0 +text = "Name:" +text_key = "ValueName" + +[node name="Name" type="LineEdit" parent="VBoxContainer/HBoxContainer/VBoxContainer"] +margin_top = 24.0 +margin_right = 300.0 +margin_bottom = 48.0 + +[node name="Value" type="VBoxContainer" parent="VBoxContainer/HBoxContainer"] +margin_left = 316.0 +margin_right = 616.0 +margin_bottom = 48.0 +rect_min_size = Vector2( 300, 0 ) +custom_constants/separation = 10 + +[node name="ValueLabel" parent="VBoxContainer/HBoxContainer/Value" instance=ExtResource( 2 )] +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 300.0 +margin_bottom = 14.0 +text = "Value:" +text_key = "Value" + +[node name="ValueInput" type="LineEdit" parent="VBoxContainer/HBoxContainer/Value"] +margin_top = 24.0 +margin_right = 300.0 +margin_bottom = 48.0 diff --git a/project/addons/dialogic/Example Assets/CustomEvents/EventBlock.tscn b/project/addons/dialogic/Example Assets/CustomEvents/EventBlock.tscn new file mode 100644 index 0000000..23e2ff2 --- /dev/null +++ b/project/addons/dialogic/Example Assets/CustomEvents/EventBlock.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Templates/EventTemplate.tscn" type="PackedScene" id=1] + +[node name="ExampleCustomEvent" instance=ExtResource( 1 )] + +[node name="OptionsControl" parent="PanelContainer/MarginContainer/VBoxContainer/Header" index="7"] +items = [ "Move Up", null, 0, false, false, 0, 0, null, "", false, "Move Down", null, 0, false, false, 1, 0, null, "", false, "", null, 0, false, false, 2, 0, null, "", false, "Remove", null, 0, false, false, 3, 0, null, "", false ] diff --git a/project/addons/dialogic/Example Assets/CustomEvents/EventPart_Example.gd b/project/addons/dialogic/Example Assets/CustomEvents/EventPart_Example.gd new file mode 100644 index 0000000..832ad98 --- /dev/null +++ b/project/addons/dialogic/Example Assets/CustomEvents/EventPart_Example.gd @@ -0,0 +1,33 @@ +tool +extends "res://addons/dialogic/Editor/Events/Parts/EventPart.gd" + # has an event_data variable that stores the current data!!! + + ## node references + # e.g. +onready var input_field = $InputField + + # used to connect the signals +func _ready(): + # e.g. + input_field.connect("text_changed", self, "_on_InputField_text_changed") + pass + + # called by the event block +func load_data(data:Dictionary): + # First set the event_data + .load_data(data) + + # Now update the ui nodes to display the data. + # e.g. + input_field.text = event_data['my_text_key'] + + # has to return the wanted preview, only useful for body parts +func get_preview(): + return '' + + ## EXAMPLE CHANGE IN ONE OF THE NODES +func _on_InputField_text_changed(text): + event_data['my_text_key'] = text + + # informs the parent about the changes! + data_changed() diff --git a/project/addons/dialogic/Example Assets/CustomEvents/EventPart_Example.tscn b/project/addons/dialogic/Example Assets/CustomEvents/EventPart_Example.tscn new file mode 100644 index 0000000..313338c --- /dev/null +++ b/project/addons/dialogic/Example Assets/CustomEvents/EventPart_Example.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Editor/Events/Parts/Text/CustomLineEdit.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Example Assets/CustomEvents/EventPart_Example.gd" type="Script" id=2] + +[node name="EventPart_Example" type="HBoxContainer"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="InputField" parent="." instance=ExtResource( 1 )] +margin_top = 6.0 +margin_bottom = 33.0 diff --git a/project/addons/dialogic/Example Assets/CustomEvents/event_yourname_000.gd b/project/addons/dialogic/Example Assets/CustomEvents/event_yourname_000.gd new file mode 100644 index 0000000..2aa400c --- /dev/null +++ b/project/addons/dialogic/Example Assets/CustomEvents/event_yourname_000.gd @@ -0,0 +1,17 @@ +extends Node + + +func handle_event(event_data, dialog_node): + """ + If this event should wait for dialog advance to occur, uncomment the WAITING line + If this event should block the dialog from continuing, uncomment the WAITINT_INPUT line + While other states exist, they generally are not neccesary, but include IDLE, TYPING, and ANIMATING + """ + #dialog_node.set_state(dialog_node.state.WAITING) + #dialog_node.set_state(dialog_node.state.WAITING_INPUT) + + pass # fill with event action + + # once you want to continue with the next event + dialog_node._load_next_event() + dialog_node.set_state(dialog_node.state.READY) diff --git a/project/addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres b/project/addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres new file mode 100644 index 0000000..cd25a11 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf" type="DynamicFontData" id=1] + +[resource] +size = 30 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Example Assets/Fonts/DefaultFont.tres b/project/addons/dialogic/Example Assets/Fonts/DefaultFont.tres new file mode 100644 index 0000000..211862b --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/DefaultFont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Regular.ttf" type="DynamicFontData" id=1] + +[resource] +size = 30 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres b/project/addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres new file mode 100644 index 0000000..d5537a3 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Italic.ttf" type="DynamicFontData" id=1] + +[resource] +size = 30 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Example Assets/Fonts/GlossaryFont.tres b/project/addons/dialogic/Example Assets/Fonts/GlossaryFont.tres new file mode 100644 index 0000000..4fdd2d5 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/GlossaryFont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf" type="DynamicFontData" id=1] + +[resource] +size = 20 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Example Assets/Fonts/NameFont.tres b/project/addons/dialogic/Example Assets/Fonts/NameFont.tres new file mode 100644 index 0000000..cd25a11 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/NameFont.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf" type="DynamicFontData" id=1] + +[resource] +size = 30 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/OFL.txt b/project/addons/dialogic/Example Assets/Fonts/Overlock/OFL.txt new file mode 100644 index 0000000..3f4681a --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/Overlock/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2011, Dario Manuel Muhafara (http://www.tipo.net.ar), +with Reserved Font Names "Overlock" "Overlock SC" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf new file mode 100644 index 0000000..79ab2f6 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf differ diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-BlackItalic.ttf b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-BlackItalic.ttf new file mode 100644 index 0000000..180880d Binary files /dev/null and b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-BlackItalic.ttf differ diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Bold.ttf b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Bold.ttf new file mode 100644 index 0000000..ed50461 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Bold.ttf differ diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-BoldItalic.ttf b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-BoldItalic.ttf new file mode 100644 index 0000000..75aaf73 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-BoldItalic.ttf differ diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Italic.ttf b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Italic.ttf new file mode 100644 index 0000000..0eec646 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Italic.ttf differ diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Regular.ttf b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Regular.ttf new file mode 100644 index 0000000..6ce6a0b Binary files /dev/null and b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Regular.ttf differ diff --git a/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock.tres b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock.tres new file mode 100644 index 0000000..cd25a11 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Fonts/Overlock/Overlock.tres @@ -0,0 +1,7 @@ +[gd_resource type="DynamicFont" load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf" type="DynamicFontData" id=1] + +[resource] +size = 30 +font_data = ExtResource( 1 ) diff --git a/project/addons/dialogic/Example Assets/History/HistoryBackground.tscn b/project/addons/dialogic/Example Assets/History/HistoryBackground.tscn new file mode 100644 index 0000000..eabfb9f --- /dev/null +++ b/project/addons/dialogic/Example Assets/History/HistoryBackground.tscn @@ -0,0 +1,22 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/background-2.png" type="Texture" id=1] + +[node name="DefaultBackground" type="Panel"] +self_modulate = Color( 1, 1, 1, 0 ) +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 1 ) +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Example Assets/History/HistoryButton-theme.tres b/project/addons/dialogic/Example Assets/History/HistoryButton-theme.tres new file mode 100644 index 0000000..d22e8b5 --- /dev/null +++ b/project/addons/dialogic/Example Assets/History/HistoryButton-theme.tres @@ -0,0 +1,40 @@ +[gd_resource type="Theme" load_steps=7 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/background-2.png" type="Texture" id=1] +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/Overlock/Overlock-Black.ttf" type="DynamicFontData" id=2] + +[sub_resource type="DynamicFont" id=5] +font_data = ExtResource( 2 ) + +[sub_resource type="StyleBoxTexture" id=4] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 1175, 263 ) +margin_left = 5.0 +margin_right = 5.0 +margin_top = 5.0 +margin_bottom = 5.0 +modulate_color = Color( 1, 1, 1, 0.572549 ) + +[sub_resource type="StyleBoxTexture" id=1] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 1175, 263 ) +margin_left = 5.0 +margin_right = 5.0 +margin_top = 5.0 +margin_bottom = 5.0 + +[sub_resource type="StyleBoxTexture" id=3] +texture = ExtResource( 1 ) +region_rect = Rect2( 0, 0, 1175, 263 ) +margin_left = 5.0 +margin_right = 5.0 +margin_top = 5.0 +margin_bottom = 5.0 +modulate_color = Color( 0.113725, 0.105882, 0.105882, 0.764706 ) + +[resource] +Button/colors/font_color = Color( 1, 1, 1, 1 ) +Button/fonts/font = SubResource( 5 ) +Button/styles/hover = SubResource( 4 ) +Button/styles/normal = SubResource( 1 ) +Button/styles/pressed = SubResource( 3 ) diff --git a/project/addons/dialogic/Example Assets/History/HistoryButton.tscn b/project/addons/dialogic/Example Assets/History/HistoryButton.tscn new file mode 100644 index 0000000..691cf36 --- /dev/null +++ b/project/addons/dialogic/Example Assets/History/HistoryButton.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryButton-theme.tres" type="Theme" id=1] + +[node name="HistoryButton" type="Button"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -20.0 +margin_right = 58.0 +theme = ExtResource( 1 ) +disabled = true +text = "History" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Example Assets/History/HistoryReturnButton.tscn b/project/addons/dialogic/Example Assets/History/HistoryReturnButton.tscn new file mode 100644 index 0000000..dd19d48 --- /dev/null +++ b/project/addons/dialogic/Example Assets/History/HistoryReturnButton.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryButton-theme.tres" type="Theme" id=1] + +[node name="HistoryButton" type="Button"] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_top = -20.0 +margin_right = 58.0 +theme = ExtResource( 1 ) +disabled = true +text = "Return" +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Example Assets/History/HistoryRow.gd b/project/addons/dialogic/Example Assets/History/HistoryRow.gd new file mode 100644 index 0000000..5435418 --- /dev/null +++ b/project/addons/dialogic/Example Assets/History/HistoryRow.gd @@ -0,0 +1,96 @@ +tool +extends PanelContainer + +export(NodePath) var Audio_Button_Path = @"HBoxContainer/PlayAudioButton" +export(NodePath) var Text_Label_Path = @"HBoxContainer/RichTextLabel" + +var audioPath = '' +var AudioButton +var TextLabel +onready var TextContainer = $HBoxContainer +onready var ColorRectElement = $ColorRect +onready var TextureRectElement = $TextureRect + +""" + Example of a HistoryRow. Every time dialog is logged, a new row is created. + You can extend this class to customize the logging experience as you see fit. + + This class can be edited or replaced as long as add_history is implemented +""" + +class_name HistoryRow + +func _ready(): + TextLabel = get_node(Text_Label_Path) + AudioButton = get_node(Audio_Button_Path) + + assert(TextLabel is RichTextLabel, 'Text_Label must be a rich text label.') + assert(AudioButton is Button, 'Audio_Button must be a button.') + + +func add_history(historyString, newAudio=''): + TextLabel.append_bbcode(historyString) + audioPath = newAudio + if newAudio != '': + AudioButton.disabled = false + AudioButton.icon = load("res://addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg") + AudioButton.flat = false + else: + AudioButton.disabled = true + #AudioButton.icon = load("res://addons/dialogic/Images/Event Icons/Main Icons/text-event.svg") + AudioButton.focus_mode = FOCUS_NONE + + +# Load Theme is called by +func load_theme(theme: ConfigFile): + # Text + var theme_font = DialogicUtil.path_fixer_load(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres')) + TextLabel.set('custom_fonts/normal_font', theme_font) + TextLabel.set('custom_fonts/bold_font', DialogicUtil.path_fixer_load(theme.get_value('text', 'bold_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres'))) + TextLabel.set('custom_fonts/italics_font', DialogicUtil.path_fixer_load(theme.get_value('text', 'italic_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres'))) + #name_label.set('custom_fonts/font', DialogicUtil.path_fixer_load(theme.get_value('name', 'font', 'res://addons/dialogic/Example Assets/Fonts/NameFont.tres'))) + + # setting the vertical alignment + var alignment = theme.get_value('text', 'alignment',0) + if alignment <= 2: # top + TextContainer.alignment = BoxContainer.ALIGN_BEGIN + elif alignment <= 5: # center + TextContainer.alignment = BoxContainer.ALIGN_CENTER + elif alignment <= 8: # bottom + TextContainer.alignment = BoxContainer.ALIGN_END + + var text_color = Color(theme.get_value('text', 'color', '#ffffffff')) + TextLabel.set('custom_colors/default_color', text_color) + #name_label.set('custom_colors/font_color', text_color) + + TextLabel.set('custom_colors/font_color_shadow', Color('#00ffffff')) + #name_label.set('custom_colors/font_color_shadow', Color('#00ffffff')) + + if theme.get_value('text', 'shadow', false): + var text_shadow_color = Color(theme.get_value('text', 'shadow_color', '#9e000000')) + TextLabel.set('custom_colors/font_color_shadow', text_shadow_color) + + var shadow_offset = theme.get_value('text', 'shadow_offset', Vector2(2,2)) + TextLabel.set('custom_constants/shadow_offset_x', shadow_offset.x) + TextLabel.set('custom_constants/shadow_offset_y', shadow_offset.y) + + # Margin + var text_margin = theme.get_value('text', 'margin', Vector2(20, 10)) + TextContainer.set('margin_left', text_margin.x) + TextContainer.set('margin_right', text_margin.x * -1) + TextContainer.set('margin_top', text_margin.y) + TextContainer.set('margin_bottom', text_margin.y * -1) + + # Backgrounds + TextureRectElement.texture = DialogicUtil.path_fixer_load(theme.get_value('background','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png")) + ColorRectElement.color = Color(theme.get_value('background','color', "#ff000000")) + + if theme.get_value('background', 'modulation', false): + TextureRectElement.modulate = Color(theme.get_value('background', 'modulation_color', '#ffffffff')) + else: + TextureRectElement.modulate = Color('#ffffffff') + + ColorRectElement.visible = theme.get_value('background', 'use_color', false) + TextureRectElement.visible = theme.get_value('background', 'use_image', true) + + diff --git a/project/addons/dialogic/Example Assets/History/HistoryRow.tscn b/project/addons/dialogic/Example Assets/History/HistoryRow.tscn new file mode 100644 index 0000000..e81c835 --- /dev/null +++ b/project/addons/dialogic/Example Assets/History/HistoryRow.tscn @@ -0,0 +1,74 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryRow.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/background-2.png" type="Texture" id=2] + +[node name="HistoryRow" type="PanelContainer"] +self_modulate = Color( 1, 1, 1, 0 ) +rect_min_size = Vector2( 0, 28 ) +size_flags_horizontal = 3 +size_flags_vertical = 0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect" type="ColorRect" parent="."] +visible = false +margin_left = 7.0 +margin_top = 7.0 +margin_right = 51.0 +margin_bottom = 43.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 51.0 +margin_bottom = 43.0 +texture = ExtResource( 2 ) +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +margin_left = 7.0 +margin_top = 7.0 +margin_right = 51.0 +margin_bottom = 43.0 +size_flags_horizontal = 11 +size_flags_vertical = 3 +custom_constants/separation = 8 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="PlayAudioButton" type="Button" parent="HBoxContainer"] +margin_right = 36.0 +margin_bottom = 36.0 +rect_min_size = Vector2( 36, 36 ) +size_flags_horizontal = 4 +size_flags_vertical = 4 +flat = true +expand_icon = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RichTextLabel" type="RichTextLabel" parent="HBoxContainer"] +margin_left = 44.0 +margin_right = 44.0 +margin_bottom = 36.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +bbcode_enabled = true +meta_underlined = false +fit_content_height = true +scroll_active = false +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Beep.wav b/project/addons/dialogic/Example Assets/Sound Effects/Beep.wav new file mode 100644 index 0000000..f97cfa5 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Sound Effects/Beep.wav differ diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Beep.wav.import b/project/addons/dialogic/Example Assets/Sound Effects/Beep.wav.import new file mode 100644 index 0000000..59bc3a1 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Beep.wav.import @@ -0,0 +1,23 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.sample" + +[deps] + +source_file="res://addons/dialogic/Example Assets/Sound Effects/Beep.wav" +dest_files=[ "res://.import/Beep.wav-8a40c87ada5a0fb3b17e7da786a6259a.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/LICENSE.txt b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/LICENSE.txt new file mode 100644 index 0000000..14b8ff5 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/LICENSE.txt @@ -0,0 +1,4 @@ +Copyright (c) 2020 Tim Krief. + +Typing sound effects by Tim Krief are licensed under a Creative +Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) License. diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav new file mode 100644 index 0000000..bcb9c87 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav differ diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav.import b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav.import new file mode 100644 index 0000000..1e22e05 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav.import @@ -0,0 +1,23 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.sample" + +[deps] + +source_file="res://addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing1.wav" +dest_files=[ "res://.import/typing1.wav-9ff6b271ce4f3eefe1bc32564dd3460c.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav new file mode 100644 index 0000000..aff48fa Binary files /dev/null and b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav differ diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav.import b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav.import new file mode 100644 index 0000000..40dfc97 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav.import @@ -0,0 +1,23 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.sample" + +[deps] + +source_file="res://addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing2.wav" +dest_files=[ "res://.import/typing2.wav-6300498b36b2b3cbbfcd5b028e47ac2f.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav new file mode 100644 index 0000000..91f353b Binary files /dev/null and b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav differ diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav.import b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav.import new file mode 100644 index 0000000..6d6600d --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav.import @@ -0,0 +1,23 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/typing3.wav-c205224330b70994289dbb4ca48b4277.sample" + +[deps] + +source_file="res://addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing3.wav" +dest_files=[ "res://.import/typing3.wav-c205224330b70994289dbb4ca48b4277.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav new file mode 100644 index 0000000..071ba81 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav differ diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav.import b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav.import new file mode 100644 index 0000000..7438069 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav.import @@ -0,0 +1,23 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/typing4.wav-c0772ca318969a007c12c2d606458087.sample" + +[deps] + +source_file="res://addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing4.wav" +dest_files=[ "res://.import/typing4.wav-c0772ca318969a007c12c2d606458087.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav new file mode 100644 index 0000000..9143081 Binary files /dev/null and b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav differ diff --git a/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav.import b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav.import new file mode 100644 index 0000000..d595cc9 --- /dev/null +++ b/project/addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav.import @@ -0,0 +1,23 @@ +[remap] + +importer="wav" +type="AudioStreamSample" +path="res://.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.sample" + +[deps] + +source_file="res://addons/dialogic/Example Assets/Sound Effects/Keyboard Noises/typing5.wav" +dest_files=[ "res://.import/typing5.wav-18d3a5e3d0af1e07d53b8606cfa86aa3.sample" ] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/project/addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres b/project/addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres new file mode 100644 index 0000000..7fac3de --- /dev/null +++ b/project/addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres @@ -0,0 +1,12 @@ +[gd_resource type="StyleBoxFlat" format=2] + +[resource] +bg_color = Color( 0.160784, 0.160784, 0.160784, 1 ) +corner_radius_top_left = 2 +corner_radius_top_right = 2 +corner_radius_bottom_right = 2 +corner_radius_bottom_left = 2 +expand_margin_left = 5.0 +expand_margin_right = 5.0 +expand_margin_top = 5.0 +expand_margin_bottom = 5.0 diff --git a/project/addons/dialogic/Example Assets/backgrounds/background-1.png b/project/addons/dialogic/Example Assets/backgrounds/background-1.png new file mode 100644 index 0000000..34fd232 Binary files /dev/null and b/project/addons/dialogic/Example Assets/backgrounds/background-1.png differ diff --git a/project/addons/dialogic/Example Assets/backgrounds/background-1.png.import b/project/addons/dialogic/Example Assets/backgrounds/background-1.png.import new file mode 100644 index 0000000..5fd466a --- /dev/null +++ b/project/addons/dialogic/Example Assets/backgrounds/background-1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Example Assets/backgrounds/background-1.png" +dest_files=[ "res://.import/background-1.png-1fc779d8fd5d0bc2346042b70def9109.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Example Assets/backgrounds/background-2.png b/project/addons/dialogic/Example Assets/backgrounds/background-2.png new file mode 100644 index 0000000..e5b33af Binary files /dev/null and b/project/addons/dialogic/Example Assets/backgrounds/background-2.png differ diff --git a/project/addons/dialogic/Example Assets/backgrounds/background-2.png.import b/project/addons/dialogic/Example Assets/backgrounds/background-2.png.import new file mode 100644 index 0000000..1c6eb1d --- /dev/null +++ b/project/addons/dialogic/Example Assets/backgrounds/background-2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Example Assets/backgrounds/background-2.png" +dest_files=[ "res://.import/background-2.png-16cefbac02f843f04a3346ffecedf6b6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Example Assets/next-indicator/next-indicator.png b/project/addons/dialogic/Example Assets/next-indicator/next-indicator.png new file mode 100644 index 0000000..f26ed34 Binary files /dev/null and b/project/addons/dialogic/Example Assets/next-indicator/next-indicator.png differ diff --git a/project/addons/dialogic/Example Assets/next-indicator/next-indicator.png.import b/project/addons/dialogic/Example Assets/next-indicator/next-indicator.png.import new file mode 100644 index 0000000..c5dee09 --- /dev/null +++ b/project/addons/dialogic/Example Assets/next-indicator/next-indicator.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Example Assets/next-indicator/next-indicator.png" +dest_files=[ "res://.import/next-indicator.png-e3b7b80d9da791a1d0a061a728b6f781.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Example Assets/portraits/df-1.png b/project/addons/dialogic/Example Assets/portraits/df-1.png new file mode 100644 index 0000000..0245f48 Binary files /dev/null and b/project/addons/dialogic/Example Assets/portraits/df-1.png differ diff --git a/project/addons/dialogic/Example Assets/portraits/df-1.png.import b/project/addons/dialogic/Example Assets/portraits/df-1.png.import new file mode 100644 index 0000000..2300027 --- /dev/null +++ b/project/addons/dialogic/Example Assets/portraits/df-1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Example Assets/portraits/df-1.png" +dest_files=[ "res://.import/df-1.png-dd38cabf6782fa8ec6317d8193b3bb58.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Example Assets/portraits/df-2.png b/project/addons/dialogic/Example Assets/portraits/df-2.png new file mode 100644 index 0000000..441c740 Binary files /dev/null and b/project/addons/dialogic/Example Assets/portraits/df-2.png differ diff --git a/project/addons/dialogic/Example Assets/portraits/df-2.png.import b/project/addons/dialogic/Example Assets/portraits/df-2.png.import new file mode 100644 index 0000000..f1a9767 --- /dev/null +++ b/project/addons/dialogic/Example Assets/portraits/df-2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/df-2.png-6e4167303060ad7b046acda78c51329c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Example Assets/portraits/df-2.png" +dest_files=[ "res://.import/df-2.png-6e4167303060ad7b046acda78c51329c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Example Assets/portraits/df-3.png b/project/addons/dialogic/Example Assets/portraits/df-3.png new file mode 100644 index 0000000..6743c91 Binary files /dev/null and b/project/addons/dialogic/Example Assets/portraits/df-3.png differ diff --git a/project/addons/dialogic/Example Assets/portraits/df-3.png.import b/project/addons/dialogic/Example Assets/portraits/df-3.png.import new file mode 100644 index 0000000..0d2acbd --- /dev/null +++ b/project/addons/dialogic/Example Assets/portraits/df-3.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Example Assets/portraits/df-3.png" +dest_files=[ "res://.import/df-3.png-e1bbeb9edcf0b295ecce73d91ad4c986.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Context Menus/Remove.svg b/project/addons/dialogic/Images/Context Menus/Remove.svg new file mode 100644 index 0000000..9372eb0 --- /dev/null +++ b/project/addons/dialogic/Images/Context Menus/Remove.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/project/addons/dialogic/Images/Context Menus/Remove.svg.import b/project/addons/dialogic/Images/Context Menus/Remove.svg.import new file mode 100644 index 0000000..850b098 --- /dev/null +++ b/project/addons/dialogic/Images/Context Menus/Remove.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Context Menus/Remove.svg" +dest_files=[ "res://.import/Remove.svg-e6ac0bc0ace4deeae8709012158798f8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg new file mode 100644 index 0000000..dd1b9a8 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg.import new file mode 100644 index 0000000..ae0a040 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/audio-event.svg" +dest_files=[ "res://.import/audio-event.svg-d192398662daf4684b0a1cb09391d1c1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/background-music.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/background-music.svg new file mode 100644 index 0000000..d7fc035 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/background-music.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/background-music.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/background-music.svg.import new file mode 100644 index 0000000..146cbf0 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/background-music.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/background-music.svg" +dest_files=[ "res://.import/background-music.svg-ed735c7eb8946611ace4908d8c03f881.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/call-node.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/call-node.svg new file mode 100644 index 0000000..a2cd685 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/call-node.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/call-node.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/call-node.svg.import new file mode 100644 index 0000000..d5dbe25 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/call-node.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/call-node.svg" +dest_files=[ "res://.import/call-node.svg-18ac09155d5b32a52ebd8691a3af4366.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg new file mode 100644 index 0000000..ec56680 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg.import new file mode 100644 index 0000000..5d3697c --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/change-background.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/change-background.svg" +dest_files=[ "res://.import/change-background.svg-b779e98a98d293a18e8d288547972610.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg new file mode 100644 index 0000000..3b78c7c --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg.import new file mode 100644 index 0000000..acaa74c --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/change-scene.svg" +dest_files=[ "res://.import/change-scene.svg-6725a8049733078ddbd90a4b2658171a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg new file mode 100644 index 0000000..c5041a3 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg.import new file mode 100644 index 0000000..900d87f --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/change-timeline.svg" +dest_files=[ "res://.import/change-timeline.svg-3fc1cb78cceef83db78cae34f53baa54.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/character.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/character.svg new file mode 100644 index 0000000..a81fc4d --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/character.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/character.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/character.svg.import new file mode 100644 index 0000000..5a8ee95 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/character.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/character.svg" +dest_files=[ "res://.import/character.svg-673b36f24b45dbf2773f02c6fa0eb3f0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/choice.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/choice.svg new file mode 100644 index 0000000..78896bc --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/choice.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/choice.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/choice.svg.import new file mode 100644 index 0000000..b061892 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/choice.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/choice.svg-13eab5623c86309807d0cbedab2ce888.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/choice.svg" +dest_files=[ "res://.import/choice.svg-13eab5623c86309807d0cbedab2ce888.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg new file mode 100644 index 0000000..7ef2fd9 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg.import new file mode 100644 index 0000000..6a857ca --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/close-dialog.svg" +dest_files=[ "res://.import/close-dialog.svg-bb378589acef276803372ba9bd39145a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/condition.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/condition.svg new file mode 100644 index 0000000..bd4b6df --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/condition.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/condition.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/condition.svg.import new file mode 100644 index 0000000..25e9d41 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/condition.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/condition.svg" +dest_files=[ "res://.import/condition.svg-9263ad20f1666fc3284ae39867031dd1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg new file mode 100644 index 0000000..2d899cf --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg.import new file mode 100644 index 0000000..3c8127e --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/custom-event.svg" +dest_files=[ "res://.import/custom-event.svg-61c74689fdedceabc20c58e3a5fdb790.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg new file mode 100644 index 0000000..fbe9247 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg.import new file mode 100644 index 0000000..09d2cda --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/emit-signal.svg" +dest_files=[ "res://.import/emit-signal.svg-e7476cdba0b41b81b70ecd21f85b0b2f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg new file mode 100644 index 0000000..5c07aeb --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg.import new file mode 100644 index 0000000..76afccb --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/end-branch.svg" +dest_files=[ "res://.import/end-branch.svg-393dc31ec86d0bbd6ec737e9a12197f7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/go-to.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/go-to.svg new file mode 100644 index 0000000..b00cb71 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/go-to.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/go-to.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/go-to.svg.import new file mode 100644 index 0000000..1cdd79b --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/go-to.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/go-to.svg" +dest_files=[ "res://.import/go-to.svg-119e813c34907fb6f30d6ed2a5cdc6b9.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/label.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/label.svg new file mode 100644 index 0000000..ef4ebe7 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/label.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/label.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/label.svg.import new file mode 100644 index 0000000..db4580b --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/label.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/label.svg" +dest_files=[ "res://.import/label.svg-06aec152723c3fcf6a4a30c809ff95ca.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/question.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/question.svg new file mode 100644 index 0000000..ad13f80 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/question.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/question.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/question.svg.import new file mode 100644 index 0000000..ae5d76c --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/question.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/question.svg-e8715956b6df35b64adef0a9d414d62b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/question.svg" +dest_files=[ "res://.import/question.svg-e8715956b6df35b64adef0a9d414d62b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg new file mode 100644 index 0000000..320dd08 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg.import new file mode 100644 index 0000000..8f9f971 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/save-icon.svg" +dest_files=[ "res://.import/save-icon.svg-c1c4c7c762fbbb1d60a352823ed4a7b3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg new file mode 100644 index 0000000..6a9411f --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg.import new file mode 100644 index 0000000..477fa61 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/set-glossary.svg" +dest_files=[ "res://.import/set-glossary.svg-4d41f2a240341526674b450e964b979b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg new file mode 100644 index 0000000..7fb4774 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg.import new file mode 100644 index 0000000..89d5f5e --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/set-theme.svg" +dest_files=[ "res://.import/set-theme.svg-1d90327d314f7032240973a0de491cbf.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/set-value.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/set-value.svg new file mode 100644 index 0000000..8545d00 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/set-value.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/set-value.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/set-value.svg.import new file mode 100644 index 0000000..adfd32f --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/set-value.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/set-value.svg" +dest_files=[ "res://.import/set-value.svg-6fb3742ed5c2df51d2350fc9d9c789b0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/text-event.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/text-event.svg new file mode 100644 index 0000000..e64424a --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/text-event.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/text-event.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/text-event.svg.import new file mode 100644 index 0000000..c6a8ccc --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/text-event.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/text-event.svg" +dest_files=[ "res://.import/text-event.svg-c2eab2588af7e9e8b6272730719be2c6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg b/project/addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg new file mode 100644 index 0000000..1c5a978 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg.import b/project/addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg.import new file mode 100644 index 0000000..c260c72 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Main Icons/wait-seconds.svg" +dest_files=[ "res://.import/wait-seconds.svg-bfe0671e761c4874421ab49eb39943d7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/Portrait.svg b/project/addons/dialogic/Images/Event Icons/Portrait.svg new file mode 100644 index 0000000..e7bc69d --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Portrait.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/Portrait.svg.import b/project/addons/dialogic/Images/Event Icons/Portrait.svg.import new file mode 100644 index 0000000..f834383 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/Portrait.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/Portrait.svg" +dest_files=[ "res://.import/Portrait.svg-f37a4a2fd15fb13cfe91413c3b2384b1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/character-join.svg b/project/addons/dialogic/Images/Event Icons/character-join.svg new file mode 100644 index 0000000..ae2eadc --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/character-join.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Event Icons/character-join.svg.import b/project/addons/dialogic/Images/Event Icons/character-join.svg.import new file mode 100644 index 0000000..506bfef --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/character-join.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/character-join.svg" +dest_files=[ "res://.import/character-join.svg-18bdcb819b53221120d980471e3e3d32.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/character-leave.svg b/project/addons/dialogic/Images/Event Icons/character-leave.svg new file mode 100644 index 0000000..ec10a0b --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/character-leave.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Event Icons/character-leave.svg.import b/project/addons/dialogic/Images/Event Icons/character-leave.svg.import new file mode 100644 index 0000000..dd83183 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/character-leave.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/character-leave.svg" +dest_files=[ "res://.import/character-leave.svg-95abf444b6078dd9d945a62d79c6512b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/character.svg b/project/addons/dialogic/Images/Event Icons/character.svg new file mode 100644 index 0000000..28ff003 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/character.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Event Icons/character.svg.import b/project/addons/dialogic/Images/Event Icons/character.svg.import new file mode 100644 index 0000000..5e774ec --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/character.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/character.svg" +dest_files=[ "res://.import/character.svg-89c6ba7fbc42ad2d5168608df91b8534.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/event-outline.svg b/project/addons/dialogic/Images/Event Icons/event-outline.svg new file mode 100644 index 0000000..970d0b7 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/event-outline.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/event-outline.svg.import b/project/addons/dialogic/Images/Event Icons/event-outline.svg.import new file mode 100644 index 0000000..e680ebf --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/event-outline.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/event-outline.svg" +dest_files=[ "res://.import/event-outline.svg-dc6df459774b696f133781b19e6a23b1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/event-solid.svg b/project/addons/dialogic/Images/Event Icons/event-solid.svg new file mode 100644 index 0000000..aeeb761 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/event-solid.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/event-solid.svg.import b/project/addons/dialogic/Images/Event Icons/event-solid.svg.import new file mode 100644 index 0000000..d2f4709 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/event-solid.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/event-solid.svg" +dest_files=[ "res://.import/event-solid.svg-cce07667012ff90529b2ea6eca09ef64.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/label.svg b/project/addons/dialogic/Images/Event Icons/label.svg new file mode 100644 index 0000000..3e4a6f1 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/label.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/label.svg.import b/project/addons/dialogic/Images/Event Icons/label.svg.import new file mode 100644 index 0000000..4c0a944 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/label.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/label.svg-1e5369b09915049583eed270d116d4e1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/label.svg" +dest_files=[ "res://.import/label.svg-1e5369b09915049583eed270d116d4e1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Event Icons/warning.svg b/project/addons/dialogic/Images/Event Icons/warning.svg new file mode 100644 index 0000000..a252bde --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Event Icons/warning.svg.import b/project/addons/dialogic/Images/Event Icons/warning.svg.import new file mode 100644 index 0000000..a40fd46 --- /dev/null +++ b/project/addons/dialogic/Images/Event Icons/warning.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Event Icons/warning.svg" +dest_files=[ "res://.import/warning.svg-b11873783fddb6d7d28efa2bfd5dde85.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Pieces/closed-icon.svg b/project/addons/dialogic/Images/Pieces/closed-icon.svg new file mode 100644 index 0000000..4032eab --- /dev/null +++ b/project/addons/dialogic/Images/Pieces/closed-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Pieces/closed-icon.svg.import b/project/addons/dialogic/Images/Pieces/closed-icon.svg.import new file mode 100644 index 0000000..d048b50 --- /dev/null +++ b/project/addons/dialogic/Images/Pieces/closed-icon.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Pieces/closed-icon.svg" +dest_files=[ "res://.import/closed-icon.svg-b4822d061d964b0ee1a7fa1cc7cd7a4c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Pieces/expand-icon.svg b/project/addons/dialogic/Images/Pieces/expand-icon.svg new file mode 100644 index 0000000..3ec3def --- /dev/null +++ b/project/addons/dialogic/Images/Pieces/expand-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Pieces/expand-icon.svg.import b/project/addons/dialogic/Images/Pieces/expand-icon.svg.import new file mode 100644 index 0000000..7fd20ff --- /dev/null +++ b/project/addons/dialogic/Images/Pieces/expand-icon.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Pieces/expand-icon.svg" +dest_files=[ "res://.import/expand-icon.svg-1c8e60c84d41732547c2efaeb5ea7d61.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Pieces/open-icon.svg b/project/addons/dialogic/Images/Pieces/open-icon.svg new file mode 100644 index 0000000..c66c422 --- /dev/null +++ b/project/addons/dialogic/Images/Pieces/open-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Pieces/open-icon.svg.import b/project/addons/dialogic/Images/Pieces/open-icon.svg.import new file mode 100644 index 0000000..cf363d9 --- /dev/null +++ b/project/addons/dialogic/Images/Pieces/open-icon.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Pieces/open-icon.svg" +dest_files=[ "res://.import/open-icon.svg-425ea3b137355c35fcecd5dde0b0ca7b.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/placeholder.png b/project/addons/dialogic/Images/Plugin/placeholder.png new file mode 100644 index 0000000..513f51a Binary files /dev/null and b/project/addons/dialogic/Images/Plugin/placeholder.png differ diff --git a/project/addons/dialogic/Images/Plugin/placeholder.png.import b/project/addons/dialogic/Images/Plugin/placeholder.png.import new file mode 100644 index 0000000..6d75bd0 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/placeholder.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/placeholder.png" +dest_files=[ "res://.import/placeholder.png-6d0c54195bfc7f2fee1c48a6dc2863f5.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg new file mode 100644 index 0000000..240f0ed --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg.import new file mode 100644 index 0000000..fb47bc6 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-0.75.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme-0.75.svg-e385f2d5f8698a1eb274188a6319de45.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg new file mode 100644 index 0000000..8a72c73 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg.import new file mode 100644 index 0000000..7ab138f --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.25.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme-1.25.svg-77426e66de94b03eee223702e494fc59.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg new file mode 100644 index 0000000..ff6ec1e --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg.import new file mode 100644 index 0000000..c8c98bc --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.5.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme-1.5.svg-929f75a0513df90d21fa132ddf63d8c2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg new file mode 100644 index 0000000..117953d --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg.import new file mode 100644 index 0000000..4ef7554 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.75.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme-1.75.svg-4aa36b7d72fd87a7a254633a6422ee50.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg new file mode 100644 index 0000000..b85c9a3 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg.import new file mode 100644 index 0000000..cd69d00 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-1.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme-1.svg-d64b8c8865f9b1cc41ae5f2610c77bca.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg new file mode 100644 index 0000000..94a9002 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg.import new file mode 100644 index 0000000..dc087bd --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme-2.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme-2.svg-a093879dab0b11ee3cff0e5413cc6170.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg new file mode 100644 index 0000000..032b806 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg.import new file mode 100644 index 0000000..2561f03 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-dark-theme.svg" +dest_files=[ "res://.import/plugin-editor-icon-dark-theme.svg-4945c419e7e7434b4eff87c00fedb862.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg new file mode 100644 index 0000000..3943bcd --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg.import new file mode 100644 index 0000000..7fb8cc0 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-0.75.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme-0.75.svg-b0084f7944d498c708ed5783cbfa3c02.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg new file mode 100644 index 0000000..d7a668d --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg.import new file mode 100644 index 0000000..f0cd8d1 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.25.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme-1.25.svg-b4a3d8bc3495118f83700d2ce43b9be7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg new file mode 100644 index 0000000..4030850 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg.import new file mode 100644 index 0000000..7e9856f --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.5.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme-1.5.svg-f900489ee9fce4301b8f007f506f3191.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg new file mode 100644 index 0000000..3ccd37b --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg.import new file mode 100644 index 0000000..d60ada3 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.75.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme-1.75.svg-bdebfc66b49fc138951dde8a5be12ad7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg new file mode 100644 index 0000000..d60c4bd --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg.import new file mode 100644 index 0000000..c352ba2 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-1.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme-1.svg-84bb375f8bd3080f4537646a33b4b1f1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg new file mode 100644 index 0000000..2994d84 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg.import new file mode 100644 index 0000000..544e99a --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme-2.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme-2.svg-c96a194e2c41299d9490146c0e071557.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg new file mode 100644 index 0000000..3cd57a6 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg.import b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg.import new file mode 100644 index 0000000..cd4e369 --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/plugin-editor-icon-light-theme.svg" +dest_files=[ "res://.import/plugin-editor-icon-light-theme.svg-fbd42cd06e4ce1cb7eef3585a7eb830a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Plugin/white-texture.png b/project/addons/dialogic/Images/Plugin/white-texture.png new file mode 100644 index 0000000..3ea329f Binary files /dev/null and b/project/addons/dialogic/Images/Plugin/white-texture.png differ diff --git a/project/addons/dialogic/Images/Plugin/white-texture.png.import b/project/addons/dialogic/Images/Plugin/white-texture.png.import new file mode 100644 index 0000000..d2dab6e --- /dev/null +++ b/project/addons/dialogic/Images/Plugin/white-texture.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Plugin/white-texture.png" +dest_files=[ "res://.import/white-texture.png-3e7634c71bce7fffbaf080398917b5b3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/character-1.25.svg b/project/addons/dialogic/Images/Resources/character-1.25.svg new file mode 100644 index 0000000..28ff003 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/character-1.25.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Resources/character-1.25.svg.import b/project/addons/dialogic/Images/Resources/character-1.25.svg.import new file mode 100644 index 0000000..60edf7a --- /dev/null +++ b/project/addons/dialogic/Images/Resources/character-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/character-1.25.svg" +dest_files=[ "res://.import/character-1.25.svg-f8560c64a6c9ea126837d22490545cc1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/character-2.svg b/project/addons/dialogic/Images/Resources/character-2.svg new file mode 100644 index 0000000..abcc1ab --- /dev/null +++ b/project/addons/dialogic/Images/Resources/character-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Resources/character-2.svg.import b/project/addons/dialogic/Images/Resources/character-2.svg.import new file mode 100644 index 0000000..17d857b --- /dev/null +++ b/project/addons/dialogic/Images/Resources/character-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/character-2.svg" +dest_files=[ "res://.import/character-2.svg-6a7c147375663e487c6aad504c0ac5e9.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/character.svg b/project/addons/dialogic/Images/Resources/character.svg new file mode 100644 index 0000000..8871f5e --- /dev/null +++ b/project/addons/dialogic/Images/Resources/character.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Resources/character.svg.import b/project/addons/dialogic/Images/Resources/character.svg.import new file mode 100644 index 0000000..01e633b --- /dev/null +++ b/project/addons/dialogic/Images/Resources/character.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/character.svg-dce8982b5c5669e98479bbff64aab08f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/character.svg" +dest_files=[ "res://.import/character.svg-dce8982b5c5669e98479bbff64aab08f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/definition-1.25.svg b/project/addons/dialogic/Images/Resources/definition-1.25.svg new file mode 100644 index 0000000..ed40659 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/definition-1.25.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Resources/definition-1.25.svg.import b/project/addons/dialogic/Images/Resources/definition-1.25.svg.import new file mode 100644 index 0000000..58ab1f8 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/definition-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/definition-1.25.svg" +dest_files=[ "res://.import/definition-1.25.svg-7298ef82f76fa611485bd53d1f0aebe0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/definition-2.svg b/project/addons/dialogic/Images/Resources/definition-2.svg new file mode 100644 index 0000000..6fca867 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/definition-2.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Resources/definition-2.svg.import b/project/addons/dialogic/Images/Resources/definition-2.svg.import new file mode 100644 index 0000000..db8719b --- /dev/null +++ b/project/addons/dialogic/Images/Resources/definition-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/definition-2.svg" +dest_files=[ "res://.import/definition-2.svg-533f2834cedbb3e21c178f7a40ec34a3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/definition.svg b/project/addons/dialogic/Images/Resources/definition.svg new file mode 100644 index 0000000..236ca35 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/definition.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Resources/definition.svg.import b/project/addons/dialogic/Images/Resources/definition.svg.import new file mode 100644 index 0000000..785e75b --- /dev/null +++ b/project/addons/dialogic/Images/Resources/definition.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/definition.svg" +dest_files=[ "res://.import/definition.svg-336e1b41e3ab4ef43367e0f0bbc50c2c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/theme-1.25.svg b/project/addons/dialogic/Images/Resources/theme-1.25.svg new file mode 100644 index 0000000..e21235f --- /dev/null +++ b/project/addons/dialogic/Images/Resources/theme-1.25.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Resources/theme-1.25.svg.import b/project/addons/dialogic/Images/Resources/theme-1.25.svg.import new file mode 100644 index 0000000..514caf5 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/theme-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/theme-1.25.svg" +dest_files=[ "res://.import/theme-1.25.svg-77e4506f492a590268d4307cdc31e4f8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/theme-2.svg b/project/addons/dialogic/Images/Resources/theme-2.svg new file mode 100644 index 0000000..1638601 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/theme-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Resources/theme-2.svg.import b/project/addons/dialogic/Images/Resources/theme-2.svg.import new file mode 100644 index 0000000..920e514 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/theme-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/theme-2.svg" +dest_files=[ "res://.import/theme-2.svg-17486fa9879ca7d5056e82b248808b3d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/theme.svg b/project/addons/dialogic/Images/Resources/theme.svg new file mode 100644 index 0000000..c6fd1ef --- /dev/null +++ b/project/addons/dialogic/Images/Resources/theme.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Resources/theme.svg.import b/project/addons/dialogic/Images/Resources/theme.svg.import new file mode 100644 index 0000000..9245f12 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/theme.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/theme.svg" +dest_files=[ "res://.import/theme.svg-d2e167fcbacd86111397e731ff3f28eb.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/timeline-1.25.svg b/project/addons/dialogic/Images/Resources/timeline-1.25.svg new file mode 100644 index 0000000..daaf48b --- /dev/null +++ b/project/addons/dialogic/Images/Resources/timeline-1.25.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/project/addons/dialogic/Images/Resources/timeline-1.25.svg.import b/project/addons/dialogic/Images/Resources/timeline-1.25.svg.import new file mode 100644 index 0000000..3c00a42 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/timeline-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/timeline-1.25.svg" +dest_files=[ "res://.import/timeline-1.25.svg-1c9e495370ebe35a5587d303d470cad6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/timeline-2.svg b/project/addons/dialogic/Images/Resources/timeline-2.svg new file mode 100644 index 0000000..732fecd --- /dev/null +++ b/project/addons/dialogic/Images/Resources/timeline-2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/project/addons/dialogic/Images/Resources/timeline-2.svg.import b/project/addons/dialogic/Images/Resources/timeline-2.svg.import new file mode 100644 index 0000000..3ad8ed3 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/timeline-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/timeline-2.svg" +dest_files=[ "res://.import/timeline-2.svg-48d1e0a121d5a544a47b67fe1241eed2.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Resources/timeline.svg b/project/addons/dialogic/Images/Resources/timeline.svg new file mode 100644 index 0000000..a22928f --- /dev/null +++ b/project/addons/dialogic/Images/Resources/timeline.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/project/addons/dialogic/Images/Resources/timeline.svg.import b/project/addons/dialogic/Images/Resources/timeline.svg.import new file mode 100644 index 0000000..fe7b339 --- /dev/null +++ b/project/addons/dialogic/Images/Resources/timeline.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Resources/timeline.svg" +dest_files=[ "res://.import/timeline.svg-4646668e3960b7f37ecffae1640eccc7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-character-1.25.svg b/project/addons/dialogic/Images/Toolbar/add-character-1.25.svg new file mode 100644 index 0000000..da2fd66 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-character-1.25.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-character-1.25.svg.import b/project/addons/dialogic/Images/Toolbar/add-character-1.25.svg.import new file mode 100644 index 0000000..cc02e40 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-character-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-character-1.25.svg" +dest_files=[ "res://.import/add-character-1.25.svg-3c1ef7e0cdcd97fe5a24f5d6eb32b444.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-character-2.svg b/project/addons/dialogic/Images/Toolbar/add-character-2.svg new file mode 100644 index 0000000..03137b5 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-character-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-character-2.svg.import b/project/addons/dialogic/Images/Toolbar/add-character-2.svg.import new file mode 100644 index 0000000..dc04cab --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-character-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-character-2.svg" +dest_files=[ "res://.import/add-character-2.svg-9c2d45663361c0aec7fda875cb579ae0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-character.svg b/project/addons/dialogic/Images/Toolbar/add-character.svg new file mode 100644 index 0000000..9a42063 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-character.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-character.svg.import b/project/addons/dialogic/Images/Toolbar/add-character.svg.import new file mode 100644 index 0000000..7e20c22 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-character.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-character.svg" +dest_files=[ "res://.import/add-character.svg-24c4802c30d4441d70c317a53eb83e45.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-definition-1.25.svg b/project/addons/dialogic/Images/Toolbar/add-definition-1.25.svg new file mode 100644 index 0000000..89b70b1 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-definition-1.25.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-definition-1.25.svg.import b/project/addons/dialogic/Images/Toolbar/add-definition-1.25.svg.import new file mode 100644 index 0000000..e7effca --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-definition-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-definition-1.25.svg" +dest_files=[ "res://.import/add-definition-1.25.svg-4ebed8c9b38e990b8d2551e3cef70881.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-definition-2.svg b/project/addons/dialogic/Images/Toolbar/add-definition-2.svg new file mode 100644 index 0000000..ec25605 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-definition-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-definition-2.svg.import b/project/addons/dialogic/Images/Toolbar/add-definition-2.svg.import new file mode 100644 index 0000000..70e055a --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-definition-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-definition-2.svg" +dest_files=[ "res://.import/add-definition-2.svg-454918059b27eb1572e6513a053c2567.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-definition.svg b/project/addons/dialogic/Images/Toolbar/add-definition.svg new file mode 100644 index 0000000..23fbfed --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-definition.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-definition.svg.import b/project/addons/dialogic/Images/Toolbar/add-definition.svg.import new file mode 100644 index 0000000..bbb1949 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-definition.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-definition.svg" +dest_files=[ "res://.import/add-definition.svg-6c717aad0d8623c9b81b21cb29fd99b6.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-glossary-1.25.svg b/project/addons/dialogic/Images/Toolbar/add-glossary-1.25.svg new file mode 100644 index 0000000..ca3cd08 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-glossary-1.25.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-glossary-1.25.svg.import b/project/addons/dialogic/Images/Toolbar/add-glossary-1.25.svg.import new file mode 100644 index 0000000..714c608 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-glossary-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-glossary-1.25.svg" +dest_files=[ "res://.import/add-glossary-1.25.svg-2a0f52cc956c5e96cc6cd47ec2e7c9fc.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-glossary-2.svg b/project/addons/dialogic/Images/Toolbar/add-glossary-2.svg new file mode 100644 index 0000000..e2bac55 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-glossary-2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-glossary-2.svg.import b/project/addons/dialogic/Images/Toolbar/add-glossary-2.svg.import new file mode 100644 index 0000000..f56beb2 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-glossary-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-glossary-2.svg" +dest_files=[ "res://.import/add-glossary-2.svg-df70e38f107b9fc6109af658c7e14964.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-glossary.svg b/project/addons/dialogic/Images/Toolbar/add-glossary.svg new file mode 100644 index 0000000..9293f3f --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-glossary.svg @@ -0,0 +1,4 @@ + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-glossary.svg.import b/project/addons/dialogic/Images/Toolbar/add-glossary.svg.import new file mode 100644 index 0000000..7088f21 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-glossary.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-glossary.svg" +dest_files=[ "res://.import/add-glossary.svg-ca3a2211ead16a8ddd6c7fce1fbd838d.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-theme-1.25.svg b/project/addons/dialogic/Images/Toolbar/add-theme-1.25.svg new file mode 100644 index 0000000..97c347e --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-theme-1.25.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-theme-1.25.svg.import b/project/addons/dialogic/Images/Toolbar/add-theme-1.25.svg.import new file mode 100644 index 0000000..5ccc9f4 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-theme-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-theme-1.25.svg" +dest_files=[ "res://.import/add-theme-1.25.svg-4a12f9dc653eaf7ddeb686d60e81dccd.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-theme-2.svg b/project/addons/dialogic/Images/Toolbar/add-theme-2.svg new file mode 100644 index 0000000..c94ae67 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-theme-2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-theme-2.svg.import b/project/addons/dialogic/Images/Toolbar/add-theme-2.svg.import new file mode 100644 index 0000000..69fc6b1 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-theme-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-theme-2.svg" +dest_files=[ "res://.import/add-theme-2.svg-c08a48497308cf495f82550c69ecc0ef.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-theme.svg b/project/addons/dialogic/Images/Toolbar/add-theme.svg new file mode 100644 index 0000000..3e21c7a --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-theme.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-theme.svg.import b/project/addons/dialogic/Images/Toolbar/add-theme.svg.import new file mode 100644 index 0000000..7ad3cb0 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-theme.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-theme.svg" +dest_files=[ "res://.import/add-theme.svg-56f6ced420900816b1a7d2a532d59732.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-timeline-1.25.svg b/project/addons/dialogic/Images/Toolbar/add-timeline-1.25.svg new file mode 100644 index 0000000..42852f5 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-timeline-1.25.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-timeline-1.25.svg.import b/project/addons/dialogic/Images/Toolbar/add-timeline-1.25.svg.import new file mode 100644 index 0000000..906c991 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-timeline-1.25.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-timeline-1.25.svg" +dest_files=[ "res://.import/add-timeline-1.25.svg-67e7c82a2cbaaed1f1477d82ecb8ce71.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-timeline-2.svg b/project/addons/dialogic/Images/Toolbar/add-timeline-2.svg new file mode 100644 index 0000000..031a108 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-timeline-2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-timeline-2.svg.import b/project/addons/dialogic/Images/Toolbar/add-timeline-2.svg.import new file mode 100644 index 0000000..3c655ab --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-timeline-2.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-timeline-2.svg" +dest_files=[ "res://.import/add-timeline-2.svg-00b3bf905c7bd2ca1fece872d753dfef.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Toolbar/add-timeline.svg b/project/addons/dialogic/Images/Toolbar/add-timeline.svg new file mode 100644 index 0000000..5fa7ac1 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-timeline.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/project/addons/dialogic/Images/Toolbar/add-timeline.svg.import b/project/addons/dialogic/Images/Toolbar/add-timeline.svg.import new file mode 100644 index 0000000..2873797 --- /dev/null +++ b/project/addons/dialogic/Images/Toolbar/add-timeline.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Toolbar/add-timeline.svg" +dest_files=[ "res://.import/add-timeline.svg-fc120773b7d10b417503abc3c1b33ca0.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Images/Tutorials/arrow-down.svg b/project/addons/dialogic/Images/Tutorials/arrow-down.svg new file mode 100644 index 0000000..eead621 --- /dev/null +++ b/project/addons/dialogic/Images/Tutorials/arrow-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/project/addons/dialogic/Images/Tutorials/arrow-down.svg.import b/project/addons/dialogic/Images/Tutorials/arrow-down.svg.import new file mode 100644 index 0000000..88842ca --- /dev/null +++ b/project/addons/dialogic/Images/Tutorials/arrow-down.svg.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/dialogic/Images/Tutorials/arrow-down.svg" +dest_files=[ "res://.import/arrow-down.svg-82927ec9bdee161b2d27d6f4808e76b4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=false +svg/scale=1.0 diff --git a/project/addons/dialogic/Localization/dialogic.csv b/project/addons/dialogic/Localization/dialogic.csv new file mode 100644 index 0000000..c3041e4 --- /dev/null +++ b/project/addons/dialogic/Localization/dialogic.csv @@ -0,0 +1,184 @@ +id,zh_CN,en,es,fr,de +## TIMELINE EDITOR ---------------------------------------------,,,,, +# EVENT NAMES ---------------------------------------------,,,,, +Text Event,文本事件,Text Event,Texto,Texte,Text Ereignis +Character Join,角色加入,Character Join,Personaje Entra,,Charakter beitreten +Character Leave,角色离开,Character Leave,Personaje Sale,,Charakter verlassen +Question,问题,Question,Pregunta,,Frage +Choice,选择,Choice,Opcion,,Option +Condition,条件,Condition,Condicion,,Bedingung +End Branch,结束分支,End Branch,Cerrar rama,,Zweig beenden +Set Value,设定值,Set Value,Actualizar Valor,,Wert ändern +Set Glossary,设置术语,Set Glossary,Actualizar Glosario,,Glossar ändern +Change Timeline,改变时间线,Change Timeline,Cambiar Secuencia,,Zeitlinie wechseln +Set Background,设置背景,Set Background,Cambiar Fondo,,Hintergrund wechseln +Close Dialog,关闭对话框,Close Dialog,Cerrar Dialogo,,Dialog beenden +Wait Seconds,等待秒数,Wait Seconds,Esperar Segundos,,Warten +Set Theme,设置主题,Set Theme,Cambiar Tema,,Theme wechseln +Audio Event,音频事件,Audio Event,Evento de Audio,,Audio Ereignis +Background Music,背景音乐,Background Music,Evento de Musica,,Hintergrundmusik +Emit Signal,发出信号,Emit Signal,Emitir Señal,,Signal senden +Change Scene,改变场景,Change Scene,Cambiar Escena,Changer la scène,Szene wechseln +Call Node,呼叫节点,Call Node,Llamar Nodo,, +Save,保存,Save,Guardar,Enregistrer,Speichern +# EVENT CATEGORIES ---------------------------------------------,,,,, +Main Events,主要事件,Main Events,Eventos principales,,Haupt Ereignisse +Logic,逻辑,Logic,Lógica,Logique,Logik +Timeline,时间线,Timeline,Secuencia,Chronologie,Zeitlinie +Audio,音频,Audio,Audio,Audio,Audio +Godot,Godot,Godot,Godot,Godot,Godot +Custom Events,自定义事件,Custom Events,Eventos personalizados,Événements personnalisés,Benutzerdefinierte Ereignisse +# EVENTS ---------------------------------------------,,,,, +The selected operator requires a number!,所选的操作需要一个数字!,The selected operator requires a number!,El operador seleccionado requiere un número,,Der ausgewählte Operator muss eine Zahl sein +This event needs a question event around it!,这个事件需要一个围绕它的问题事件!,This event needs a question event around it!,Este evento necesita estar dentro de una pregunta,,Dieses Ereignis muss Teil einer Frage sein +## SETTINGS ---------------------------------------------,,,,, +Settings,设置,Settings,,,Einstellungen +Theme,主题,Theme,,,Theme +Default,默认,Default Theme:,Predeterminado,défaut,Standart Theme: +Canvas layer:,帆布层:,Canvas layer:,Canvas layer:,,Canvas Layer: +Dialog,对话,Dialog,,, +New lines will create extra messages,新的线条会产生额外的信息,New lines will create extra messages,Nuevas líneas crearan nuevos mensajes,,Zeilenumbrüche erstellen automatisch neue Nachrichten +Remove empty messages,删除空信息,Remove empty messages,Borrar mensajes vacíos,,Leere Nachrichten entfernen +Auto color character names in messages,信息中的字符名称自动着色,Auto color character names in messages,Colorear nombres automáticamente,,Automatisch Charakternamen einfärben +Stretch background images ,拉伸背景图像,Stretch background images,,,Hintergrundbilder strecken +Audio for Text events:,文本事件的音频:,Audio for Text events:,Audio para los eventos de texto:,,Audio für Text Ereignisse: +Enable audio for Text events,启用文本事件的音频,Enable audio for Text events,Habilitar audio para eventos de texto,,Audio für Text Ereignisse aktivieren +Default bus for Text event audio,文本事件音频的默认总线,Default bus for Text event audio,Audio bus predeterminado para eventos de texto,,Standard Audio-Bus für Text Ereignisse +Experimental Translations:,实验性翻译:,Experimental Translations:,Traducción experimental:,,Experimentelle Übersetzung: +Inputs for text events will be treated as keys for tr(),文本事件的输入将被视为tr()的按键,Inputs for text events will be treated as keys for tr(),Inputs for text events will be treated as keys for tr(),,Behandele Text Ereignisse als Schlüssel für tr() +Saving,游戏保存中,Game saving,,,Speichern im Spiel +Autosave,自动保存,Autosave,,,Automatisch Speichern +Input,输入,Input,,,Eingabe +Autofocus choice buttons,自动对焦选择按钮,Autofocus choice buttons,,,Optionen automatisch fokussieren +Enable choice options after,启用选择选项后,Enable choice options after,Habilitar las opciones después de,,Aktiviere Optionen nach +seconds,秒,seconds,segundos,secondes,Sekunden +Propagate input to rest of the Tree,传播输入到树的其他部分,Propagate input to rest of the Tree,Propagar input al resto del Tree,,Eingabe an den Rest des Baumes weitergeben +Tapping on the dialog to continue,点击对话框继续,Tapping on the dialog to continue,,,Fortfahren durch Klicken des Textfeld +Default action key,默认动作按键,Default action key,Tecla de acción predeterminada,,Standard Aktion +Enable default choice hotkeys,启用默认选择热键,Enable default choice hotkeys,,,Standard Hotkeys nutzen +Custom events,自定义事件,Custom events,,,Benutzerdefinierte Ereignisse +## CHARACTER EDITOR ---------------------------------------------,,,,, +Name:,名称:,Name:,Nombre:,Nom:,Name: +Display Name:,显示名称:,Display Name:,Display Name:,,Anzeigename: +Nicknames:,昵称:,Nicknames:,Apodos:,,Spitznamen: +Colors,颜色,Colors,Colores,Couleurs,Farben +Description:,描述:,Description:,Descripción:,,Beschreibung: +Portraits,肖像,Portraits,Retratos,,Portraits +File:,文件:,File:,Archivo:,,Datei +Mirror portraits,镜像肖像,Mirror portraits,Espejar imágen,,Portraits spiegeln +New portrait,添加新的肖像,New portrait,Nuevo retrato,,Neues Portrait +Path,路径,Path,,,Datei +Import folder,从文件夹中导入图片,Import folder,Importar carpeta,,Ordner importieren +NoImagePreview,此肖像条目上没有图像.,No image on this portrait entry.,,,Dieses Portrait hat noch kein Bild. +CustomScenePreview,[!] 无法显示自定义场景的预览.,[!] Can\'t show previews of custom scenes.,,,Szenen können nicht angezeigt werden. +Preview of,预览自,Preview of,,,Vorschau von +Full View,全视图,Full View,,,Ganze Ansicht +Actual Size,实际尺寸,Actual Size,,,Tasächliche Größe +## THEME EDITOR ---------------------------------------------,,,,, +Preview changes,预览更改,Preview changes,,,Vorschau aktualisieren +DialogTextTabTitle,对话文本,Dialog Text,,,Dialogtext +DialogBoxTabTitle,对话框,Dialog Box,,,Dialogfeld +NameLabelTabTitle,名称标签,Name Label,,,Namenstext +ChoiceButtonTabTitle,选择按钮,Choice Buttons,,,Optionen +GlossaryTabTitle,术语,Glossary,,,Glossar +AudioTabTitle,音频,Audio,,,Audio +Flat background,扁平背景,Flat background,Fondo plano,,Einfarbiger Hintergrund +Background Texture,背景纹理,Background Texture,Textura de fondo,,Hintergrundbild +Texture Modulation,纹理调制,Texture Modulation,Modulación de textura,Modulation de la texture,Texturfarbe +Fonts,字体,Fonts,Fuentes,Polices,Schriften +Regular Font,普通字体,Regular Font,Normal,,Normal +Bold Font,粗体字,Bold Font,Negrita,,Fett +Italic Font,斜体字,Italic Font,Cursiva,Italic Font,Kursiv +Text Color,文字颜色,Text Color,Color de texto,Couleur du texte,Textfarbe +Shadow Offset,阴影偏移,Shadow Offset,Compensación,Décalage de l'ombre,Schattenabstand +Behaviour,行为,Behaviour,Comportamiento,,Verhalten +Speed (bigger = slower),速度 (更大=更慢),Speed (bigger = slower),Velocidad (a mayor número más lento),,Geschwindigkeit +Alignment,对齐,Alignment,Alineación,,Ausrichtung +Single Portrait Mode,单一肖像模式,Single Portrait Mode,Modo retrato único,,Alleinstehendes Portrait Modus +Don't Close After Last Event,最后一次活动后不要关闭,Don't Close After Last Event,,, +Visuals,视觉效果,Visuals,Visuales,,Aussehen +Background Color,背景颜色,Background Color,Color de fondo,,Hintergrundfarbe +Size and Position,尺寸和位置,Size and Position,,,Größe und Position +Full width,全宽,Full width,Ancho completo,,Gesamte Breite +Box padding,箱体填充,Box padding,Box padding,, +Box size (pixels),盒子大小 (像素),Box size (pixels),Box size (pixels),,Textfeldgröße +Bottom gap,底部间隙,Bottom gap,Bottom gap,,Abstand +Next Indicator,下一个指示器,Next Indicator,Indicador de siguiente,,Fortfahren-Indikator +Image,图片,Image,Imágen,Image,Bild +Animation,动画,Animation,Animación,Animation,Animation +Scale,尺度,Scale,Escala,Échelle,Größe +Offset,偏移,Offset,Compensación,Décalage,Distanz +Behaviour,行为方式,Behaviour,Comportamiento,Comportement,Verhalten +Action key,动作按键,Action key,Tecla de acción,Clé d'action,Eingabeaktion +Fade in time:,淡入时间:,Fade in time:,Tiempo de aparición:,,Einblendedauer +Text,文本,Text,Texto,Texte,Text +Name label Font,名称标签字体,Name label Font,Fuente del nombre,,Schrift +Use character Color,使用角色颜色,Use character Color,Usar el color del personaje,,Charakterfarbe nutzen +Shadow,阴影,Shadow,Sombra,Ombre,Schatten +Box,盒子,Box,Box,Boîte,Textfeld +Background Color,背景颜色,Background Color,Color de fondo,,Hintergrundfarbe +Placement,摆放位置,Placement,Colocación,Placement,Platzierung +Position,位置,Position,Posicion,Position,Position +Button Style,按钮样式,Button Style,Estilo de botones,,Knopf-Stil +Fixed button size,固定按钮尺寸,Fixed button size,Tamaño fijo,,Feste Größe +Separation,分离,Separation,Separación,Séparation,Abstand +Layout,布局,Layout,Ordenar,Disposition,Layout +Advanced,高级,Advanced,Avanzado,Avancées,Fortgeschritten +Use Custom Buttons,使用自定义按钮,Use Custom Buttons,Usar botones propios,,Benutzerdefinierte Knöpfe +Word color,文字颜色,Word color,Color de palabra,,Wort-Farbe +Background Panel,背景板,Background Panel,Panel de fondo,,Hintergrundpanel +Title Font,标题字体,Title Font,Título Fuente,,Titelschrift +Title color,标题颜色,Title color,Título Color,,Titelfarbe +Text Font,文本字体,Text Font,Texto Font,,Inhaltsschrift +Text color,文本颜色,Text color,Texto Color,,Inhaltsfarbe +Extra Font,额外字体,Extra Font,Extra Fuente,,Zusatzschrift +Extra color,额外颜色,Extra color,Extra Color,,Zusatzfarbe +Behaviour,行为,Behaviour,Comportamiento,,Verhalten +Show,显示,Show,Mostrar,Afficher,Anzeigen +Typing Sound Effects,'打字'音效,Typing Sound Effects,Sonido Del Texto,,Tipp-Geräusche +Next Sound Effects,'下一个'音效,Next Sound Effects,,, +Choice Sound Effects,'选择'音效,Choice Sound Effects,,, +UseAudio,启用,Use audio file(s),Habilitar,Activer,Aktivieren +File or folder path,文件或文件夹路径,File or folder path,Archivo o carpeta,,Datei- oder Ordnerpfad +Volume,音量,Volume,Volumen,Volume,Lautstärke +Volume random range,音量随机范围,Volume random range,Rango de volumen,,Lautstärkenvariation +Pitch,音高,Pitch,,,Tonhöhe +Pitch random range,音高随机范围,Pitch random range,Rango de tono,,Tonhöhenvariation +Allow interrupt,允许中断,Allow interrupt,Permitir interrumpir,,Unterbrechen +Audio Bus,音频总线,Audio Bus,Bus de Audio,Bus Audio,Audio Bus +Button layout,按钮布局,Button layout,Orden de botones,, +Offset x-y,偏移 x-y,Offset x-y,Compensación x-y,, +Position on screen,屏幕上的位置,Position on screen,Posición en la pantalla,,Position +## RESOURCE TREE / TOOLBAR ---------------------------------------------,,,,, +# TOOL BAR ---------------------------------------------,,,,, +Help,帮助,Help,Ayuda,Aide,Hilfe +Website,网站,Website,Sitio Web,Site Web,Webseite +# POPUP OPTIONS ---------------------------------------------,,,,, +Show in File Manager,在文件管理器中显示,Show in File Manager,,,Im Dateimanager öffnen +Copy Timeline Name,复制时间线名称,Copy Timeline Name,,,Name der Zeitlinie kopieren +Remove Timeline,移除时间线,Remove Timeline,,,Zeitlinie löschen +Remove Character,移除角色,Remove Character,,,Charakter löschen +Duplicate Theme,复制主题,Duplicate Theme,,,Theme duplizieren +Remove Theme,移除主题,Remove Theme,,,Theme löschen +Edit Definitions File,编辑定义文件,Edit Definitions File,,,Definitions-Datei bearbeiten +Remove Definition entry,移除定义条目,Remove Definition entry,,,Definition löschen +Add Timeline,添加时间轴,Add Timeline,,,Neue Timeline +Create Subfolder,创建子文件夹,Create Subfolder,,,Neuer Unterordner +Delete Folder,删除文件夹,Delete Folder,,,Ordner löschen +Add Character,添加角色,Add Character,,,Neuer Charakter +Add Theme,添加主题,Add Theme,,,Neues Theme +Add Value,添加价,Add Value,,,Neuer Wert +Add Glossary Entry,添加术语条目,Add Glossary Entry,,,Neuer Glossar-Eintrag +Toggle Editing Tools,切换编辑工具,Toggle Editing Tools,,,Bearbeitungswerkzeuge aktivieren +RemoveResourcePopupTitle,请确定你要删除!,Be sure you want to delete!,"Por favor, Confirma...",,"Sicher, dass Sie das löschen möchten?" +RemoveFolderPopupTitle,请确定你要删除这个文件夹!,Be sure you want to delete this folder!,"Por favor, Confirma...",,Ordner wirklich löschen? +CantDeleteLastTheme,Dialogic总是需要一个主题. 很抱歉你不能删除最后的主题!,Dialogic always needs a theme. You cannot delete the last theme. Sorry!,,,"Dialogic benötigt immer ein Theme, darum darf das Letzte nicht gelöscht werden!" +DeleteResourceText,是否确实要删除此 [resource]? \n (无法还原),Are you sure you want to remove this [resource]? \n (Can't be restored),,,"Sind Sie sicher, dass Sie diese/s/n [resource] löschen wollen? \n (Kann nicht wiederhergestellt werden)" +RemoveFolderPopupText,确实要删除此文件夹及其包含的所有项目吗? \n (无法还原),Are you sure you want to remove this folder and all the items contained in it? \n(Can't be restored),,,"Sind Sie sicher, dass Sie diesen Ordner und alle darin enthaltenen Resourcen löschen möchten? \n(Nicht wiederherstellbar)" +## VALUE EDITOR,,,,, +ValueName,名称:,Name:,Nombre:,Nom:,Name: +Value,值:,Value:,,,Wert: +## GLOSSARY EDITOR,,,,, +GlossaryName,名称:,Name:,Nombre:,Nom:,Name: +GlossaryExplanation,"当玩家在对话框中悬停在该词时, 会有一个弹出窗口显示该信息.",A popup will display this information when a player hovers the word in a dialog.,,,"Diese Informationen werden in einem Popup gezeigt, wenn die Maus über disesem Wort ist." +GlossaryContent,内容:,Content:,,,Inhalt: diff --git a/project/addons/dialogic/Localization/dialogic.csv.import b/project/addons/dialogic/Localization/dialogic.csv.import new file mode 100644 index 0000000..f512d9c --- /dev/null +++ b/project/addons/dialogic/Localization/dialogic.csv.import @@ -0,0 +1,16 @@ +[remap] + +importer="csv_translation" +type="Translation" + +[deps] + +files=[ "res://addons/dialogic/Localization/dialogic.zh_CN.translation", "res://addons/dialogic/Localization/dialogic.en.translation", "res://addons/dialogic/Localization/dialogic.es.translation", "res://addons/dialogic/Localization/dialogic.fr.translation", "res://addons/dialogic/Localization/dialogic.de.translation" ] + +source_file="res://addons/dialogic/Localization/dialogic.csv" +dest_files=[ "res://addons/dialogic/Localization/dialogic.zh_CN.translation", "res://addons/dialogic/Localization/dialogic.en.translation", "res://addons/dialogic/Localization/dialogic.es.translation", "res://addons/dialogic/Localization/dialogic.fr.translation", "res://addons/dialogic/Localization/dialogic.de.translation" ] + +[params] + +compress=true +delimiter=0 diff --git a/project/addons/dialogic/Localization/dialogic.de.translation b/project/addons/dialogic/Localization/dialogic.de.translation new file mode 100644 index 0000000..cbdceb1 Binary files /dev/null and b/project/addons/dialogic/Localization/dialogic.de.translation differ diff --git a/project/addons/dialogic/Localization/dialogic.en.translation b/project/addons/dialogic/Localization/dialogic.en.translation new file mode 100644 index 0000000..d948706 Binary files /dev/null and b/project/addons/dialogic/Localization/dialogic.en.translation differ diff --git a/project/addons/dialogic/Localization/dialogic.es.translation b/project/addons/dialogic/Localization/dialogic.es.translation new file mode 100644 index 0000000..ea68dd9 Binary files /dev/null and b/project/addons/dialogic/Localization/dialogic.es.translation differ diff --git a/project/addons/dialogic/Localization/dialogic.fr.translation b/project/addons/dialogic/Localization/dialogic.fr.translation new file mode 100644 index 0000000..1c01a31 Binary files /dev/null and b/project/addons/dialogic/Localization/dialogic.fr.translation differ diff --git a/project/addons/dialogic/Localization/dialogic.zh_CN.translation b/project/addons/dialogic/Localization/dialogic.zh_CN.translation new file mode 100644 index 0000000..74e05e5 Binary files /dev/null and b/project/addons/dialogic/Localization/dialogic.zh_CN.translation differ diff --git a/project/addons/dialogic/Localization/translation_service.gd b/project/addons/dialogic/Localization/translation_service.gd new file mode 100644 index 0000000..b028829 --- /dev/null +++ b/project/addons/dialogic/Localization/translation_service.gd @@ -0,0 +1,60 @@ +# Alternative to [TranslationServer] that works inside the editor +# This is a modified version of AnidemDex's TranslationService +# https://github.com/AnidemDex/Godot-TranslationService + +tool +class_name DTS + +var translations = {} +#var testText = "Initial Text" + +func _init(): + translations_initial_load() + +# Translates a message using translation catalogs configured in the Editor Settings. +func translate(message:String)->String: + var translation + + translation = _get_translation(message) + + return translation + +func translations_initial_load(): + var translations_resources = ['en', 'zh_CN', 'es', 'fr', 'de'] + translations = {} + + for resource in translations_resources: + var t:PHashTranslation = load('res://addons/dialogic/Localization/dialogic.' + resource + '.translation') + if translations.has(t.locale): + translations[t.locale].append(t) + else: + translations[t.locale] = [t] + + +# Each value is an Array of [PHashTranslation]. +func get_translations() -> Dictionary: + return translations + + +func _get_translation(message)->String: + var returned_translation = message + var default_fallback = 'en' + + var editor_plugin = EditorPlugin.new() + var editor_settings = editor_plugin.get_editor_interface().get_editor_settings() + var locale = editor_settings.get('interface/editor/editor_language') + + var cases = translations.get( + locale, + translations.get(default_fallback, [PHashTranslation.new()]) + ) + for case in cases: + returned_translation = (case as PHashTranslation).get_message(message) + if returned_translation: + break + else: + # If there's no translation, returns the original string + returned_translation = message + + #print('Message: ', message, ' - locale: ', locale, ' - ', returned_translation) + return returned_translation diff --git a/project/addons/dialogic/Nodes/Anima/AnimaLicense.md b/project/addons/dialogic/Nodes/Anima/AnimaLicense.md new file mode 100644 index 0000000..4e01de4 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/AnimaLicense.md @@ -0,0 +1,7 @@ +Copyright © 2021 Alessandro Senese (ceceppa) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/project/addons/dialogic/Nodes/Anima/DialogicAnimaPropertiesHelper.gd b/project/addons/dialogic/Nodes/Anima/DialogicAnimaPropertiesHelper.gd new file mode 100644 index 0000000..3a81a69 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/DialogicAnimaPropertiesHelper.gd @@ -0,0 +1,318 @@ +class_name DialogicAnimaPropertiesHelper +# +# Different node types have different property names +# +# Example: +# Control: position is "rect_position" +# Node2D : position is "offset" +# +# So, this utility class helps the animations to figure out which +# property to animate :) +# +enum PIVOT { + CENTER, + CENTER_BOTTOM, + TOP_CENTER, + TOP_LEFT, + LEFT_BOTTOM, + RIGHT_BOTTOM +} + +static func get_position(node: Node) -> Vector2: + if node is Control: + return node.rect_position + if node is Node2D: + return node.global_position + + return node.global_transform.origin + +static func get_size(node: Node) -> Vector2: + if node is Control: + return node.get_size() + elif node is AnimatedSprite: + var frames = (node as AnimatedSprite).frames + var animation = (node as AnimatedSprite).animation + # scale can be negative + var scale = Vector2(abs(node.scale.x), abs(node.scale.y)) + return frames.get_frame(animation, 0).get_size() * scale + elif node is Node2D and "texture" in node: + # scale can be negative + var scale = Vector2(abs(node.scale.x), abs(node.scale.y)) + return node.texture.get_size() * scale + + return Vector2.ZERO + +static func get_scale(node: Node) -> Vector2: + if node is Control: + return node.rect_scale + return node.scale + +static func get_rotation(node: Node): + if node is Control: + return node.rect_rotation + elif node is Node2D: + return node.rotation_degrees + + return node.rotation + +static func set_2D_pivot(node: Node, pivot: int) -> void: + var size: Vector2 = get_size(node) + + match pivot: + PIVOT.TOP_CENTER: + if node is Control: + node.set_pivot_offset(Vector2(size.x / 2, 0)) + else: + var position = node.global_position + + node.offset = Vector2(0, size.y / 2) + node.global_position = position - node.offset + PIVOT.TOP_LEFT: + if node is Control: + node.set_pivot_offset(Vector2(0, 0)) + else: + var position = node.global_position + + node.offset = Vector2(size.x / 2, 0) + node.global_position = position - node.offset + PIVOT.CENTER: + if node is Control: + node.set_pivot_offset(size / 2) + PIVOT.CENTER_BOTTOM: + if node is Control: + node.set_pivot_offset(Vector2(size.x / 2, size.y / 2)) + else: + var position = node.global_position + + node.offset = Vector2(0, -size.y / 2) + node.global_position = position - node.offset + PIVOT.LEFT_BOTTOM: + if node is Control: + node.set_pivot_offset(Vector2(0, size.y)) + else: + var position = node.global_position + + node.offset = Vector2(size.x / 2, size.y) + node.global_position = position - node.offset + PIVOT.RIGHT_BOTTOM: + if node is Control: + node.set_pivot_offset(Vector2(size.x, size.y / 2)) + else: + var position = node.global_position + + node.offset = Vector2(-size.x / 2, size.y / 2) + node.global_position = position - node.offset + _: + printerr('Pivot point not handled yet') + +static func get_property_initial_value(node: Node, property: String): + property = property.to_lower() + + match property: + "x", "position:x": + var position = get_position(node) + + return position.x + "y", "position:y": + var position = get_position(node) + + return position.y + "z", "position:z": + var position = get_position(node) + + return position.z + "position": + return get_position(node) + "rotation": + return get_rotation(node) + "rotation:x": + return get_rotation(node).x + "rotation:y": + return get_rotation(node).y + "rotation:z": + return get_rotation(node).z + "opacity": + return node.modulate.a + "skew:x": + return node.get_global_transform().y.x + "skew:y": + return node.get_global_transform().x.y + + var p = property.split(':') + + var property_name: String = p[0] + var rect_property_name: String = 'rect_' + property_name + var node_property_name: String + + var key = p[1] if p.size() > 1 else null + + if node.get(property_name): + node_property_name = property_name + + if node.get(rect_property_name): + node_property_name = rect_property_name + + if p[0] == 'shader_param': + var material: ShaderMaterial + if node is MeshInstance: + material = node.get_surface_material(0) + else: + material = node.material + + return material.get_shader_param(p[1]) + + if node_property_name: + if key: + return node[node_property_name][key] + + return node[node_property_name] + + if property.find('__') == 0: + return 0 + + return property_name + +static func map_property_to_godot_property(node: Node, property: String) -> Dictionary: + property = property.to_lower() + + match property: + "x", "position:x": + if node is Control: + return { + property_name = "rect_position", + key = "x", + } + + return { + property_name = "global_transform", + key = "origin", + subkey = "x" + } + "y", "position:y": + if node is Control: + return { + property_name = "rect_position", + key = "y", + } + + return { + property_name = "global_transform", + key = "origin", + subkey = "y" + } + "z", "position:z": + if node is Control: + printerr('position:z is not supported by Control nodes') + + return { + property_name = "global_transform", + key = "origin", + subkey = "z" + } + "position": + if node is Control: + return { + property_name = "rect_position" + } + + return { + property_name = "global_transform", + key = "origin" + } + "opacity": + return { + property_name = "modulate", + key = "a" + } + "rotation": + var property_name = "rotation" + + if node is Control: + property_name = "rect_rotation" + elif node is Node2D: + property_name = "rotation_degrees" + + return { + property_name = property_name + } + "rotation:x": + return { + property_name = "rotation", + key = "x" + } + "rotation:y": + return { + property_name = "rotation", + key = "y" + } + "rotation:z": + return { + property_name = "rotation", + key = "z" + } + "skew:x": + return { + property_name = "transform", + key = "y", + subkey = "x" + } + "skew:y": + return { + property_name = "transform", + key = "x", + subkey = "y" + } + + var p = property.split(':') + + var property_name: String = p[0] + var rect_property_name: String = 'rect_' + property_name + var node_property_name: String + + var key = p[1] if p.size() > 1 else null + var subkey = p[2] if p.size() > 2 else null + + if node.get(property_name): + node_property_name = property_name + + if node.get(rect_property_name): + node_property_name = rect_property_name + + if p[0] == 'shader_param': + var material: ShaderMaterial + if node is MeshInstance: + material = node.get_surface_material(0) + else: + material = node.material + + return { + callback = funcref(material, 'set_shader_param'), + param = p[1] + } + + if node_property_name: + if key: + return { + property_name = node_property_name, + key = key + } + + if subkey: + return { + property_name = node_property_name, + key = key, + subkey = subkey + } + + return { + property_name = node_property_name + } + + if property.find('__') == 0: + return { + property_name = property + } + + return { + property_name = property + } diff --git a/project/addons/dialogic/Nodes/Anima/DialogicAnimaResources.gd b/project/addons/dialogic/Nodes/Anima/DialogicAnimaResources.gd new file mode 100644 index 0000000..c35a93b --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/DialogicAnimaResources.gd @@ -0,0 +1,83 @@ +extends Node +class_name DialogicAnimaResources + +const BASE_PATH := 'res://addons/dialogic/Nodes/Anima/animations/' + +static func get_animation_script(animation_name: String): +# for custom_animation in _custom_animations: +# if custom_animation.name == animation_name: +# return custom_animation.script + + var resource_file = get_animation_script_with_path(animation_name) + if resource_file: + return load(resource_file).new() + + printerr('No animation found with name: ', animation_name) + + return null + + +static func get_animation_script_with_path(animation_name: String) -> String: + if not animation_name.ends_with('.gd'): + animation_name += '.gd' + + animation_name = from_camel_to_snack_case(animation_name) + + for file_name in get_available_animations(): + if file_name is String and file_name.ends_with(animation_name): + return file_name + + return '' + + +static func get_available_animations() -> Array: + var list = _get_animations_list() + var filtered := [] + + for file in list: + if file.find('.gd.') < 0: + filtered.push_back(file.replace('.gdc', '.gd')) + + return filtered #+ _custom_animations + + +static func _get_animations_list() -> Array: + var files = _get_scripts_in_dir(BASE_PATH) + var filtered := [] + + files.sort() + return files + +static func _get_scripts_in_dir(path: String, files: Array = []) -> Array: + var dir = Directory.new() + if dir.open(path) != OK: + return files + + dir.list_dir_begin() + var file_name = dir.get_next() + + while file_name != "": + if file_name != "." and file_name != "..": + if dir.current_is_dir(): + _get_scripts_in_dir(path + file_name + '/', files) + else: + files.push_back(path + file_name) + + file_name = dir.get_next() + + return files + +static func from_camel_to_snack_case(string:String) -> String: + var result = PoolStringArray() + var is_first_char = true + + for character in string: + if character == character.to_lower() or is_first_char: + result.append(character.to_lower()) + else: + result.append('_' + character.to_lower()) + + is_first_char = false + + return result.join('').replace(' ', '_') + diff --git a/project/addons/dialogic/Nodes/Anima/DialogicAnimaTween.gd b/project/addons/dialogic/Nodes/Anima/DialogicAnimaTween.gd new file mode 100644 index 0000000..440d971 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/DialogicAnimaTween.gd @@ -0,0 +1,574 @@ +extends Tween + +var loop = 1 + +signal finished_animation + +var _animation_data = [] + +enum PLAY_MODE { + NORMAL, + BACKWARDS +} + +# Needed to use interpolate_property +var _fake_property: Dictionary = {} +var _callbacks := {} + +func _ready(): + connect("tween_started", self, '_on_tween_started') + connect("tween_step", self, '_on_tween_step_with_easing') + connect("tween_step", self, '_on_tween_step_with_easing_callback') + connect("tween_step", self, '_on_tween_step_with_easing_funcref') + connect("tween_step", self, '_on_tween_step_without_easing') + connect("tween_completed", self, '_on_tween_completed') + + +func play(node, animation_name, duration): + var script = DialogicAnimaResources.get_animation_script(animation_name.strip_edges()) + + if not script: + printerr('animation not found: %s' % animation_name) + + return duration + + var real_duration = script.generate_animation(self, {'node':node, 'duration':duration, 'wait_time':0}) + + if real_duration is float: + duration = real_duration + + var index := 0 + + for animation_data in _animation_data: + var easing_points + + if animation_data.has('easing'): + if animation_data.easing is FuncRef: + easing_points = animation_data.easing + else: + easing_points = get_easing_points(animation_data.easing) + + if animation_data.has('easing_points'): + easing_points = animation_data.easing_points + + animation_data._easing_points = easing_points + + animation_data._animation_callback = funcref(self, '_calculate_from_and_to') + + if easing_points is Array: + animation_data._use_step_callback = '_on_tween_step_with_easing' + elif easing_points is String: + animation_data._use_step_callback = '_on_tween_step_with_easing_callback' + elif easing_points is FuncRef: + animation_data._use_step_callback = '_on_tween_step_with_easing_funcref' + else: + animation_data._use_step_callback = '_on_tween_step_without_easing' + + index += 1 + + var started := start() + + if not started: + printerr('something went wrong while trying to start the tween') + + if is_connected("tween_all_completed", self, 'finished_once'): disconnect("tween_all_completed", self, 'finished_once') + connect('tween_all_completed', self, 'finished_once', [node, animation_name, duration]) + +func finished_once(node, animation, duration): + loop -= 1 + if loop > 0: + play(node, animation, duration) + else: + emit_signal('finished_animation') + +# Given an array of frames generates the animation data using relative end value +# +# frames = [{ +# percentage = the percentage of the animation +# to = the relative end value +# easing_points = the easing points for the bezier curver (optional) +# }] +# +func add_relative_frames(data: Dictionary, property: String, frames: Array) -> float: + return _add_frames(data, property, frames, true) + +# +# Given an array of frames generates the animation data using absolute end value +# +# frames = [{ +# percentage = the percentage of the animation +# to = the relative end value +# easing_points = the easing points for the bezier curver (optional) +# }] +# +func add_frames(data: Dictionary, property: String, frames: Array) -> float: + return _add_frames(data, property, frames) + + +func _add_frames(data: Dictionary, property: String, frames: Array, relative: bool = false) -> float: + var duration: float = data.duration if data.has('duration') else 0.0 + var _wait_time: float = data._wait_time if data.has('_wait_time') else 0.0 + var last_duration := 0.0 + + var keys_to_ignore = ['duration', '_wait_time'] + for frame in frames: + var percentage = frame.percentage if frame.has('percentage') else 100.0 + percentage /= 100.0 + + var frame_duration = max(0.000001, duration * percentage) + var diff = frame_duration - last_duration + var is_first_frame = true + var is_last_frame = percentage == 1 + + var animation_data = { + property = property, + relative = relative, + duration = diff, + _wait_time = _wait_time + } + + # We need to restore the animation just before the node is animated + # but we also need to consider that a node can have multiple + # properties animated, so we need to restore it only before the first + # animation starts + for animation in _animation_data: + if animation.node == data.node: + is_first_frame = false + + if animation.has('_is_last_frame'): + is_last_frame = false + + if is_first_frame: + animation_data._is_first_frame = true + + if is_last_frame: + animation_data._is_last_frame = true + + for key in frame: + if key != 'percentage': + animation_data[key] = frame[key] + + for key in data: + if key == 'callback' and percentage < 1: + animation_data.erase(key) + elif keys_to_ignore.find(key) < 0: + animation_data[key] = data[key] + + add_animation_data(animation_data) + + last_duration = frame_duration + _wait_time += diff + + return _wait_time + + +func add_animation_data(animation_data: Dictionary, play_mode: int = PLAY_MODE.NORMAL) -> void: + _animation_data.push_back(animation_data) + + var index = str(_animation_data.size()) + var duration = animation_data.duration if animation_data.has('duration') else 1 + var property_key = 'p' + index + + _fake_property[property_key] = 0.0 + + if animation_data.has('on_completed') and animation_data.has('_is_last_frame'): + _callbacks[property_key] = animation_data.on_completed + + var from := 0.0 if play_mode == PLAY_MODE.NORMAL else 1.0 + var to := 1.0 - from + + interpolate_property( + self, + '_fake_property:' + property_key, + from, + to, + duration, + Tween.TRANS_LINEAR, + Tween.EASE_IN_OUT, + animation_data._wait_time + ) + + +func _on_tween_step_with_easing(object: Object, key: NodePath, _time: float, elapsed: float): + var index := _get_animation_data_index(key) + + if _animation_data[index]._use_step_callback != '_on_tween_step_with_easing': + return + + var easing_points = _animation_data[index]._easing_points + var p1 = easing_points[0] + var p2 = easing_points[1] + var p3 = easing_points[2] + var p4 = easing_points[3] + + var easing_elapsed = _cubic_bezier(Vector2.ZERO, Vector2(p1, p2), Vector2(p3, p4), Vector2(1, 1), elapsed) + + _animation_data[index]._animation_callback.call_func(index, easing_elapsed) + +func _on_tween_step_with_easing_callback(object: Object, key: NodePath, _time: float, elapsed: float): + var index := _get_animation_data_index(key) + + if _animation_data[index]._use_step_callback != '_on_tween_step_with_easing_callback': + return + + var easing_points_function = _animation_data[index]._easing_points + var easing_callback = funcref(self, easing_points_function) + var easing_elapsed = easing_callback.call_func(elapsed) + + _animation_data[index]._animation_callback.call_func(index, easing_elapsed) + +func _on_tween_step_with_easing_funcref(object: Object, key: NodePath, _time: float, elapsed: float): + var index := _get_animation_data_index(key) + + if _animation_data[index]._use_step_callback != '_on_tween_step_with_easing_funcref': + return + + var easing_callback = _animation_data[index]._easing_points + var easing_elapsed = easing_callback.call_func(elapsed) + + _animation_data[index]._animation_callback.call_func(index, easing_elapsed) + +func _on_tween_step_without_easing(object: Object, key: NodePath, _time: float, elapsed: float): + var index := _get_animation_data_index(key) + + if _animation_data[index]._use_step_callback != '_on_tween_step_without_easing': + return + + _animation_data[index]._animation_callback.call_func(index, elapsed) + +func _get_animation_data_index(key: NodePath) -> int: + var s = str(key) + + return int(s.replace('_fake_property:p', '')) - 1 + +func _cubic_bezier(p0: Vector2, p1: Vector2, p2: Vector2, p3: Vector2, t: float) -> float: + var q0 = p0.linear_interpolate(p1, t) + var q1 = p1.linear_interpolate(p2, t) + var q2 = p2.linear_interpolate(p3, t) + + var r0 = q0.linear_interpolate(q1, t) + var r1 = q1.linear_interpolate(q2, t) + + var s = r0.linear_interpolate(r1, t) + + return s.y + +func _calculate_from_and_to(index: int, value: float) -> void: + var animation_data = _animation_data[index] + var node = animation_data.node + + var do_calculate = true + + if animation_data.has('_recalculate_from_to') and not animation_data._recalculate_from_to and animation_data.has('_property_data'): + do_calculate = false + + if do_calculate: + _do_calculate_from_to(node, animation_data) + + if animation_data._property_data.has('subkey'): + animation_data._animation_callback = funcref(self, '_on_animation_with_subkey') + elif animation_data._property_data.has('key'): + animation_data._animation_callback = funcref(self, '_on_animation_with_key') + else: + animation_data._animation_callback = funcref(self, '_on_animation_without_key') + + _animation_data[index]._animation_callback.call_func(index, value) + +func _do_calculate_from_to(node: Node, animation_data: Dictionary) -> void: + var from + var to + var relative = animation_data.relative if animation_data.has('relative') else false + var node_from = DialogicAnimaPropertiesHelper.get_property_initial_value(node, animation_data.property) + + if animation_data.has('from'): + from = _maybe_convert_from_deg_to_rad(node, animation_data, animation_data.from) + from = _maybe_calculate_relative_value(relative, from, node_from) + else: + from = node_from + animation_data.__from = from + + if animation_data.has('to'): + to = _maybe_convert_from_deg_to_rad(node, animation_data, animation_data.to) + to = _maybe_calculate_relative_value(relative, to, from) + else: + to = from + animation_data.__to = to + + if animation_data.has('pivot'): + if node is Spatial: + printerr('3D Pivot not supported yet') + else: + DialogicAnimaPropertiesHelper.set_2D_pivot(animation_data.node, animation_data.pivot) + + animation_data._property_data = DialogicAnimaPropertiesHelper.map_property_to_godot_property(node, animation_data.property) + + animation_data._property_data.diff = to - from + animation_data._property_data.from = from + +func _maybe_calculate_relative_value(relative, value, current_node_value): + if not relative: + return value + + return value + current_node_value + +func _maybe_convert_from_deg_to_rad(node: Node, animation_data: Dictionary, value): + if not node is Spatial or animation_data.property.find('rotation') < 0: + return value + + if value is Vector3: + return Vector3(deg2rad(value.x), deg2rad(value.y), deg2rad(value.z)) + + return deg2rad(value) + +func _on_animation_with_key(index: int, elapsed: float) -> void: + var animation_data = _animation_data[index] + var property_data = _animation_data[index]._property_data + var node = animation_data.node + var value = property_data.from + (property_data.diff * elapsed) + + if is_instance_valid(node): + node[property_data.property_name][property_data.key] = value + +func _on_animation_with_subkey(index: int, elapsed: float) -> void: + var animation_data = _animation_data[index] + var property_data = _animation_data[index]._property_data + var node = animation_data.node + var value = property_data.from + (property_data.diff * elapsed) + + if is_instance_valid(node): + node[property_data.property_name][property_data.key][property_data.subkey] = value + +func _on_animation_without_key(index: int, elapsed: float) -> void: + var animation_data = _animation_data[index] + var property_data = _animation_data[index]._property_data + var node = animation_data.node + var value = property_data.from + (property_data.diff * elapsed) + + if property_data.has('callback'): + property_data.callback.call_func(property_data.param, value) + + return + + if is_instance_valid(node): + node[property_data.property_name] = value + +# +# We don't want the user to specify the from/to value as color +# we animate opacity. +# So this function converts the "from = #" -> Color(.., .., .., #) +# same for the to value +# +func _maybe_adjust_modulate_value(animation_data: Dictionary, value): + var property = animation_data.property + var node = animation_data.node + + if not property == 'opacity': + return value + + if value is int or value is float: + var color = node.modulate + + color.a = value + + return color + + return value + +func _on_tween_completed(_ignore, property_name: String) -> void: + var property_key = property_name.replace(':_fake_property:', '') + + if _callbacks.has(property_key): + var callback = _callbacks[property_key] + + if not callback is Array or callback.size() == 1: + callback[0].call_func() + else: + callback[0].call_funcv(callback[1]) + +func _on_tween_started(_ignore, key) -> void: + var index := _get_animation_data_index(key) + #var hide_strategy = _visibility_strategy + var animation_data = _animation_data[index] + +# if animation_data.has('hide_strategy'): +# hide_strategy = animation_data.hide_strategy + + var node = animation_data.node + var should_restore_visibility := false + var should_restore_modulate := false + +# if hide_strategy == Anima.VISIBILITY.HIDDEN_ONLY: +# should_restore_visibility = true +# elif hide_strategy == Anima.VISIBILITY.HIDDEN_AND_TRANSPARENT: +# should_restore_modulate = true +# should_restore_visibility = true +# elif hide_strategy == Anima.VISIBILITY.TRANSPARENT_ONLY: +# should_restore_modulate = true + + if should_restore_modulate: + var old_modulate = node.get_meta('_old_modulate') + + if old_modulate: + node.modulate = old_modulate + + if should_restore_visibility: + node.show() + + var should_trigger_on_started: bool = animation_data.has('_is_first_frame') and animation_data._is_first_frame and animation_data.has('on_started') + if should_trigger_on_started: + var fn: FuncRef + var args: Array = [] + if animation_data.on_started is Array: + fn = animation_data.on_started[0] + args = animation_data.on_started.slice(1, -1) + else: + fn = animation_data.on_started + + fn.call_funcv(args) + + +#################################################################################################### +#################################################################################################### +## FROM ANIMA EASING +#################################################################################################### +#################################################################################################### + +enum EASING { + LINEAR, + EASE, + EASE_IN_OUT, + EASE_IN, + EASE_OUT, + EASE_IN_SINE, + EASE_OUT_SINE, + EASE_IN_OUT_SINE, + EASE_IN_QUAD, + EASE_OUT_QUAD, + EASE_IN_OUT_QUAD, + EASE_IN_CUBIC, + EASE_OUT_CUBIC, + EASE_IN_OUT_CUBIC, + EASE_IN_QUART, + EASE_OUT_QUART, + EASE_IN_OUT_QUART, + EASE_IN_QUINT, + EASE_OUT_QUINT, + EASE_IN_OUT_QUINT, + EASE_IN_EXPO, + EASE_OUT_EXPO, + EASE_IN_OUT_EXPO, + EASE_IN_CIRC, + EASE_OUT_CIRC, + EASE_IN_OUT_CIRC, + EASE_IN_BACK, + EASE_OUT_BACK, + EASE_IN_OUT_BACK, + EASE_IN_ELASTIC, + EASE_OUT_ELASTIC, + EASE_IN_OUT_ELASTIC, + EASE_IN_BOUNCE, + EASE_OUT_BOUNCE, + EASE_IN_OUT_BOUNCE, +} + +const _easing_mapping = { + EASING.LINEAR: null, + EASING.EASE: [0.25, 0.1, 0.25, 1], + EASING.EASE_IN_OUT: [0.42, 0, 0.58, 1], + EASING.EASE_IN: [0.42, 0, 1, 1], + EASING.EASE_OUT: [0, 0, 0.58, 1], + EASING.EASE_IN_SINE: [0, 0, 1, .5], + EASING.EASE_OUT_SINE: [0.61, 1, 0.88, 1], + EASING.EASE_IN_OUT_SINE: [0.37, 0, 0.63, 1], + EASING.EASE_IN_QUAD: [0.11, 0, 0.5, 0], + EASING.EASE_OUT_QUAD: [0.5, 1.0, 0.89, 1], + EASING.EASE_IN_OUT_QUAD: [0.45, 0, 0.55, 1], + EASING.EASE_IN_CUBIC: [0.32, 0, 0.67, 0], + EASING.EASE_OUT_CUBIC: [0.33, 1, 0.68, 1], + EASING.EASE_IN_OUT_CUBIC: [0.65, 0, 0.35, 1], + EASING.EASE_IN_QUART: [0.5, 0, 0.75, 0], + EASING.EASE_OUT_QUART: [0.25, 1, 0.5, 1], + EASING.EASE_IN_OUT_QUART: [0.76, 0, 0.24, 1], + EASING.EASE_IN_QUINT: [0.64, 0, 0.78, 0], + EASING.EASE_OUT_QUINT: [0.22, 1, 0.36, 1], + EASING.EASE_IN_OUT_QUINT: [0.83, 0, 0.17, 1], + EASING.EASE_IN_EXPO: [0.7, 0, 0.84, 0], + EASING.EASE_OUT_EXPO: [0.16, 1, 0.3, 1], + EASING.EASE_IN_OUT_EXPO: [0.87, 0, 0.13, 1], + EASING.EASE_IN_CIRC: [0.55, 0, 0.1, 0.45], + EASING.EASE_OUT_CIRC: [0, 0.55, 0.45, 1], + EASING.EASE_IN_OUT_CIRC: [0.85, 0, 0.15, 1], + EASING.EASE_IN_BACK: [0.36, 0, 0.66, -0.56], + EASING.EASE_OUT_BACK: [0.36, 1.56, 0.64, 1], + EASING.EASE_IN_OUT_BACK: [0.68, -0.6, 0.32, 1.6], + EASING.EASE_IN_ELASTIC: 'ease_in_elastic', + EASING.EASE_OUT_ELASTIC: 'ease_out_elastic', + EASING.EASE_IN_OUT_ELASTIC: 'ease_in_out_elastic', + EASING.EASE_IN_BOUNCE: 'ease_in_bounce', + EASING.EASE_OUT_BOUNCE: 'ease_out_bounce', + EASING.EASE_IN_OUT_BOUNCE: 'ease_in_out_bounce' +} + +const _ELASTIC_C4: float = (2.0 * PI) / 3.0 +const _ELASTIC_C5: float = (2.0 * PI) / 4.5 + +static func get_easing_points(easing_name): + if _easing_mapping.has(easing_name): + return _easing_mapping[easing_name] + + printerr('Easing not found: ' + str(easing_name)) + + return _easing_mapping[EASING.LINEAR] + +static func ease_in_elastic(elapsed: float) -> float: + if elapsed == 0: + return 0.0 + elif elapsed == 1: + return 1.0 + + return -pow(2, 10 * elapsed - 10) * sin((elapsed * 10 - 10.75) * _ELASTIC_C4) + +static func ease_out_elastic(elapsed: float) -> float: + if elapsed == 0: + return 0.0 + elif elapsed == 1: + return 1.0 + + return pow(2, -10 * elapsed) * sin((elapsed * 10 - 0.75) * _ELASTIC_C4) + 1 + +static func ease_in_out_elastic(elapsed: float) -> float: + if elapsed == 0: + return 0.0 + elif elapsed == 1: + return 1.0 + elif elapsed < 0.5: + return -(pow(2, 20 * elapsed - 10) * sin((20 * elapsed - 11.125) * _ELASTIC_C5)) / 2 + + return (pow(2, -20 * elapsed + 10) * sin((20 * elapsed - 11.125) * _ELASTIC_C5)) / 2 + 1 + +const n1 = 7.5625; +const d1 = 2.75; + +static func ease_in_bounce(elapsed: float) -> float: + return 1 - ease_out_bounce(1.0 - elapsed) + +static func ease_out_bounce(elapsed: float) -> float: + if elapsed < 1 / d1: + return n1 * elapsed * elapsed; + elif elapsed < 2 / d1: + elapsed -= 1.5 / d1 + + return n1 * elapsed * elapsed + 0.75; + elif elapsed < 2.5 / d1: + elapsed -= 2.25 / d1 + + return n1 * elapsed * elapsed + 0.9375; + + elapsed -= 2.625 / d1 + return n1 * elapsed * elapsed + 0.984375; + +static func ease_in_out_bounce(elapsed: float) -> float: + if elapsed < 0.5: + return (1 - ease_out_bounce(1 - 2 * elapsed)) / 2 + + return (1 + ease_out_bounce(2 * elapsed - 1)) / 2 diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/bounce.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/bounce.gd new file mode 100644 index 0000000..f2fad7c --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/bounce.gd @@ -0,0 +1,29 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + #var delay: float = data._wait_time + var bounce_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 40, to = -30, easing_points = [0.7555, 0.5, 0.8555, 0.06] }, + { percentage = 43, to = 0, easing_points = [0.7555, 0.5, 0.8555, 0.06] }, + { percentage = 53, to = +30 }, + { percentage = 70, to = -15, easing_points = [0.755, 0.05, 0.855, 0.06] }, + { percentage = 80, to = +15 }, + { percentage = 90, to = -4 }, + { percentage = 100, to = +4 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, to = 1 * scale.y }, + { percentage = 20, to = 1 * scale.y }, + { percentage = 40, to = 1.1 * scale.y, easing_points = [0.7555, 0.5, 0.8555, 0.06] }, + { percentage = 43, to = 1.1 * scale.y, easing_points = [0.7555, 0.5, 0.8555, 0.06] }, + { percentage = 53, to = 1 * scale.y }, + { percentage = 70, to = 1.05 * scale.y, easing_points = [0.755, 0.05, 0.855, 0.06] }, + { percentage = 80, to = 0.95 * scale.y }, + { percentage = 90, to = 1.02 * scale.y }, + { percentage = 100, to = 1 * scale.y }, + ] + + anima_tween.add_relative_frames(data, "Y", bounce_frames) + anima_tween.add_frames(data, "scale:y", scale_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/flash.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/flash.gd new file mode 100644 index 0000000..eb490a0 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/flash.gd @@ -0,0 +1,10 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var frames = [ + { percentage = 0, from = 1 }, + { percentage = 25, to = 0 }, + { percentage = 50, to = 1 }, + { percentage = 75, to = 0 }, + { percentage = 100, to = 1 }, + ] + + anima_tween.add_frames(data, "opacity", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/headshake.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/headshake.gd new file mode 100644 index 0000000..1a9b3ba --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/headshake.gd @@ -0,0 +1,27 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var start = DialogicAnimaPropertiesHelper.get_position(data.node) + + var shake_frames = [ + { percentage = 0, from = 0 }, + { percentage = 6.5, to = -6 }, + { percentage = 18.5, to = +5 }, + { percentage = 31.5, to = -3 }, + { percentage = 43.5, to = +2 }, + { percentage = 50, to = 0 }, + { percentage = 100, to = 0 }, + ] + + var rotate_frames = [ + { percentage = 0, to = 0 }, + { percentage = 6.5, to = -9 }, + { percentage = 18.5, to = +7 }, + { percentage = 31.5, to = -5 }, + { percentage = 43.5, to = +3 }, + { percentage = 50, to = 0 }, + { percentage = 100, to = 0 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", shake_frames) + anima_tween.add_frames(data, "rotation", rotate_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/heartbeat.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/heartbeat.gd new file mode 100644 index 0000000..41b5f5b --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/heartbeat.gd @@ -0,0 +1,14 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 14, to = scale * Vector2(1.3, 1.3) }, + { percentage = 28, to = scale * Vector2(1, 1) }, + { percentage = 42, to = scale * Vector2(1.3, 1.3) }, + { percentage = 70, to = scale * Vector2(1, 1) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_frames(data, "scale", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/jello.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/jello.gd new file mode 100644 index 0000000..355a48b --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/jello.gd @@ -0,0 +1,32 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var start_x = data.node.get_global_transform().y.x + var start_y = data.node.get_global_transform().x.y + + var skew_x := [] + var skew_y := [] + + var values = [ + { percentage = 0, add = 0 }, + { percentage = 11.1, add = 0 }, + { percentage = 22.2, add = - 0.3 }, + { percentage = 33.3, add = + 0.265 }, + { percentage = 44.4, add = - 0.1325 }, + { percentage = 55.5, add = + 0.06625 }, + { percentage = 66.6, add = - 0.033125 }, + { percentage = 77.7, add = + 0.0165625 }, + { percentage = 88.8, add = - 0.00828125}, + { percentage = 100, add = 0 }, + ] + + for value in values: + skew_x.push_back({ percentage = value.percentage, to = start_x + value.add }) + skew_y.push_back({ percentage = value.percentage, to = start_y + value.add }) + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + # Skew works only with Node2D + if not data.node is Node2D: + return + + anima_tween.add_frames(data, "skew:x", skew_x) + anima_tween.add_frames(data, "skew:y", skew_y) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/pulse.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/pulse.gd new file mode 100644 index 0000000..ba7d2ce --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/pulse.gd @@ -0,0 +1,12 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 50, to = scale * Vector2(1.05, 1.05), easing = anima_tween.EASING.EASE_IN_OUT_SINE }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_frames(data, "scale", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/rubber_band.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/rubber_band.gd new file mode 100644 index 0000000..359efc0 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/rubber_band.gd @@ -0,0 +1,15 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 30, to = scale * Vector2(1.25, 0.75) }, + { percentage = 40, to = scale * Vector2(0.75, 1.25) }, + { percentage = 50, to = scale * Vector2(1.15, 0.85) }, + { percentage = 65, to = scale * Vector2(0.95, 1.05) }, + { percentage = 75, to = scale * Vector2(1.05, 0.95) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_frames(data, "scale", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/shake_x.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/shake_x.gd new file mode 100644 index 0000000..25b1107 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/shake_x.gd @@ -0,0 +1,16 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var frames = [ + { percentage = 0, to = 0 }, + { percentage = 10, to = -10 }, + { percentage = 20, to = +20 }, + { percentage = 30, to = -20 }, + { percentage = 40, to = +20 }, + { percentage = 50, to = -20 }, + { percentage = 60, to = +20 }, + { percentage = 70, to = -20 }, + { percentage = 80, to = +20 }, + { percentage = 90, to = -20 }, + { percentage = 100, to = +10 }, + ] + + anima_tween.add_relative_frames(data, "x", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/shake_y.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/shake_y.gd new file mode 100644 index 0000000..1fbd7b4 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/shake_y.gd @@ -0,0 +1,16 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var frames = [ + { percentage = 0, to = 0 }, + { percentage = 10, to = -10 }, + { percentage = 20, to = +20 }, + { percentage = 30, to = -20 }, + { percentage = 40, to = +20 }, + { percentage = 50, to = -20 }, + { percentage = 60, to = +20 }, + { percentage = 70, to = -20 }, + { percentage = 80, to = +20 }, + { percentage = 90, to = -20 }, + { percentage = 100, to = +10 }, + ] + + anima_tween.add_relative_frames(data, "y", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/swing.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/swing.gd new file mode 100644 index 0000000..133f25f --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/swing.gd @@ -0,0 +1,12 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var frames = [ + { percentage = 0, from = 0 }, + { percentage = 20, to = 15 }, + { percentage = 40, to = -10 }, + { percentage = 60, to = 5 }, + { percentage = 80, to = -5 }, + { percentage = 100, to = 0 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.TOP_CENTER) + anima_tween.add_frames(data, "rotation", frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/tada.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/tada.gd new file mode 100644 index 0000000..92efca2 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/tada.gd @@ -0,0 +1,22 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var rotate_frames = [ + { percentage = 0, from = 0 }, + ] + var scale_frames = [ + { percentage = 0, from = DialogicAnimaPropertiesHelper.get_scale(data.node) * Vector2(1, 1) }, + ] + + for index in range(2, 9): + var s = -1 if index % 2 == 0 else 1 + var percent = index * 10.0 + + rotate_frames.push_back({ percentage = percent, to = 3 * s }) + scale_frames.push_back({ percentage = percent, to = Vector2(1.1, 1.1) }) + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + rotate_frames.push_back({percentage = 100, to = 0}) + scale_frames.push_back({percentage = 100, to = Vector2(1, 1)}) + + anima_tween.add_frames(data, "rotation", rotate_frames) + anima_tween.add_frames(data, "scale", scale_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/wobble.gd b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/wobble.gd new file mode 100644 index 0000000..b426e45 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/attention_seeker/wobble.gd @@ -0,0 +1,28 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var node = data.node + var start_position = DialogicAnimaPropertiesHelper.get_position(node) + var size = DialogicAnimaPropertiesHelper.get_size(node) + + var x_frames = [ + { percentage = 0, from = start_position.x }, + { percentage = 15, to = start_position.x + size.x * -0.25 }, + { percentage = 30, to = start_position.x + size.x * 0.2 }, + { percentage = 45, to = start_position.x + size.x * -0.15 }, + { percentage = 60, to = start_position.x + size.x * 0.1 }, + { percentage = 75, to = start_position.x + size.x * -0.05 }, + { percentage = 100, to = start_position.x }, + ] + + var rotation_frames = [ + { percentage = 0, from = 0 }, + { percentage = 15, to = -5 }, + { percentage = 30, to = 3 }, + { percentage = 45, to = -3 }, + { percentage = 60, to = 2 }, + { percentage = 75, to = -1 }, + { percentage = 100, to = 0 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.TOP_CENTER) + anima_tween.add_frames(data, "x", x_frames) + anima_tween.add_frames(data, "rotation", rotation_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/1-fade_in.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/1-fade_in.gd new file mode 100644 index 0000000..c22e09c --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/1-fade_in.gd @@ -0,0 +1,5 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 0, to = 1, easing_points = [0.42, 0, 0.58, 1]}, + ] + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/2-fade_in_up.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/2-fade_in_up.gd new file mode 100644 index 0000000..57313a5 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/2-fade_in_up.gd @@ -0,0 +1,14 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 0, to = 1, easing_points = [0.42, 0, 0.58, 1] }, + ] + + var size = DialogicAnimaPropertiesHelper.get_size(data.node) + + var position_frames = [ + { percentage = 0, from = size.y/16, easing_points = [0.42, 0, 0.58, 1] }, + { percentage = 100, to = -size.y/16, easing_points = [0.42, 0, 0.58, 1] }, + ] + + anima_tween.add_relative_frames(data, "y", position_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/3-fade_in_up_big.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/3-fade_in_up_big.gd new file mode 100644 index 0000000..5497f77 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/3-fade_in_up_big.gd @@ -0,0 +1,14 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 0, to = 1 }, + ] + + var size = DialogicAnimaPropertiesHelper.get_size(data.node) + + var position_frames = [ + { percentage = 0, from = 2000 }, + { percentage = 100, to = -2000 }, + ] + + anima_tween.add_relative_frames(data, "y", position_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/4-fade_out.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/4-fade_out.gd new file mode 100644 index 0000000..9a6252d --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/4-fade_out.gd @@ -0,0 +1,6 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 1, to = 0, easing_points = [0.42, 0, 0.58, 1]}, + ] + + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/5-fade_out_down.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/5-fade_out_down.gd new file mode 100644 index 0000000..c614927 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/5-fade_out_down.gd @@ -0,0 +1,13 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 1, to = 0, easing_points = [0.42, 0, 0.58, 1] }, + ] + + var size = DialogicAnimaPropertiesHelper.get_size(data.node) + + var position_frames = [ + { from = 0, to = size.y/16, easing_points = [0.42, 0, 0.58, 1]}, + ] + + anima_tween.add_relative_frames(data, "y", position_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/6-fade_out_down_big.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/6-fade_out_down_big.gd new file mode 100644 index 0000000..afacdf2 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/6-fade_out_down_big.gd @@ -0,0 +1,12 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 1, to = 0 }, + ] + + var position_frames = [ + { percentage = 0, from = 0}, + { percentage = 100, to = 2000 }, + ] + + anima_tween.add_relative_frames(data, "y", position_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_down.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_down.gd new file mode 100644 index 0000000..9331039 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_down.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var y_frames = [ + { percentage = 0, to = -1200 }, + { percentage = 80, to = +1200 }, + { percentage = 100, to = 0 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(0.7, 0.7) }, + { percentage = 80, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 0.7 }, + { percentage = 80, to = 0.7 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "y", y_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_left.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_left.gd new file mode 100644 index 0000000..e912156 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_left.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = -2000 }, + { percentage = 80, to = +2000 }, + { percentage = 100, to = 0 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(0.7, 0.7) }, + { percentage = 80, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 0.7 }, + { percentage = 80, to = 0.7 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_right.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_right.gd new file mode 100644 index 0000000..277390a --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_right.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = 2000 }, + { percentage = 80, to = -2000 }, + { percentage = 100, to = 0 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(0.7, 0.7) }, + { percentage = 80, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 0.7 }, + { percentage = 80, to = 0.7 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_up.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_up.gd new file mode 100644 index 0000000..23a4cf4 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_in_up.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var y_frames = [ + { percentage = 0, to = 1200 }, + { percentage = 80, to = -1200 }, + { percentage = 100, to = 0 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(0.7, 0.7) }, + { percentage = 80, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 0.7 }, + { percentage = 80, to = 0.7 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "y", y_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_down.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_down.gd new file mode 100644 index 0000000..3dcbd04 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_down.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var y_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 100, to = -700 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 20, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(0.7, 0.7) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 0.7 }, + { percentage = 100, to = 0.7 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "y", y_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_left.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_left.gd new file mode 100644 index 0000000..6098e25 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_left.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 100, to = -2000 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 20, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(0.7, 0.7) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 0.7 }, + { percentage = 100, to = 0.7 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_right.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_right.gd new file mode 100644 index 0000000..e78ecdd --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_right.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 100, to = 2000 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 20, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(0.7, 0.7) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 0.7 }, + { percentage = 100, to = 0.7 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_up.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_up.gd new file mode 100644 index 0000000..8abf4b3 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/back_out_up.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var y_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 100, to = 700 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 20, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(0.7, 0.7) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 0.7 }, + { percentage = 100, to = 0.7 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "y", y_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/bounce_out.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/bounce_out.gd new file mode 100644 index 0000000..d64b510 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/bounce_out.gd @@ -0,0 +1,22 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(1, 1) }, + { percentage = 20, to = scale * Vector2(0.9, 0.9) }, + { percentage = 50, to = scale * Vector2(1.1, 1.1) }, + { percentage = 55, to = scale * Vector2(1.1, 1.1) }, + { percentage = 100, to = scale * Vector2(0.3, 0.3) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 1 }, + { percentage = 50, to = 1 }, + { percentage = 55, to = 1 }, + { percentage = 100, to = 0 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/bouncing_in.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/bouncing_in.gd new file mode 100644 index 0000000..d2e570c --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/bouncing_in.gd @@ -0,0 +1,21 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(0.3, 0.3), easing_points = [0.215, 0.61, 0.355, 1] }, + { percentage = 20, to = scale * Vector2(1, 1), easing_points = [0.215, 0.61, 0.355, 1] }, + { percentage = 40, to = scale * Vector2(0.9, 0.9), easing_points = [0.215, 0.61, 0.355, 1] }, + { percentage = 60, to = scale * Vector2(1.03, 1.03), easing_points = [0.215, 0.61, 0.355, 1] }, + { percentage = 80, to = scale * Vector2(0.97, 0.97), easing_points = [0.215, 0.61, 0.355, 1] }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 0 }, + { percentage = 60, to = 1 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/instant_in.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/instant_in.gd new file mode 100644 index 0000000..521c8ce --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/instant_in.gd @@ -0,0 +1,5 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 1, to = 1 }, + ] + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/instant_out.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/instant_out.gd new file mode 100644 index 0000000..c74c103 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/instant_out.gd @@ -0,0 +1,5 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var opacity_frames = [ + { from = 0, to = 0 }, + ] + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_in_left.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_in_left.gd new file mode 100644 index 0000000..376ed22 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_in_left.gd @@ -0,0 +1,19 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = -2000 }, + { percentage = 80, to = +2000 }, + { percentage = 100, to = 0 }, + ] + + + var opacity_frames = [ + { percentage = 0, from = 0.7 }, + { percentage = 80, to = 0.7 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + #anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_in_right.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_in_right.gd new file mode 100644 index 0000000..277390a --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_in_right.gd @@ -0,0 +1,25 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = 2000 }, + { percentage = 80, to = -2000 }, + { percentage = 100, to = 0 }, + ] + + var scale = DialogicAnimaPropertiesHelper.get_scale(data.node) + var scale_frames = [ + { percentage = 0, from = scale * Vector2(0.7, 0.7) }, + { percentage = 80, to = scale * Vector2(0.7, 0.7) }, + { percentage = 100, to = scale * Vector2(1, 1) }, + ] + + var opacity_frames = [ + { percentage = 0, from = 0.7 }, + { percentage = 80, to = 0.7 }, + { percentage = 100, to = 1 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "scale", scale_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_out_left.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_out_left.gd new file mode 100644 index 0000000..54ceaa1 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_out_left.gd @@ -0,0 +1,17 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 100, to = -2000 }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 0.7 }, + { percentage = 100, to = 0.7 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_out_right.gd b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_out_right.gd new file mode 100644 index 0000000..aed4a34 --- /dev/null +++ b/project/addons/dialogic/Nodes/Anima/animations/entrances_and_exits/slide_out_right.gd @@ -0,0 +1,17 @@ +func generate_animation(anima_tween: Tween, data: Dictionary) -> void: + var x_frames = [ + { percentage = 0, to = 0 }, + { percentage = 20, to = 0 }, + { percentage = 100, to = 2000 }, + ] + + var opacity_frames = [ + { percentage = 0, from = 1 }, + { percentage = 20, to = 0.7 }, + { percentage = 100, to = 0.7 }, + ] + + DialogicAnimaPropertiesHelper.set_2D_pivot(data.node, DialogicAnimaPropertiesHelper.PIVOT.CENTER) + + anima_tween.add_relative_frames(data, "x", x_frames) + anima_tween.add_frames(data, "opacity", opacity_frames) diff --git a/project/addons/dialogic/Nodes/Background.gd b/project/addons/dialogic/Nodes/Background.gd new file mode 100644 index 0000000..1cb37ab --- /dev/null +++ b/project/addons/dialogic/Nodes/Background.gd @@ -0,0 +1,48 @@ +extends TextureRect + +var native_dialogic_background = true +var tween + +func _ready(): + expand = true + name = 'Background' + anchor_right = 1 + anchor_bottom = 1 + if DialogicResources.get_settings_value('dialog', 'stretch_backgrounds', true): + stretch_mode = TextureRect.STRETCH_SCALE + else: + stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_COVERED + show_behind_parent = true + mouse_filter = Control.MOUSE_FILTER_IGNORE + +func _init(): + tween = Tween.new() + add_child(tween) + + +func fade_in(time = 1): + modulate = Color(1, 1,1,0) + tween.interpolate_property(self, "modulate", + null, Color(1,1,1,1), time, + Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) + tween.start() + + +func fade_out(time = 1): + if tween: + tween.connect('tween_all_completed', self, '_on_tween_over') + tween.interpolate_property(self, "modulate", + Color(1,1,1,1), Color(1,1,1,0), time, + Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) + tween.start() + else: + _on_tween_over() + +func remove_with_delay(time =1): + var timer = Timer.new() + timer.connect("timeout", self, "queue_free") + add_child(timer) + timer.start(time+0.1) + +func _on_tween_over(): + queue_free() diff --git a/project/addons/dialogic/Nodes/Background.tscn b/project/addons/dialogic/Nodes/Background.tscn new file mode 100644 index 0000000..277cf47 --- /dev/null +++ b/project/addons/dialogic/Nodes/Background.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Nodes/Background.gd" type="Script" id=1] + +[node name="Background" type="TextureRect"] +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Nodes/BackgroundMusic.gd b/project/addons/dialogic/Nodes/BackgroundMusic.gd new file mode 100644 index 0000000..e09acaf --- /dev/null +++ b/project/addons/dialogic/Nodes/BackgroundMusic.gd @@ -0,0 +1,62 @@ +extends Control +class_name DialogicBackgroundMusic + +onready var _track1 := $Track1 +onready var _track2 := $Track2 + +var current_path = "" +var current_track = null + +func _ready(): + $Tween.connect("tween_completed", self, "_on_Tween_tween_completed") + +func crossfade_to(path: String, audio_bus:String, volume:float, fade_length: float) -> void: + # find a better solution for this + if _track1.playing and _track2.playing: + return + + var stream: AudioStream = load(path) + var fade_out_track = _track1 + var fade_in_track = _track2 + + if _track2.playing: + fade_out_track = _track2 + fade_in_track = _track1 + + # setup the new track + fade_in_track.stream = stream + fade_in_track.bus = audio_bus + fade_in_track.volume_db = -60 + + + $Tween.interpolate_property(fade_out_track, "volume_db", null, -60, fade_length, Tween.TRANS_EXPO) + $Tween.interpolate_property(fade_in_track, "volume_db", -60, volume, fade_length, Tween.TRANS_EXPO) + $Tween.start() + + # in case the audio is already playing we will attempt a fade into the new one from the current position + if current_path == path: + fade_in_track.play(fade_out_track.get_playback_position()) + # else just play it from the beginning + else: + fade_in_track.play() + current_track = fade_in_track + + current_path = path + +func fade_out(fade_length:float = 1) -> void: + current_path = "" + current_track = null + $Tween.interpolate_property(_track1, "volume_db", null, -60, fade_length, Tween.TRANS_EXPO) + $Tween.interpolate_property(_track2, "volume_db", null, -60, fade_length, Tween.TRANS_EXPO) + $Tween.start() + +func _on_Tween_tween_completed(object, key): + # if the stream was faded out + if object.volume_db == -60: + object.playing = false + object.stream = null + +func get_current_info(): + if current_track != null: + return {"file":current_path, "volume": current_track.volume_db, "audio_bus": current_track.bus} + return null diff --git a/project/addons/dialogic/Nodes/BackgroundMusic.tscn b/project/addons/dialogic/Nodes/BackgroundMusic.tscn new file mode 100644 index 0000000..68ea880 --- /dev/null +++ b/project/addons/dialogic/Nodes/BackgroundMusic.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Nodes/BackgroundMusic.gd" type="Script" id=1] + +[node name="BackgroundMusic" type="Control"] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Track1" type="AudioStreamPlayer" parent="."] +volume_db = -80.0 + +[node name="Track2" type="AudioStreamPlayer" parent="."] +volume_db = -80.0 + +[node name="Tween" type="Tween" parent="."] diff --git a/project/addons/dialogic/Nodes/CharacterVoice.gd b/project/addons/dialogic/Nodes/CharacterVoice.gd new file mode 100644 index 0000000..e23a545 --- /dev/null +++ b/project/addons/dialogic/Nodes/CharacterVoice.gd @@ -0,0 +1,51 @@ +extends AudioStreamPlayer + +var stop_time:float + +func play_voice(data:Dictionary) -> void: + if data == {}: + stop_voice() + return + + if data.has('volume'): + volume_db = data['volume'] + + if data.has('audio_bus'): + bus = data['audio_bus'] + + if data.has('file'): + if data['file'] == '': + stop_voice() + return + var s:AudioStream = load(data['file']) + if s != null: + stream = s + #Will play from start_time when possible + if data.has('start_time'): + play(data['start_time']) + else: + play() + #Stop time will fall back to length of audiostream minus 0.1 secund + #if not defined otherwise. This should allow _process to stop the + #audio before it autorepeats + if data.has('stop_time'): + stop_time = data['stop_time'] + if stop_time <= 0: + stop_time = s.get_length() - 0.1 + else: + stop_time = s.get_length() - 0.1 + else: + stop_voice() +func stop_voice(): + stop() +#this is part of a hack, and could be replaced with something more elegant. - KvaGram +func remaining_time(): + if !playing: + return 0 + return stop_time - get_playback_position() + + +func _process(_delta): + #Will automatically stop playing when reaching stop_time + if(playing && get_playback_position() >= stop_time): + stop_voice() diff --git a/project/addons/dialogic/Nodes/ChoiceButton.gd b/project/addons/dialogic/Nodes/ChoiceButton.gd new file mode 100644 index 0000000..488e4db --- /dev/null +++ b/project/addons/dialogic/Nodes/ChoiceButton.gd @@ -0,0 +1,10 @@ +extends Button + +func _process(delta): + if Input.is_action_pressed(get_meta('input_next')): + if has_focus(): + emit_signal("button_down") + if Input.is_action_just_released(get_meta('input_next')): + if has_focus(): + emit_signal("button_up") + emit_signal("pressed") diff --git a/project/addons/dialogic/Nodes/ChoiceButton.tscn b/project/addons/dialogic/Nodes/ChoiceButton.tscn new file mode 100644 index 0000000..eadee63 --- /dev/null +++ b/project/addons/dialogic/Nodes/ChoiceButton.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://addons/dialogic/Nodes/ChoiceButton.gd" type="Script" id=1] + +[node name="ChoiceButton" type="Button"] +size_flags_horizontal = 4 +size_flags_vertical = 4 +text = "Testing button " +script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/project/addons/dialogic/Nodes/DialogNode.gd b/project/addons/dialogic/Nodes/DialogNode.gd new file mode 100644 index 0000000..05899bf --- /dev/null +++ b/project/addons/dialogic/Nodes/DialogNode.gd @@ -0,0 +1,1581 @@ +tool +extends Control + +## ----------------------------------------------------------------------------- +## VARIABLES +## ----------------------------------------------------------------------------- +## The timeline to load when starting the scene +var timeline: String +var timeline_name: String + +### MODE +var preview: bool = false + +var noSkipMode: bool = false +var autoPlayMode: bool = false +var autoWaitTime : float = 2.0 + +enum state { + IDLE, # When nothing is happening + READY, # When Dialogic already displayed the text on the screen + TYPING, # While the editor is typing text + WAITING, # Waiting a timer or something to finish + WAITING_INPUT, # Waiting for player to answer a question + ANIMATING # While performing a dialog animation +} +var _state : int = state.IDLE + +var do_fade_in := true +var dialog_faded_in_already = false +# true if the glossary popup is visible: # TODO rename +var definition_visible: bool = false +# used to reset the mouse mode after questions: +var last_mouse_mode = null +# this is for switching back after a custom character theme was loaded +var current_default_theme = null + +### SETTINGS +var settings: ConfigFile +var custom_events = {} +var record_history: bool = false + +### DATA +var definitions = {} + +# Parsing results +var questions #for keeping track of the questions answered +var anchors = {} # for listing the indexes of the anchors + +### CURRENT STATE +var current_timeline: String = '' +var dialog_script: Dictionary = {} +var current_event: Dictionary +var dialog_index: int = 0 +var is_last_text: bool + +var current_background = "" + +# Theme and Audio +var current_theme: ConfigFile +var current_theme_file_name = null +var history_theme: ConfigFile +var audio_data = {} + +# References +var button_container = null + +## ----------------------------------------------------------------------------- +## SCENES +## ----------------------------------------------------------------------------- +onready var ChoiceButton = load("res://addons/dialogic/Nodes/ChoiceButton.tscn") +onready var Portrait = load("res://addons/dialogic/Nodes/Portrait.tscn") +onready var Background = load("res://addons/dialogic/Nodes/Background.tscn") +onready var HistoryTimeline = $History + +## ----------------------------------------------------------------------------- +## SIGNALS +## ----------------------------------------------------------------------------- +# Event end/start +signal event_start(type, event) +signal event_end(type) +# Text Signals +signal text_complete(text_data) +# Timeline end/start +signal timeline_start(timeline_name) +signal timeline_end(timeline_name) +# Custom user signal +signal dialogic_signal(value) +# Utility +signal letter_displayed(lastLetter) + + +## ----------------------------------------------------------------------------- +## SCRIPT +## ----------------------------------------------------------------------------- +func _ready(): + # Set this dialog as the latest (used for saving) + Engine.get_main_loop().set_meta('latest_dialogic_node', self) + # Loading the config files + load_config_files() + + #update_custom_events() + $CustomEvents.update() + + # Checking if the dialog should read the code from a external file + if not timeline.empty(): + set_current_dialog(timeline) + elif dialog_script.keys().size() == 0: + dialog_script = { + "events":[ + {'event_id':'dialogic_001', + "character":"","portrait":"", + "text":"[Dialogic Error] No timeline specified."}] + } + # Load the dialog directly from GDscript + else: + load_dialog() + # Connecting resize signal + get_viewport().connect("size_changed", self, "resize_main") + resize_main() + if !DialogicResources.get_settings_value('dialog', 'stop_mouse', true): + mouse_filter = Control.MOUSE_FILTER_IGNORE + # Connecting some other timers + $OptionsDelayedInput.connect("timeout", self, '_on_OptionsDelayedInput_timeout') + # Setting everything up for the node to be default + $DefinitionInfo.visible = false + $TextBubble.connect("text_completed", self, "_on_text_completed") + $TextBubble.connect("letter_written", self, "_on_letter_written") + $TextBubble.connect("signal_request", self, "_on_signal_request") + $TextBubble.text_label.connect('meta_hover_started', self, '_on_RichTextLabel_meta_hover_started') + $TextBubble.text_label.connect('meta_hover_ended', self, '_on_RichTextLabel_meta_hover_ended') + + $TouchScreenButton.action = Dialogic.get_action_button() + + if Engine.is_editor_hint(): + if preview: + get_parent().connect("resized", self, "resize_main") + _init_dialog() + $DefinitionInfo.in_theme_editor = true + else: + if do_fade_in: _hide_dialog() + _init_dialog() + + +# loads the definitions, themes and settings +func load_config_files(): + # defintiions + if not Engine.is_editor_hint(): + definitions = Dialogic._get_definitions() + else: + definitions = DialogicResources.get_default_definitions() + # settings + settings = DialogicResources.get_settings_config() + # theme + var theme_file = 'res://addons/dialogic/Editor/ThemeEditor/default-theme.cfg' + theme_file = settings.get_value('theme', 'default', 'default-theme.cfg') + current_default_theme = theme_file + current_theme = load_theme(theme_file) + + # history + if settings.has_section('history'): + record_history = settings.get_value('history', 'enable_history_logging', false) + if settings.has_section_key('history', 'history_theme'): + theme_file = settings.get_value('history', 'history_theme') + history_theme = load_theme(theme_file) + HistoryTimeline.load_theme(history_theme) + if settings.has_section_key('history', 'enable_history_logging'): + if settings.get_value('history', 'enable_history_logging'): + HistoryTimeline.initalize_history() + + +## ----------------------------------------------------------------------------- +## CUSTOM EVENTS +## ----------------------------------------------------------------------------- +## not used anymore. use $CustomEvents.update() +func update_custom_events() -> void: + custom_events = {} + var path : String = DialogicResources.get_working_directories()["CUSTOM_EVENTS_DIR"] + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + # goes through all the folders in the custom events folder + while file_name != "": + # if it found a folder + if dir.current_is_dir() and not file_name in ['.', '..']: + + # look through that folder + #print("Found custom event folder: " + file_name) + var event = load(path.plus_file(file_name).plus_file('EventBlock.tscn')).instance() + if event: + custom_events[event.event_data['event_id']] = { + 'event_script' :path.plus_file(file_name).plus_file('event_'+event.event_data['event_id']+'.gd'), + 'event_name' : event.event_name, + } + event.queue_free() + else: + print("[D] An error occurred when trying to access a custom event.") + + + else: + pass # files in the directory are ignored + file_name = dir.get_next() + else: + print("[D] An error occurred when trying to access the custom event folder.") + + +## ----------------------------------------------------------------------------- +## VISUALS +## ----------------------------------------------------------------------------- +# This function makes sure that the dialog is displayed at the correct +# size and position in the screen. +func resize_main(): + var reference = rect_size + if not Engine.is_editor_hint(): + set_global_position(Vector2(0,0)) + reference = get_viewport().get_visible_rect().size + + # Update box position + var anchor = current_theme.get_value('box', 'anchor', 9) + # TODO: remove backups in 2.0 + var margin_bottom = current_theme.get_value('box', 'box_margin_bottom', current_theme.get_value('box', 'box_margin_v', 40) * -1) + var margin_top = current_theme.get_value('box', 'box_margin_top', current_theme.get_value('box', 'box_margin_v', 40)) + var margin_left = current_theme.get_value('box', 'box_margin_left', current_theme.get_value('box', 'box_margin_h', 40)) + var margin_right = current_theme.get_value('box', 'box_margin_right', current_theme.get_value('box', 'box_margin_h', 40) * -1) + # first the y position + if anchor in [0,1,2]: # TOP + $TextBubble.rect_position.y = margin_top + elif anchor in [4,5,6]: # CENTER + $TextBubble.rect_position.y = (reference.y/2)-($TextBubble.rect_size.y/2) + else: + $TextBubble.rect_position.y = (reference.y) - ($TextBubble.rect_size.y) + margin_bottom + + # now x position + if anchor in [0,4,8]: # LEFT + $TextBubble.rect_position.x = margin_left + elif anchor in [1,5,9]: # CENTER + $TextBubble.rect_position.x = (reference.x / 2) - ($TextBubble.rect_size.x / 2) + else: + $TextBubble.rect_position.x = reference.x - ($TextBubble.rect_size.x) + margin_right + + # Update TextBubble background size + var pos_x = 0 + if current_theme.get_value('background', 'full_width', false): + if preview: + pos_x = get_parent().rect_global_position.x + $TextBubble/TextureRect.rect_global_position.x = pos_x + $TextBubble/ColorRect.rect_global_position.x = pos_x + $TextBubble/TextureRect.rect_size.x = reference.x + $TextBubble/ColorRect.rect_size.x = reference.x + else: + $TextBubble/TextureRect.rect_global_position.x = $TextBubble.rect_global_position.x + $TextBubble/ColorRect.rect_global_position.x = $TextBubble.rect_global_position.x + $TextBubble/TextureRect.rect_size.x = $TextBubble.rect_size.x + $TextBubble/ColorRect.rect_size.x = $TextBubble.rect_size.x + + # Button positioning + var button_anchor = current_theme.get_value('buttons', 'anchor', 5) + var anchor_vertical = 1 + var anchor_horizontal = 1 + # OMG WHY IS TIHS NOT A MATCH I CAN'T BELIEVE YOU, WHY YOU DOING THIS TO ME + if button_anchor == 0: + anchor_vertical = 0 + anchor_horizontal = 0 + elif button_anchor == 1: + anchor_vertical = 0 + elif button_anchor == 2: + anchor_vertical = 0 + anchor_horizontal = 2 + # Number skip because of the separator + elif button_anchor == 4: + anchor_horizontal = 0 + elif button_anchor == 6: + anchor_horizontal = 2 + # Number skip because of the separator + elif button_anchor == 8: + anchor_vertical = 2 + anchor_horizontal = 0 + elif button_anchor == 9: + anchor_vertical = 2 + elif button_anchor == 10: + anchor_vertical = 2 + anchor_horizontal = 2 + + var theme_choice_offset = current_theme.get_value('buttons', 'offset', Vector2(0,0)) + var position_offset = Vector2(0,0) + + if anchor_horizontal == 0: + position_offset.x = (reference.x / 2) * -1 + elif anchor_horizontal == 1: + position_offset.x = 0 + elif anchor_horizontal == 2: + position_offset.x = (reference.x / 2) + + if anchor_vertical == 0: + position_offset.y -= (reference.y / 2) + elif anchor_vertical == 1: + position_offset.y += 0 + elif anchor_vertical == 2: + position_offset.y += (reference.y / 2) + + $Options.rect_global_position = Vector2(0,0) + theme_choice_offset + position_offset + $Options.rect_size = reference + + if settings.get_value('input', 'clicking_dialog_action', true): + $TouchScreenButton.shape.extents = reference + + # Background positioning + var background = get_node_or_null('Background') + if background != null: + background.rect_size = reference + + var portraits = get_node_or_null('Portraits') + if portraits != null: + portraits.rect_position.x = reference.x / 2 + portraits.rect_position.y = reference.y + +# calls resize_main +func deferred_resize(current_size, result, anchor): + $TextBubble.rect_size = result + if current_size != $TextBubble.rect_size or current_theme.get_value('box', 'anchor', 9) != anchor: + resize_main() + +# loads the given theme file +func load_theme(filename): + var current_theme_anchor = -1 + if current_theme: + current_theme_anchor = current_theme.get_value('box', 'anchor', 9) + var load_theme = DialogicResources.get_theme_config(filename) + if not load_theme: + return current_theme + var theme = load_theme + current_theme_file_name = filename + # Box size + call_deferred('deferred_resize', $TextBubble.rect_size, theme.get_value('box', 'size', Vector2(910, 167)), current_theme_anchor) + + $TextBubble.load_theme(theme) + HistoryTimeline.change_theme(theme) + $DefinitionInfo.load_theme(theme) + + if theme.get_value('buttons', 'layout', 0) == 0: + button_container = VBoxContainer.new() + else: + button_container = HBoxContainer.new() + button_container.name = 'ButtonContainer' + button_container.alignment = 1 + + for n in $Options.get_children(): + n.queue_free() + $Options.add_child(button_container) + + load_audio(theme) + + if theme.get_value('box', 'portraits_behind_dialog_box', true): + move_child($Portraits, 0) + else: + move_child($Portraits, 1) + + return theme + + +## ----------------------------------------------------------------------------- +## AUDIO +## ----------------------------------------------------------------------------- + +func load_audio(theme): + # Audio + var default_audio_file = "res://addons/dialogic/Example Assets/Sound Effects/Beep.wav" + var default_audio_data = { + 'enable': false, + 'path': default_audio_file, + 'volume': 0.0, + 'volume_rand_range': 0.0, + 'pitch': 1.0, + 'pitch_rand_range': 0.0, + 'allow_interrupt': true, + 'audio_bus': AudioServer.get_bus_name(0) + } + + for audio_node in $FX/Audio.get_children(): + var name = audio_node.name.to_lower() + audio_data[name] = theme.get_value('audio', name, default_audio_data) + + var file_system = Directory.new() + if file_system.dir_exists(audio_data[name].path): + audio_node.load_samples_from_folder(audio_data[name].path) + elif file_system.file_exists(audio_data[name].path) or file_system.file_exists(audio_data[name].path + '.import'): + audio_node.samples = [load(audio_data[name].path)] + + audio_node.set_volume_db(audio_data[name].volume) + audio_node.random_volume_range = audio_data[name].volume_rand_range + audio_node.set_pitch_scale(audio_data[name].pitch) + audio_node.random_pitch_range = audio_data[name].pitch_rand_range + audio_node.set_bus(audio_data[name].audio_bus) + +func play_audio(name): + var node = $FX/Audio.get_node(name.capitalize()) + name = name.to_lower() + if audio_data[name].enable: + if audio_data[name].allow_interrupt or not node.is_playing(): + node.play() + + +## ----------------------------------------------------------------------------- +## LOADING/PARSING DIALOG +## ----------------------------------------------------------------------------- +# load a timeline file and start parsing +func set_current_dialog(dialog_path: String): + current_timeline = dialog_path + dialog_script = DialogicResources.get_timeline_json(dialog_path) + return load_dialog() + +# starts all necessary parsing +func load_dialog(): + # All this parse events should be happening in the same loop ideally + # But until performance is not an issue I will probably stay lazy + # And keep adding different functions for each parsing operation. + if settings.get_value('dialog', 'auto_color_names', true): + dialog_script = DialogicParser.parse_characters(dialog_script) + dialog_script = DialogicParser.parse_text_lines(dialog_script, preview) + dialog_script = DialogicParser.parse_branches(self, dialog_script) + DialogicParser.parse_anchors(self) + return dialog_script + +## ----------------------------------------------------------------------------- +## MAIN GAME-LOGIC +## ----------------------------------------------------------------------------- +# checks if NextIndicator and ChoiceButtons should be visible +func _process(delta): + # Showing or hiding the ▼ next indicator + $TextBubble/NextIndicatorContainer/NextIndicator.visible = is_state(state.READY) + # Showing or hiding the container where the option buttons show up in questions + $Options.visible = is_state(state.WAITING_INPUT) + + # Hide if no input is required + if current_event.has('text'): + if '[nw]' in current_event['text'] or '[nw=' in current_event['text'] or noSkipMode or autoPlayMode: + $TextBubble/NextIndicatorContainer/NextIndicator.visible = false + + # Hide if "Don't Close After Last Event" is checked and event is last text + if current_theme and current_theme.get_value('settings', 'dont_close_after_last_event', false) and is_last_text: + $TextBubble/NextIndicatorContainer/NextIndicator.visible = false + + # Hide if fading in + if is_state(state.ANIMATING): + $TextBubble/NextIndicatorContainer/NextIndicator.visible = false + + +# checks for the "input_next" action +func _input(event: InputEvent) -> void: + if not Engine.is_editor_hint() and event.is_action_pressed(Dialogic.get_action_button()) and autoPlayMode: + autoPlayMode = false + return + + if not Engine.is_editor_hint() and event.is_action_pressed(Dialogic.get_action_button()) and (!noSkipMode and !autoPlayMode): + if HistoryTimeline.block_dialog_advance: + return + if is_state(state.WAITING): + if not current_event: + return + var timer = current_event.get('waiting_timer_skippable') + if timer: + timer.time_left = 0 + else: + if is_state(state.TYPING): + # Skip to end if key is pressed during the text animation + $TextBubble.skip() + # Cut the voice + $FX/CharacterVoice.stop_voice() + else: + if current_event.has('options') and !is_state(state.WAITING_INPUT): + pass + elif is_state(state.WAITING_INPUT) or is_state(state.ANIMATING): + pass + elif $TextBubble/NextIndicatorContainer/NextIndicator.is_visible(): + $FX/CharacterVoice.stop_voice() # stop the current voice as well + play_audio("passing") + _load_next_event() + else: + next_event(false) + if settings.has_section_key('dialog', 'propagate_input'): + var propagate_input: bool = settings.get_value('dialog', 'propagate_input') + if not propagate_input and not is_state(state.WAITING_INPUT): + get_tree().set_input_as_handled() + +func next_event(discreetly: bool): + $FX/CharacterVoice.stop_voice() # stop the current voice as well + if !discreetly: + play_audio("passing") + _load_next_event() + +# when the text finished showing +# plays audio, adds buttons, handles [nw] +func _on_text_completed(): + emit_signal('text_complete', current_event) + + play_audio('waiting') + + # Add the choice buttons for questions + if current_event.has('options'): + # Already showed the text, ready to show the option buttons + set_state(state.WAITING_INPUT) + + var waiting_until_options_enabled = float(settings.get_value('input', 'delay_after_options', 0.1)) + $OptionsDelayedInput.start(waiting_until_options_enabled) + + for o in current_event['options']: + if _should_add_choice_button(o): + add_choice_button(o) + + # Auto focus + $DialogicTimer.start(0.1); yield($DialogicTimer, "timeout") + if settings.get_value('input', 'autofocus_choices', false): + button_container.get_child(0).grab_focus() + + + if current_event.has('text'): + # Already showed the text, ready to show the ▼ next indicator button + set_state(state.READY) + + # [p] needs more work + # Setting the timer for how long to wait in the [nw] events + if '[nw]' in current_event['text'] or '[nw=' in current_event['text'] or noSkipMode or autoPlayMode: + var waiting_time = 2 + var current_index = dialog_index + if '[nw=' in current_event['text']: # Regex stuff + var regex = RegEx.new() + regex.compile("\\[nw=(.+?)\\](.*?)") + var result = regex.search(current_event['text']) + var wait_settings = result.get_string() + #Kva-hack. if the waiting time is set to 'v' + #It will fetch waiting time from CharacterVoice. + waiting_time = wait_settings.split('=')[1] + if(waiting_time.begins_with('v')): + waiting_time = $"FX/CharacterVoice".remaining_time() + else: + waiting_time = float(waiting_time) + #print("Waiting time: " + String(waiting_time)) + #Remove these comments once replaced with proper code. + # - KvaGram + #original line + #waiting_time = float(wait_settings.split('=')[1]) + elif noSkipMode or autoPlayMode: + waiting_time = autoWaitTime + if current_event.has('voice_data'): + waiting_time = $"FX/CharacterVoice".remaining_time() + else: + waiting_time = float(waiting_time) + $DialogicTimer.start(waiting_time); yield($DialogicTimer, "timeout") + if dialog_index == current_index: + _load_next_event() + +# When text reaches a [signal] command +# emits the dialogic signal with the argument +func _on_signal_request(name): + emit_signal("dialogic_signal", name) + +# emits timeline_start and handles autosaving +func on_timeline_start(): + if not Engine.is_editor_hint(): + if settings.get_value('saving', 'autosave', true): + # save to the default slot + Dialogic.save('', true) + # TODO remove event_start in 2.0 + emit_signal("event_start", "timeline", timeline_name) + emit_signal("timeline_start", timeline_name) + +# emits timeline_end and handles autosaving +func on_timeline_end(): + if not Engine.is_editor_hint(): + if settings.get_value('saving', 'autosave', true): + # save to the default slot + Dialogic.save('', true) + # TODO remove event_end in 2.0 + emit_signal("event_end", "timeline") + emit_signal("timeline_end", timeline_name) + +# does checks and calls the above functions +func _emit_timeline_signals(): + if dialog_script.has('events'): + if dialog_index == 0: + on_timeline_start() + elif _is_dialog_finished(): + on_timeline_end() + + +# resets dialog_index and starts first event +func _init_dialog(): + dialog_index = 0 + _load_event() + +# jumps to the event at the given index +func _load_event_at_index(index: int): + dialog_index = index + _load_event() + +# loads the next event +func _load_next_event(): + dialog_index += 1 + _load_event() + +# returns true if dialog_index is outside of the events indexes +func _is_dialog_finished(): + return dialog_index >= dialog_script['events'].size() + +# calls the event_handler +func _load_event(): + # Updates whether the event is the last text box + if dialog_index + 1 >= dialog_script['events'].size(): + is_last_text = true + else: + # Get next event + var next_event = dialog_script['events'][dialog_index + 1] + + # If next event is Text Event, is_last_text is false + if next_event['event_id'] == "dialogic_001": + is_last_text = false + + # Else, if next event is End Branch, set is_last_text to whether the next after exceeds the size of events. + elif 'end_branch_of' in next_event: + is_last_text = dialog_index + 2 >= dialog_script['events'].size() + + # Else, if next event is Choice (and current event is not a Question) + elif 'choice' in next_event and not 'options' in dialog_script['events'][dialog_index]: + # Get Question + var index_in_questions = next_event['question_idx'] + var question = questions[index_in_questions] + var index_in_events = dialog_script['events'].rfind(question, dialog_index) + var end_index = question['end_idx'] + is_last_text = end_index + 1 >= dialog_script['events'].size() + + _emit_timeline_signals() + _hide_definition_popup() + + if dialog_script.has('events'): + if not _is_dialog_finished(): + # CHECK IF NECESSARY! + var func_state = event_handler(dialog_script['events'][dialog_index]) + #if (func_state is GDScriptFunctionState): + # print(func_state) + # yield(func_state, "completed") + elif not Engine.is_editor_hint(): + # If setting 'Don't Close After Last Event' is not checked, free it. + if not current_theme.get_value('settings', 'dont_close_after_last_event', false): + queue_free() + +# Handling an event and updating the available nodes accordingly. +func event_handler(event: Dictionary): + $TextBubble.reset() + clear_options() + + current_event = event + + if record_history: + HistoryTimeline.add_history_row_event(current_event) + + match event['event_id']: + # MAIN EVENTS + # Text Event + 'dialogic_001': + emit_signal("event_start", "text", event) + if fade_in_dialog(): + yield(get_node('fade_in_tween_show_time'), 'tween_completed') + set_state(state.TYPING) + if event.has('character'): + var character_data = DialogicUtil.get_character(event['character']) + grab_portrait_focus(character_data, event) + if character_data.get('data', {}).get('theme', '') and current_theme_file_name != character_data.get('data', {}).get('theme', ''): + current_theme = load_theme(character_data.get('data', {}).get('theme', '')) + elif !character_data.get('data', {}).get('theme', '') and current_default_theme and current_theme_file_name != current_default_theme: + current_theme = load_theme(current_default_theme) + update_name(character_data) + + #voice + handle_voice(event) + update_text(event['text']) + # Character event + 'dialogic_002': + ## PLEASE UPDATE THIS! BUT HOW? + emit_signal("event_start", "action", event) + set_state(state.WAITING) + if event['character'] == '':# No character found on the event. Skip. + _load_next_event() + else: + var character_data = DialogicUtil.get_character(event['character']) + # JOIN MODE ------------------------------------------- + if event.get('type', 0) == 0 and not portrait_exists(character_data): + # CREATE NEW PORTRAIT + var p = Portrait.instance() + + # SET DATA + if current_theme.get_value('settings', 'single_portrait_mode', false): + p.single_portrait_mode = true + p.character_data = character_data + p.dim_time = current_theme.get_value('animation', 'dim_time', 0.5) + + var char_portrait = get_portrait_name(event) + p.init(char_portrait) + p.set_mirror(event.get('mirror_portrait', false)) + + # ADD IT TO THE SCENE + $Portraits.add_child(p) + p.move_to_position(get_character_position(event['position'])) + event = insert_animation_data(event, 'join', 'fade_in_up.gd') + p.animate(event.get('animation', '[No Animation]'), event.get('animation_length', 1)) + p.current_state['character'] = event['character'] + p.current_state['position'] = event['position'] + + # z_index + $Portraits.move_child(p, get_portrait_z_index_point(event.get('z_index', 0))) + p.z_index = event.get('z_index', 0) + + if event.get('animation_wait', false): + yield(p, 'animation_finished') + + + # LEAVE MODE ------------------------------------------- + elif event.get('type', 0) == 1: + if event['character'] == '[All]': + event = insert_animation_data(event, 'leave', 'fade_out_down.gd') + characters_leave_all(event.get('animation', '[No Animation]'), event.get('animation_length', -1)) + if event.get('animation_wait', false): + $DialogicTimer.start(event.get('animation_duration', 1)) + yield($DialogicTimer, "timeout") + else: + for p in $Portraits.get_children(): + if is_instance_valid(p) and p.character_data['file'] == event['character']: + event = insert_animation_data(event, 'leave', 'fade_out_down.gd') + p.animate(event.get('animation', 'instant_out.gd'), event.get('animation_length', 1), 1, true) + if event.get('animation_wait', false): + yield(p, 'animation_finished') + + # UPDATE MODE ------------------------------------------- + else: + if portrait_exists(character_data): + for portrait in $Portraits.get_children(): + if portrait.character_data.get('file', true) == character_data.get('file', false): + # UPDATE PORTRAIT + var portrait_name = get_portrait_name(event) + if portrait_name != portrait.current_state['portrait']: + portrait.set_portrait(portrait_name) + # recalculate the position of the portrait with an instant animation + portrait.move_to_position(get_character_position(portrait.current_state['position'])) + + # UPDATE POSITION + if event.get('change_position', false): + if event['position'] != portrait.current_state['position']: + portrait.move_to_position(get_character_position(event['position'])) + portrait.current_state['position'] = event['position'] + + if event.get('change_mirror_portrait', false): + portrait.set_mirror(event.get('mirror_portrait', false)) + + if event.get('change_z_index', false): + $Portraits.move_child(portrait, get_portrait_z_index_point(event.get('z_index', 0))) + portrait.z_index = event.get('z_index', 0) + + portrait.animate(event.get('animation', '[No Animation]'), event.get('animation_length', 1), event.get('animation_repeat', 1)) + + if event.get('animation_wait', false) and event.get('animation', '[No Animation]') != "[No Animation]": + yield(portrait, 'animation_finished') + set_state(state.READY) + _load_next_event() + + # LOGIC EVENTS + # Question event + 'dialogic_010': + emit_signal("event_start", "question", event) + if fade_in_dialog(): + yield(get_node('fade_in_tween_show_time'), 'tween_completed') + set_state(state.TYPING) + if event.has('name'): + update_name(event['name']) + elif event.has('character'): + var character_data = DialogicUtil.get_character(event['character']) + grab_portrait_focus(character_data, event) + + if character_data.get('data', {}).get('theme', '') and current_theme_file_name != character_data.get('data', {}).get('theme', ''): + current_theme = load_theme(character_data.get('data', {}).get('theme', '')) + elif !character_data.get('data', {}).get('theme', '') and current_default_theme and current_theme_file_name != current_default_theme: + current_theme = load_theme(current_default_theme) + update_name(character_data) + #voice + handle_voice(event) + update_text(event['question']) + # Choice event + 'dialogic_011': + emit_signal("event_start", "choice", event) + for q in questions: + if q['question_idx'] == event['question_idx']: + if q['answered']: + # If the option is for an answered question, skip to the end of it. + _load_event_at_index(q['end_idx']) + # Condition event + 'dialogic_012': + # Treating this conditional as an option on a regular question event + var def_value = null + var current_question = questions[event['question_idx']] + + for d in definitions['variables']: + if d['id'] == event['definition']: + def_value = d['value'] + + var condition_met = def_value != null and DialogicUtil.compare_definitions(def_value, event['value'], event['condition']); + + current_question['answered'] = !condition_met + if !condition_met: + # condition not met, skipping branch + _load_event_at_index(current_question['end_idx']) + else: + # condition met, entering branch + _load_next_event() + # End Branch event + 'dialogic_013': + emit_signal("event_start", "endbranch", event) + _load_next_event() + # Set Value event + 'dialogic_014': + emit_signal("event_start", "set_value", event) + var operation = '=' + if 'operation' in event and not event['operation'].empty(): + operation = event["operation"] + var value = event['set_value'] + if event.get('set_random', false): + value = str(randi()%int(event.get("random_upper_limit", 100)-event.get('random_lower_limit', 0))+event.get('random_lower_limit', 0)) + Dialogic.set_variable_from_id(event['definition'], value, operation) + _load_next_event() + # Anchor event + 'dialogic_015': + emit_signal("event_start", "anchor", event) + _load_next_event() + # GoTo event + 'dialogic_016': + emit_signal("event_start", "goto", event) + dialog_index = anchors[event.get('anchor_id')] + _load_next_event() + + + # TIMELINE EVENTS + # Change Timeline event + 'dialogic_020': + if !event['change_timeline'].empty(): + change_timeline(event['change_timeline']) + # Change Backround event + 'dialogic_021': + emit_signal("event_start", "background", event) + var fade_time = event.get('fade_duration', 1) + var value = event.get('background', '') + var background = get_node_or_null('Background') + + current_background = event['background'] + if background != null: + background.name = "BackgroundFadingOut" + if !value: + background.fade_out(fade_time) + else: + background.remove_with_delay(fade_time) + background = null + + if value != '': + background = Background.instance() + add_child(background) + if (event['background'].ends_with('.tscn')): + var bg_scene = load(event['background']) + bg_scene = bg_scene.instance() + background.modulate = Color(1,1,1,0) + background.add_child(bg_scene) + background.fade_in(fade_time) + else: + background.texture = load(value) + background.fade_in(fade_time) + call_deferred('resize_main') # Executing the resize main to update the background size + + _load_next_event() + # Close Dialog event + 'dialogic_022': + emit_signal("event_start", "close_dialog", event) + set_state(state.ANIMATING) + var transition_duration = event.get('transition_duration', 1.0) + + # fade out characters + insert_animation_data(event, 'leave', 'fade_out_down') + characters_leave_all(event['animation'], event['animation_length']) + + # fade out background + var background = get_node_or_null('Background') + if background != null: + background.name = 'BackgroundFadingOut' + background.fade_out(transition_duration) + + if transition_duration != 0: + var tween = Tween.new() + add_child(tween) + tween.interpolate_property($TextBubble, "modulate", + $TextBubble.modulate, Color('#00ffffff'), transition_duration, + Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) + tween.start() + yield(tween, "tween_all_completed") + + on_timeline_end() + queue_free() + # Wait seconds event + 'dialogic_023': + emit_signal("event_start", "wait", event) + if event.get('hide_dialogbox', true): + $TextBubble.visible = false + set_state(state.WAITING) + var timer = get_tree().create_timer(event['wait_seconds']) + if event.get('waiting_skippable', false): + event['waiting_timer_skippable'] = timer + yield(timer, "timeout") + event.erase('waiting_timer_skippable') + set_state(state.IDLE) + $TextBubble.visible = true + emit_signal("event_end", "wait") + _load_next_event() + # Set Theme event + 'dialogic_024': + emit_signal("event_start", "set_theme", event) + if event['set_theme'] != '': + current_theme = load_theme(event['set_theme']) + current_default_theme = event['set_theme'] + resize_main() + _load_next_event() + # Set Glossary event + 'dialogic_025': + emit_signal("event_start", "set_glossary", event) + if event['glossary_id']: + Dialogic.set_glossary_from_id(event['glossary_id'], event['title'], event['text'],event['extra']) + _load_next_event() + # Save event + 'dialogic_026': + emit_signal('event_start', 'save', event) + var custom_slot :String = event.get('custom_slot', '').strip_edges() + if event.get('use_default_slot', true) or custom_slot == '': + Dialogic.save() + else: + if custom_slot.begins_with("[") and custom_slot.ends_with("]"): + custom_slot = custom_slot.trim_prefix("[").trim_suffix("]") + var saved = false + for definition in definitions['variables']: + if definition['name'] == custom_slot: + Dialogic.save(definition['value']) + saved = true + if not saved: + print("[D] Tried to access value definition '"+custom_slot+"' for saving, but it didn't exist.") + else: + Dialogic.save(custom_slot) + + _load_next_event() + + # AUDIO EVENTS + # Audio event + 'dialogic_030': + emit_signal("event_start", "audio", event) + if event['audio'] == 'play' and 'file' in event.keys() and not event['file'].empty(): + var audio = get_node_or_null('AudioEvent') + if audio == null: + audio = AudioStreamPlayer.new() + audio.name = 'AudioEvent' + add_child(audio) + if event.has('audio_bus'): + if AudioServer.get_bus_index(event['audio_bus']) >= 0: + audio.bus = event['audio_bus'] + if event.has('volume'): + audio.volume_db = event['volume'] + audio.stream = load(event['file']) + audio.play() + else: + var audio = get_node_or_null('AudioEvent') + if audio != null: + audio.stop() + audio.queue_free() + _load_next_event() + # Background Music event + 'dialogic_031': + emit_signal("event_start", "background-music", event) + if event['background-music'] == 'play' and 'file' in event.keys() and not event['file'].empty(): + $FX/BackgroundMusic.crossfade_to(event['file'], event.get('audio_bus', 'Master'), event.get('volume', 0), event.get('fade_length', 1)) + else: + $FX/BackgroundMusic.fade_out(event.get('fade_length', 1)) + _load_next_event() + + # GODOT EVENTS + # Emit signal event + 'dialogic_040': + emit_signal("dialogic_signal", event['emit_signal']) + _load_next_event() + # Change Scene event + 'dialogic_041': + if event.has('scene'): + get_tree().change_scene(event['scene']) + elif event.has('change_scene'): + get_tree().change_scene(event['change_scene']) + # Call Node event + 'dialogic_042': + emit_signal("event_start", "call_node", event) + $TextBubble.visible = false + set_state(state.WAITING) + var target = get_node_or_null(event['call_node']['target_node_path']) + if not target: + target = get_tree().root.get_node_or_null(event['call_node']['target_node_path']) + var method_name = event['call_node']['method_name'] + var args = event['call_node']['arguments'] + if (not args is Array): + args = [] + + if is_instance_valid(target): + if target.has_method(method_name): + var func_result = target.callv(method_name, args) + + if (func_result is GDScriptFunctionState): + yield(func_result, "completed") + + set_state(state.IDLE) + $TextBubble.visible = true + _load_next_event() + 'dialogic_050': + noSkipMode = event['block_input'] + autoWaitTime = event['wait_time'] + _load_next_event() + _: + if event['event_id'] in $CustomEvents.handlers.keys(): + # get the handler node + var handler = $CustomEvents.handlers[event['event_id']] + handler.handle_event(event, self) + else: + visible = false + +func change_timeline(timeline): + dialog_script = set_current_dialog(timeline) + _init_dialog() + + +## ----------------------------------------------------------------------------- +## TEXTBOX-FUNCTIONALITY +## ----------------------------------------------------------------------------- +# updates the Name Label +func update_name(character) -> void: + if character.has('name'): + var parsed_name = character['name'] + if character['data'].get('display_name_bool', false): + if character['display_name'] != '': + parsed_name = character['display_name'] + parsed_name = DialogicParser.parse_definitions(self, parsed_name, true, false) + $TextBubble.update_name(parsed_name, character.get('color', Color.white), current_theme.get_value('name', 'auto_color', true)) + else: + $TextBubble.update_name('') + +# shows the given text in the Text Bubble +# handles the simple translation feature +func update_text(text: String) -> String: + if settings.get_value('dialog', 'translations', false): + text = tr(text) + var final_text = DialogicParser.parse_definitions(self, DialogicParser.parse_alignment(self, text)) + final_text = final_text.replace('[br]', '\n') + + $TextBubble.update_text(final_text) + return final_text + +# plays a sound +func _on_letter_written(lastLetter): + if lastLetter != ' ': + play_audio('typing') + emit_signal('letter_displayed', lastLetter) + + +## ----------------------------------------------------------------------------- +## CHOICE/OPTION BUTTONS +## ----------------------------------------------------------------------------- + +# called when a choice is selected +# hides choices, sets question as answered and jumps to the appropriate event +func answer_question(i, event_idx, question_idx): + play_audio("selecting") + + clear_options() + + # set flags and continue dialog + questions[question_idx]['answered'] = true + _load_event_at_index(event_idx + 1) + + if record_history: + HistoryTimeline.add_answer_to_question(str(i.text)) + + # Revert to last mouse mode when selection is done + if last_mouse_mode != null: + Input.set_mouse_mode(last_mouse_mode) + last_mouse_mode = null + +# deletest the choice buttons +func clear_options(): + # Clearing out the options after one was selected. + for option in button_container.get_children(): + option.queue_free() + +# adds a button for the given choice +func add_choice_button(option: Dictionary) -> Button: + var button = get_classic_choice_button(option['label']) + button_container.set('custom_constants/separation', current_theme.get_value('buttons', 'gap', 20)) + button_container.add_child(button) + + var hotkey + var buttonCount = button_container.get_child_count() + var hotkeyOption = settings.get_value('input', str('choice_hotkey_', buttonCount), '') + + # If there is a hotkey, use that key + if hotkeyOption != '' and hotkeyOption != '[None]': + hotkey = InputEventAction.new() + hotkey.action = hotkeyOption + # otherwise default hotkeys are 1-9 for the first 10 buttons + elif buttonCount < 10 and settings.get_value('input', 'enable_default_shortcut', false): + hotkey = InputEventKey.new() + hotkey.scancode = OS.find_scancode_from_string(str(button_container.get_child_count())) + else: + hotkey = InputEventKey.new() + + if hotkeyOption != '[None]' or settings.get_value('input', 'enable_default_shortcut', false) == true: + var shortcut = ShortCut.new() + shortcut.set_shortcut(hotkey) + + button.set_shortcut(shortcut) + button.shortcut_in_tooltip = false + + # Selecting the first button added + if settings.get_value('input', 'autofocus_choices', false): + if button_container.get_child_count() == 1: + button.grab_focus() + else: + button.focus_mode = FOCUS_NONE + + # Adding audio when focused or hovered + button.connect('focus_entered', self, '_on_option_hovered', [button]) + button.connect('mouse_entered', self, '_on_option_focused') + + button.set_meta('event_idx', option['event_idx']) + button.set_meta('question_idx', option['question_idx']) + + if Input.get_mouse_mode() != Input.MOUSE_MODE_VISIBLE: + last_mouse_mode = Input.get_mouse_mode() + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) # Make sure the cursor is visible for the options selection + + return button + +# checks the condition of the given option +func _should_add_choice_button(option: Dictionary): + if not option['definition'].empty(): + var def_value = null + for d in definitions['variables']: + if d['id'] == option['definition']: + def_value = d['value'] + return def_value != null and DialogicUtil.compare_definitions(def_value, option['value'], option['condition']); + else: + return true + +# instances a custom choice +func get_custom_choice_button(label: String): + var theme = current_theme + var custom_path = current_theme.get_value('buttons', 'custom_path', "") + var CustomChoiceButton = load(custom_path) + var button = CustomChoiceButton.instance() + button.text = label + return button + +# instances a normal dialogic button +func get_classic_choice_button(label: String): + var theme = current_theme + var button : Button = ChoiceButton.instance() + button.text = label + button.set_meta('input_next', Dialogic.get_action_button()) + + # Removing the blue selected border + button.set('custom_styles/focus', StyleBoxEmpty.new()) + # Text + button.set('custom_fonts/font', DialogicUtil.path_fixer_load(theme.get_value('text', 'font', "res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres"))) + + + if theme.get_value('buttons', 'fixed', false): + var size = theme.get_value('buttons', 'fixed_size', Vector2(130,40)) + button.rect_min_size = size + button.rect_size = size + + button_container.set('custom_constants/separation', theme.get_value('buttons', 'gap', 20)) + + # Different styles + var default_background = 'res://addons/dialogic/Example Assets/backgrounds/background-2.png' + var default_style = [ + false, # 0 $TextColor/CheckBox + Color.white, # 1 $TextColor/ColorPickerButton + false, # 2 $FlatBackground/CheckBox + Color.black, # 3 $FlatBackground/ColorPickerButton + true, # 4 $BackgroundTexture/CheckBox + default_background, # 5 $BackgroundTexture/Button + false, # 6 $TextureModulation/CheckBox + Color.white, # 7 $TextureModulation/ColorPickerButton + ] + # Default hover style + var hover_style = [true, Color( 0.698039, 0.698039, 0.698039, 1 ), false, Color.black, true, default_background, false, Color.white] + + var style_normal = theme.get_value('buttons', 'normal', default_style) + var style_hover = theme.get_value('buttons', 'hover', hover_style) + var style_focus = theme.get_value('buttons', 'focus', hover_style) + var style_pressed = theme.get_value('buttons', 'pressed', default_style) + var style_disabled = theme.get_value('buttons', 'disabled', default_style) + + # Text color + var default_color = Color(theme.get_value('text', 'color', '#ffffff')) + button.set('custom_colors/font_color', default_color) + button.set('custom_colors/font_color_hover', default_color.lightened(0.2)) + button.set('custom_colors/font_color_focus', default_color.lightened(0.2)) + button.set('custom_colors/font_color_pressed', default_color.darkened(0.2)) + button.set('custom_colors/font_color_disabled', default_color.darkened(0.8)) + + if style_normal[0]: + button.set('custom_colors/font_color', style_normal[1]) + if style_hover[0]: + button.set('custom_colors/font_color_hover', style_hover[1]) + if style_focus[0]: + button.set('custom_colors/font_color_focus', style_focus[1]) + if style_pressed[0]: + button.set('custom_colors/font_color_pressed', style_pressed[1]) + if style_disabled[0]: + button.set('custom_colors/font_color_disabled', style_disabled[1]) + + + # Style normal + button_style_setter('normal', style_normal, button, theme) + button_style_setter('hover', style_hover, button, theme) + button_style_setter('focus', style_focus, button, theme) + button_style_setter('pressed', style_pressed, button, theme) + button_style_setter('disabled', style_disabled, button, theme) + return button + +# adds parts of a style to the given button +func button_style_setter(section, data, button, theme): + var style_box = StyleBoxTexture.new() + if data[2]: + # I'm using a white texture to do the flat style because otherwise the padding doesn't work. + style_box.set('texture', DialogicUtil.path_fixer_load("res://addons/dialogic/Images/Plugin/white-texture.png")) + style_box.set('modulate_color', data[3]) + else: + if data[4]: + style_box.set('texture', DialogicUtil.path_fixer_load(data[5])) + if data[6]: + style_box.set('modulate_color', data[7]) + + # Padding + var padding = theme.get_value('buttons', 'padding', Vector2(5,5)) + style_box.set('margin_left', padding.x) + style_box.set('margin_right', padding.x) + style_box.set('margin_top', padding.y) + style_box.set('margin_bottom', padding.y) + button.set('custom_styles/' + section, style_box) + +# focuses button on hover +func _on_option_hovered(button): + button.grab_focus() + +# plays the sound +func _on_option_focused(): + play_audio("hovering") + +# connects the signals after a short delay to make accidental clicking less likely +func _on_OptionsDelayedInput_timeout(): + for button in button_container.get_children(): + if button.is_connected("pressed", self, "answer_question") == false: + button.connect("pressed", self, "answer_question", [button, button.get_meta('event_idx'), button.get_meta('question_idx')]) + +## ----------------------------------------------------------------------------- +## VOICE LINE FEATURE +## ----------------------------------------------------------------------------- +# plays the voice line of the event +func handle_voice(event): + var settings_file = DialogicResources.get_settings_config() + if not settings_file.get_value('dialog', 'text_event_audio_enable', false): + return + # In game only + if Engine.is_editor_hint(): + return + + if event.has('voice_data'): + var voice_data = event['voice_data'] + if voice_data.has('0'): + $FX/CharacterVoice.play_voice(voice_data['0']) + return + + $FX/CharacterVoice.stop_voice() + +## ----------------------------------------------------------------------------- +## PORTRAITS +## ----------------------------------------------------------------------------- +# defocuses all characters except the given one +func grab_portrait_focus(character_data, event: Dictionary = {}) -> bool: + var exists = false + for portrait in $Portraits.get_children(): + # check if it's the same character + if portrait.character_data.get("file", "something") == character_data.get("file", "none"): + exists = true + portrait.focus() + if event.has('portrait'): + portrait.set_portrait(get_portrait_name(event)) + if settings.get_value('dialog', 'recenter_portrait', true): + portrait.move_to_position(portrait.direction) + else: + portrait.focusout(Color(current_theme.get_value('animation', 'dim_color', '#ff808080'))) + return exists + +# returns true if the a portrait for that character already exists +func portrait_exists(character_data) -> bool: + var exists = false + for portrait in $Portraits.get_children(): + if portrait.character_data.get('file', true) == character_data.get('file', false): + exists = true + return exists + +# converts PORTRAIT-WEIRDNESS to a word +func get_character_position(positions) -> String: + if positions['0']: + return 'left' + if positions['1']: + return 'center_left' + if positions['2']: + return 'center' + if positions['3']: + return 'center_right' + if positions['4']: + return 'right' + return 'left' + +# returns the portrait name or the definition value (id definition is enabled) +func get_portrait_name(event_data): + var char_portrait = event_data['portrait'] + if char_portrait == '': + char_portrait = "(Don't change)" + + if char_portrait == '[Definition]' and event_data.has('port_defn'): + var portrait_definition = event_data['port_defn'] + if portrait_definition != '': + for d in Dialogic._get_definitions()['variables']: + if d['id'] == portrait_definition: + char_portrait = d['value'] + break + return char_portrait + + +func insert_animation_data(event_data, type = 'join', default = 'fade_in_up'): + var animation = event_data.get('animation', '[Default]') + var length = event_data.get('animation_length', 0.5) + if animation == '[Default]': + animation = DialogicResources.get_settings_value('animations', 'default_'+type+'_animation', default) + length = DialogicResources.get_settings_value('animations', 'default_'+type+'_animation_length', 0.5) + event_data['animation'] = animation + event_data['animation_length'] = length + return event_data + +# moves out all portraits +func characters_leave_all(animation, time): + var portraits = get_node_or_null('Portraits') + if portraits != null: + for p in portraits.get_children(): + p.animate(animation, time, 1, true) + +# returns where to move the portrait, so the fake-z-index looks good +func get_portrait_z_index_point(z_index): + for i in range($Portraits.get_child_count()): + if $Portraits.get_child(i).z_index >= z_index: + return i + return $Portraits.get_child_count() +## ----------------------------------------------------------------------------- +## GLOSSARY POPUP +## ----------------------------------------------------------------------------- +# cheks the 'show_glossary' setting +func _should_show_glossary(): + if current_theme != null: + return current_theme.get_value('definitions', 'show_glossary', true) + return true + +# shows the glossary popup +func _on_RichTextLabel_meta_hover_started(meta): + var correct_type = false + for d in definitions['glossary']: + if d['id'] == meta: + $DefinitionInfo.load_preview({ + 'title': d['title'], + 'body': DialogicParser.parse_definitions(self, d['text'], true, false), # inserts variables but not other glossary items! + 'extra': d['extra'], + }) + correct_type = true + + if correct_type: + definition_visible = true + $DefinitionInfo.visible = definition_visible + # Adding a timer to avoid a graphical glitch + $DefinitionInfo/Timer.stop() + +# hides the glossary popup +func _on_RichTextLabel_meta_hover_ended(meta): + # Adding a timer to avoid a graphical glitch + $DefinitionInfo/Timer.start(0.1) + +# hides the glossary popup +func _hide_definition_popup(): + definition_visible = false + $DefinitionInfo.visible = definition_visible + +# (actually) hides the glossary popup +func _on_Definition_Timer_timeout(): + # Adding a timer to avoid a graphical glitch + definition_visible = false + $DefinitionInfo.visible = definition_visible + + +## ----------------------------------------------------------------------------- +## DIALOG FADING +## ----------------------------------------------------------------------------- +# Since Dialogic has some placeholder text in case something goes wrong +# This will reset the text, reset any modulation it might have, and +# set the variables that handle the fade in to the start position +func _hide_dialog(): + $TextBubble.clear() # Clearing the text + $TextBubble.modulate = Color(1,1,1,0) + dialog_faded_in_already = false + +# start a fade in animation +func fade_in_dialog(time = 0.5): + visible = true + time = current_theme.get_value('animation', 'show_time', 0.5) + var has_tween = false + + if Engine.is_editor_hint() == false: + if dialog_faded_in_already == false and do_fade_in: + var tween = Tween.new() + add_child(tween) + # The tween created ('fade_in_tween_show_time') is also reference for the $TextBubble + # node to know if it should start showing up the letters of the dialog or not. + tween.name = 'fade_in_tween_show_time' + $TextBubble.modulate.a = 0 + tween.interpolate_property($TextBubble, "modulate", + $TextBubble.modulate, Color(1,1,1,1), time, + Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) + tween.start() + tween.connect("tween_completed", self, "finished_fade_in_dialog", [tween]) + has_tween = true + + if has_tween: + set_state(state.ANIMATING) + dialog_faded_in_already = true + return true + return false + +# at the end of fade animation, reset flags +func finished_fade_in_dialog(object, key, node): + node.queue_free() + if !current_event.has('options'): + set_state(state.IDLE) + dialog_faded_in_already = true + +## ----------------------------------------------------------------------------- +## LOADING AND SAVING +## ----------------------------------------------------------------------------- +# returns all important data in a dictionary to be saved +func get_current_state_info(): + var state = {} + + # visible characters: + state["portraits"] = [] + for portrait in $Portraits.get_children(): + state['portraits'].append(portrait.current_state) + state['portraits'][-1]['z_index'] = portrait.z_index + + # background music: + state['background_music'] = $FX/BackgroundMusic.get_current_info() + + # current_timeline and event + state["timeline"] = current_timeline + state['event_idx'] = dialog_index + + # current background + state['background'] = current_background + + return state + +# loads all important data from a dictionary +func resume_state_from_info(state_info): + + # wait until the dialog node was added to the tree + do_fade_in = false + yield(self, "ready") + #print(state_info) + + + + # load the characters + for saved_portrait in state_info['portraits']: + var event = saved_portrait + + # this code is ALL copied from the event_handler. So I should probably outsource it to a function... + var character_data = DialogicUtil.get_character(event['character']) + if portrait_exists(character_data): + for portrait in $Portraits.get_children(): + if portrait.character_data == character_data: + portrait.move_to_position(get_character_position(event['position'])) + portrait.set_mirror(event.get('mirror', false)) + else: + var p = Portrait.instance() + var char_portrait = event['portrait'] + if char_portrait == '': + char_portrait = 'Default' + + if char_portrait == '[Definition]' and event.has('port_defn'): + var portrait_definition = event['port_defn'] + if portrait_definition != '': + for d in DialogicResources.get_default_definitions()['variables']: + if d['id'] == portrait_definition: + char_portrait = d['value'] + break + + if current_theme.get_value('settings', 'single_portrait_mode', false): + p.single_portrait_mode = true + p.dim_time = current_theme.get_value('animation', 'dim_time', 0.5) + p.character_data = character_data + p.init(char_portrait) + + p.set_mirror(event.get('mirror', false)) + $Portraits.add_child(p) + $Portraits.move_child(p, get_portrait_z_index_point(saved_portrait.get('z_index', 0))) + p.move_to_position(get_character_position(event['position'])) + # this info is only used to save the state later + p.current_state['character'] = event['character'] + p.current_state['position'] = event['position'] + + # load the background music + if state_info['background_music'] != null: + $FX/BackgroundMusic.crossfade_to(state_info['background_music']['file'], state_info['background_music']['audio_bus'], state_info['background_music']['volume'], 1) + + # load the background image + if state_info['background']: + current_background = state_info['background'] + + var background = Background.instance() + call_deferred('resize_main') # Executing the resize main to update the background size + + add_child(background) + + if (current_background.ends_with('.tscn')): + var bg_scene = load(current_background) + if (bg_scene): + bg_scene = bg_scene.instance() + background.add_child(bg_scene) + elif (current_background != ''): + background.texture = load(current_background) + + # load the timeline and event + set_current_dialog(state_info['timeline']) + + # mark all previous question events as "answered" + for event_index in range(0, state_info['event_idx']): + if dialog_script['events'][event_index]['event_id'] == 'dialogic_010': + dialog_script['events'][event_index]['answered'] = true + + _load_event_at_index(state_info['event_idx']) + + +## ----------------------------------------------------------------------------- +## Finite State Machine +## ----------------------------------------------------------------------------- +# At the moment both functions are helpers only, but the goal of making them +# as functions and not a simple `_state = whatever` is to also perform certain +# actions when changing from state to state. If needed in the future, we can +# also emit signals and stuff like that without having to go back to every +# state change in the code. + +func set_state(new_state): + var state_string = [ "IDLE", "READY", "TYPING", "WAITING", "WAITING_INPUT", "ANIMATING", ] + #print(state_string[new_state]) + _state = new_state + return _state + +func is_state(check_state): + if _state == check_state: + return true + return false diff --git a/project/addons/dialogic/Nodes/DialogNode.tscn b/project/addons/dialogic/Nodes/DialogNode.tscn new file mode 100644 index 0000000..5f71ea4 --- /dev/null +++ b/project/addons/dialogic/Nodes/DialogNode.tscn @@ -0,0 +1,184 @@ +[gd_scene load_steps=14 format=2] + +[ext_resource path="res://addons/dialogic/Nodes/TextBubble.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres" type="StyleBox" id=2] +[ext_resource path="res://addons/dialogic/Nodes/CharacterVoice.gd" type="Script" id=3] +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres" type="DynamicFont" id=4] +[ext_resource path="res://addons/dialogic/Nodes/glossary_info.gd" type="Script" id=5] +[ext_resource path="res://addons/dialogic/Nodes/DialogNode.gd" type="Script" id=6] +[ext_resource path="res://addons/dialogic/Nodes/BackgroundMusic.tscn" type="PackedScene" id=7] +[ext_resource path="res://addons/dialogic/Nodes/random_audio_stream_player.gd" type="Script" id=8] +[ext_resource path="res://addons/dialogic/Example Assets/Sound Effects/Beep.wav" type="AudioStream" id=9] +[ext_resource path="res://addons/dialogic/Nodes/DialogicCustomEvents.gd" type="Script" id=10] +[ext_resource path="res://addons/dialogic/Nodes/History.tscn" type="PackedScene" id=11] + +[sub_resource type="StyleBoxFlat" id=1] +bg_color = Color( 1, 1, 1, 0 ) +expand_margin_left = 10.0 + +[sub_resource type="RectangleShape2D" id=2] +extents = Vector2( 1280, 720 ) + +[node name="DialogNode" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +script = ExtResource( 6 ) + +[node name="Portraits" type="Control" parent="."] +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = 640.0 +margin_top = 720.0 +margin_right = 640.0 +margin_bottom = 720.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextBubble" parent="." instance=ExtResource( 1 )] +margin_left = 185.0 +margin_top = 513.0 +margin_right = 1095.0 +margin_bottom = 680.0 + +[node name="Options" type="VBoxContainer" parent="."] +visible = false +margin_right = 1280.0 +margin_bottom = 720.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="FX" type="Control" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true, +"_edit_use_anchors_": false +} + +[node name="BackgroundMusic" parent="FX" instance=ExtResource( 7 )] + +[node name="CharacterVoice" type="AudioStreamPlayer" parent="FX"] +script = ExtResource( 3 ) + +[node name="Audio" type="Node" parent="FX"] + +[node name="Typing" type="AudioStreamPlayer" parent="FX/Audio"] +script = ExtResource( 8 ) +samples = [ ExtResource( 9 ) ] +random_strategy = 2 + +[node name="Waiting" type="AudioStreamPlayer" parent="FX/Audio"] +script = ExtResource( 8 ) +samples = [ ExtResource( 9 ) ] +random_strategy = 2 + +[node name="Passing" type="AudioStreamPlayer" parent="FX/Audio"] +script = ExtResource( 8 ) +samples = [ ExtResource( 9 ) ] +random_strategy = 2 + +[node name="Hovering" type="AudioStreamPlayer" parent="FX/Audio"] +script = ExtResource( 8 ) +samples = [ ExtResource( 9 ) ] +random_strategy = 2 + +[node name="Selecting" type="AudioStreamPlayer" parent="FX/Audio"] +script = ExtResource( 8 ) +samples = [ ExtResource( 9 ) ] +random_strategy = 2 + +[node name="DefinitionInfo" type="PanelContainer" parent="."] +visible = false +margin_right = 208.0 +mouse_filter = 1 +size_flags_horizontal = 3 +size_flags_vertical = 3 +custom_styles/panel = ExtResource( 2 ) +script = ExtResource( 5 ) +__meta__ = { +"_edit_group_": true, +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="DefinitionInfo"] +margin_right = 208.0 +margin_bottom = 143.0 +size_flags_horizontal = 3 +size_flags_vertical = 2 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Title" type="RichTextLabel" parent="DefinitionInfo/VBoxContainer"] +margin_right = 208.0 +margin_bottom = 27.0 +size_flags_horizontal = 3 +size_flags_vertical = 4 +custom_colors/default_color = Color( 1, 1, 1, 1 ) +custom_fonts/normal_font = ExtResource( 4 ) +custom_styles/normal = SubResource( 1 ) +bbcode_enabled = true +bbcode_text = "This is the title" +text = "This is the title" +fit_content_height = true +scroll_active = false + +[node name="Content" type="RichTextLabel" parent="DefinitionInfo/VBoxContainer"] +margin_top = 31.0 +margin_right = 208.0 +margin_bottom = 112.0 +size_flags_horizontal = 3 +custom_colors/default_color = Color( 0.756863, 0.756863, 0.756863, 1 ) +custom_fonts/normal_font = ExtResource( 4 ) +custom_styles/normal = SubResource( 1 ) +bbcode_enabled = true +fit_content_height = true +scroll_active = false +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Extra" type="RichTextLabel" parent="DefinitionInfo/VBoxContainer"] +margin_top = 116.0 +margin_right = 208.0 +margin_bottom = 143.0 +size_flags_horizontal = 3 +custom_colors/default_color = Color( 0.756863, 0.756863, 0.756863, 1 ) +custom_fonts/normal_font = ExtResource( 4 ) +custom_styles/normal = SubResource( 1 ) +bbcode_enabled = true +fit_content_height = true +scroll_active = false +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Timer" type="Timer" parent="DefinitionInfo"] + +[node name="OptionsDelayedInput" type="Timer" parent="."] + +[node name="DialogicTimer" type="Timer" parent="."] +one_shot = true + +[node name="CustomEvents" type="Node" parent="."] +script = ExtResource( 10 ) + +[node name="History" parent="." instance=ExtResource( 11 )] + +[node name="TouchScreenButton" type="TouchScreenButton" parent="."] +shape = SubResource( 2 ) +shape_visible = false +action = "dialogic_default_action" +visibility_mode = 1 + +[connection signal="timeout" from="DefinitionInfo/Timer" to="." method="_on_Definition_Timer_timeout"] diff --git a/project/addons/dialogic/Nodes/DialogProxy.gd b/project/addons/dialogic/Nodes/DialogProxy.gd new file mode 100644 index 0000000..29b4eb1 --- /dev/null +++ b/project/addons/dialogic/Nodes/DialogProxy.gd @@ -0,0 +1,52 @@ +extends Control + + +## The timeline to load when starting the scene +export(String, "TimelineDropdown") var timeline: String +export(bool) var add_canvas = true +export(bool) var reset_saves = true + +func _ready(): + if reset_saves: + Dialogic.reset_saves() + var d = Dialogic.start(timeline, '', "res://addons/dialogic/Nodes/DialogNode.tscn", add_canvas) + get_parent().call_deferred('add_child', d) + _copy_signals(d if not add_canvas else d.dialog_node) + queue_free() + +func _copy_signals(dialogic:Node): + var sigs = self.get_signal_list() + for s in sigs: + if not s['name'] in _signals_to_copy: + continue + if not dialogic.has_signal(s['name']): + print("Cannot copy connections of signal " + s['name'] + " from " + self.to_string() + " to " + dialogic.to_string()) + continue + var conns = self.get_signal_connection_list(s['name']) + for c in conns: + dialogic.connect(c['signal'], c['target'], c['method'], c['binds'], c['flags']) + + +var _signals_to_copy = [ + 'event_start', + 'event_end', + 'text_complete', + 'timeline_start', + 'timeline_end', + 'dialogic_signal', + 'letter_displayed', +] +## ----------------------------------------------------------------------------- +## SIGNALS (proxy copy of DialogNode signals) +## ----------------------------------------------------------------------------- +# Event end/start +signal event_start(type, event) +signal event_end(type) +# Text Signals +signal text_complete(text_data) +# Timeline end/start +signal timeline_start(timeline_name) +signal timeline_end(timeline_name) +# Custom user signal +signal dialogic_signal(value) +signal letter_displayed(lastLetter) diff --git a/project/addons/dialogic/Nodes/DialogicCustomEvents.gd b/project/addons/dialogic/Nodes/DialogicCustomEvents.gd new file mode 100644 index 0000000..11832f3 --- /dev/null +++ b/project/addons/dialogic/Nodes/DialogicCustomEvents.gd @@ -0,0 +1,75 @@ +tool +extends Node +class_name DialogicCustomEvents + +# references to the nodes with the handler script +# to be used later by the "event_handler" +# keys: event_id +# values: reference to handler node. +var handlers : = {} + + +## ----------------------------------------------------------------------------- +## Loops through the custom events folder and creates a handler node +## for every custom event. +## +## To handle a custom event simply check if the event_id is in the handlers dicionary keys, +## then get the value (which is the handler node) to call its hadler function +func update() -> void: + var path : String = DialogicResources.get_working_directories()["CUSTOM_EVENTS_DIR"] + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + # goes through all the folders in the custom events folder + while file_name != "": + # if it found a folder + if dir.current_is_dir() and not file_name in ['.', '..']: + + # look through that folder + #print("Found custom event folder: " + file_name) + var event = load(path.plus_file(file_name).plus_file('EventBlock.tscn')).instance() + + if event: + var handler_script_path = path.plus_file(file_name).plus_file('event_'+event.event_data['event_id']+'.gd') + var event_id = event.event_data['event_id'] + var event_name = event.event_name + + # not necesary, we now have the data in the handlers dict + #custom_events[event.event_data['event_id']] = { + # 'event_script' : handler_script_path, + # 'event_name' : event.event_name, + #} + + # Check if we already have a handler node for this event. + if handlers.has(event_id): + #print("Custom event ",event_id," already loaded") + #print("Continuing...") + file_name = dir.get_next() + continue + else: + #print("No handler node for event ",event_id," found.") + #print("Creating...") + # create a node for the custom event an attach the script + var handler = Node.new() + handler.set_script(load(handler_script_path)) + handler.set_name(event_name) + + # not really necessary, but just in case + handler.set_meta("event_id",event_id) + + #add data to dictionary + handlers[event_id] = handler + #add node as a child of this + self.add_child(handler) + + event.queue_free() + else: + print("[D] An error occurred when trying to access a custom event.") + + + else: + pass # files in the directory are ignored + file_name = dir.get_next() + else: + print("[D] An error occurred when trying to access the custom event folder.") diff --git a/project/addons/dialogic/Nodes/History.gd b/project/addons/dialogic/Nodes/History.gd new file mode 100644 index 0000000..4981a81 --- /dev/null +++ b/project/addons/dialogic/Nodes/History.gd @@ -0,0 +1,311 @@ +tool +extends Control + + +export(PackedScene) var HistoryRow = load("res://addons/dialogic/Example Assets/History/HistoryRow.tscn") +export(PackedScene) var HistoryDefaultBackground = load("res://addons/dialogic/Example Assets/History/HistoryBackground.tscn") +export(PackedScene) var HistoryOpenButton = load("res://addons/dialogic/Example Assets/History/HistoryButton.tscn") +export(PackedScene) var HistoryCloseButton = load("res://addons/dialogic/Example Assets/History/HistoryButton.tscn") +export(int) var Vertical_Separation = 16 + +onready var HistoryTimeline = $HistoryPopup/ScrollHistoryContainer/MarginContainer/HistoryTimeline +onready var scrollbar = $HistoryPopup/ScrollHistoryContainer.get_v_scrollbar() +onready var ScrollHistoryContainer = $HistoryPopup/ScrollHistoryContainer +onready var HistoryPopup = $HistoryPopup +onready var HistoryAudio = $HistoryPopup/HistoryAudio + +var HistoryButton +var CloseButton +var HistoryBackground + +var is_history_open = false +var is_mouse_on_button = false +var block_dialog_advance = false setget , history_advance_block + +var lastQuestionNode = null +var curTheme = null +var prevState + +var eventsToLog = ['dialogic_001', 'dialogic_010'] +var logArrivals = false +var logExits = false + +var scrollToBottom = true +var reverseTimeline = false +var characterNameColorOn = true +var lineBreakAfterName = true + +var scrollToggle = false + +func _ready(): + var testHistoryRow = HistoryRow.instance() + assert(testHistoryRow.has_method('add_history'), 'HistoryRow Scene must implement add_history(string, string) method.') + testHistoryRow.queue_free() + + HistoryBackground = HistoryDefaultBackground.instance() + HistoryPopup.add_child(HistoryBackground) + HistoryPopup.move_child(HistoryBackground, 0) + + #Scrollbar only updates when visible, so need it to be handled + scrollbar.connect("changed",self,"handle_scrollbar_changed") + +func handle_scrollbar_changed(): + #It's firing every frame, we only want to check it once on opening + if(scrollToggle): + scrollToggle = false + if (scrollToBottom): + ScrollHistoryContainer.scroll_vertical = scrollbar.max_value + else: + ScrollHistoryContainer.scroll_vertical = 0 + + +func initalize_history(): + if get_parent().settings.get_value('history', 'enable_open_button', true): + HistoryButton = HistoryOpenButton.instance() + add_child(HistoryButton) + HistoryButton.connect("pressed", self, '_on_toggle_history') + HistoryButton.connect("mouse_entered", self, '_on_HistoryButton_mouse_entered') + HistoryButton.connect("mouse_exited", self, '_on_HistoryButton_mouse_exited') + HistoryButton.disabled = false + HistoryButton.show() + + if get_parent().settings.get_value('history', 'enable_close_button', true): + CloseButton = HistoryCloseButton.instance() + add_child(CloseButton) + CloseButton.connect("pressed", self, '_on_toggle_history') + CloseButton.disabled = true + CloseButton.hide() + + # See if we're logging arrivals and exits + logArrivals = get_parent().settings.get_value('history', 'log_arrivals', true) + logExits = get_parent().settings.get_value('history', 'log_exits', true) + if logExits or logArrivals: + eventsToLog.push_back('dialogic_002') + + # Set the other selectable settings options + scrollToBottom = get_parent().settings.get_value('history', 'history_scroll_to_bottom', true) + reverseTimeline = get_parent().settings.get_value('history', 'history_reverse_timeline', false) + characterNameColorOn = get_parent().settings.get_value('history', 'history_name_color_on', true) + lineBreakAfterName = get_parent().settings.get_value('history', 'history_break_after_name', false) + + + # Grab some settings and make the boxes up right + var button_anchor = int(get_parent().settings.get_value('history', 'history_button_position', 2)) + var screen_margin_x = get_parent().settings.get_value('history', 'history_screen_margin_x', 0) + var screen_margin_y = get_parent().settings.get_value('history', 'history_screen_margin_y', 0) + var container_margin_X = get_parent().settings.get_value('history', 'history_container_margin_x', 0) + var container_margin_y = get_parent().settings.get_value('history', 'history_container_margin_y', 0) + + HistoryPopup.margin_left = screen_margin_x + HistoryPopup.margin_right = -screen_margin_x + HistoryPopup.margin_top = screen_margin_y + HistoryPopup.margin_bottom = -screen_margin_y + + ScrollHistoryContainer.margin_left = container_margin_X + ScrollHistoryContainer.margin_right = -container_margin_X + ScrollHistoryContainer.margin_top = container_margin_y + ScrollHistoryContainer.margin_bottom = -container_margin_y + + for button in [HistoryButton, CloseButton]: + if button == null: + continue + + var reference = button.get_parent().rect_size + + # Adding audio when focused or hovered + button.connect('focus_entered', get_parent(), '_on_option_hovered', [button]) + button.connect('mouse_entered', get_parent(), '_on_option_focused') + + # Button positioning + var anchor_values = [0,0,1,1] + var position_offset = Vector2(0,0) + + # Top Left + if button_anchor == 0: + anchor_values = [0, 0, 0, 0] + position_offset.x = 0 + position_offset.y = 0 + # Top Center + elif button_anchor == 1: + anchor_values = [.5, 0, .5, 0] + position_offset.x = reference.x/2 - button.rect_size.x + position_offset.y = 0 + # Top Right + elif button_anchor == 2: + anchor_values = [1, 0, 1, 0] + position_offset.x = reference.x - button.rect_size.x + position_offset.y = 0 + # 3 - Number skip because of the separator + # Center Left + elif button_anchor == 4: + anchor_values = [0, .5, 0, .5] + position_offset.x = 0 + position_offset.y = reference.y/2 - button.rect_size.y + # True Center + elif button_anchor == 5: + anchor_values = [.5, .5, .5, .5] + position_offset.x = reference.x/2 - button.rect_size.x + position_offset.y = reference.y/2 - button.rect_size.y + # Center Right + elif button_anchor == 6: + anchor_values = [1, .5, 1, .5] + position_offset.x = reference.x - button.rect_size.x + position_offset.y = reference.y/2 - button.rect_size.y + # Number skip because of the separator + elif button_anchor == 8: + anchor_values = [0, 1, 0, 1] + position_offset.x = 0 + position_offset.y = reference.y - button.rect_size.y + elif button_anchor == 9: + anchor_values = [.5, 1, .5, 1] + position_offset.x = reference.x/2 - button.rect_size.x + position_offset.y = reference.y - button.rect_size.y + elif button_anchor == 10: + anchor_values = [1, 1, 1, 1] + position_offset.x = reference.x - button.rect_size.x + position_offset.y = reference.y - button.rect_size.y + + button.anchor_left = anchor_values[0] + button.anchor_top = anchor_values[1] + button.anchor_right = anchor_values[2] + button.anchor_bottom = anchor_values[3] + + button.rect_global_position = button.get_parent().rect_global_position + position_offset + + +# Add history based on the passed event, using some logic to get it right +func add_history_row_event(eventData): + # Abort if we aren't logging the event, or if its a character event of type update + if !eventsToLog.has(eventData.event_id) or (eventData.event_id == 'dialogic_002' and eventData.get('type') == 2 ): + return + # Abort if we aren't logging arrivals and its a character event of type arrival + if eventData.event_id == 'dialogic_002' and eventData.get('type') == 0 and !logArrivals: + return + # Abort if we aren't logging exits and its a character event of type exit + if eventData.event_id == 'dialogic_002' and eventData.get('type') == 1 and !logExits: + return + + var newHistoryRow = HistoryRow.instance() + HistoryTimeline.add_child(newHistoryRow) + if(reverseTimeline): + HistoryTimeline.move_child(newHistoryRow,0) + if newHistoryRow.has_method('load_theme') and get_parent().settings.get_value('history', 'enable_dynamic_theme', false) == true: + newHistoryRow.load_theme(curTheme) + + var characterPrefix = '' + if eventData.has('character') and eventData.character != '': + var characterData = DialogicUtil.get_character(eventData.character) + var characterName = characterData.get('name', '') + if eventData.has('character') and eventData.character == '[All]': + characterPrefix = str('Everyone') + elif characterData.data.get('display_name_bool', false) == true: + characterName = characterData.data.get('display_name', '') + + if characterName != '': + var charDelimiter = get_parent().settings.get_value('history', 'history_character_delimiter', '') + var parsed_name = DialogicParser.parse_definitions(get_parent(), characterName, true, false) + var characterColor = characterData.data.get('color', Color.white) + if (!characterNameColorOn): + characterColor = Color.white + var lineBreak = '' + if (lineBreakAfterName): + lineBreak = '\n' + characterPrefix = str("[color=",characterColor,"]", parsed_name, "[/color]", charDelimiter, ' ', lineBreak) + + var audioData = '' + if eventData.has('voice_data'): + if eventData['voice_data'].has('0'): + audioData = eventData['voice_data']['0'].file + newHistoryRow.AudioButton.connect('pressed', self, '_on_audio_trigger', [audioData]) + + + # event logging handled here + # Text Events + if eventData.event_id == 'dialogic_001': + newHistoryRow.add_history(str(characterPrefix, eventData.text), audioData) + # Character Arrivals + elif eventData.event_id == 'dialogic_002': + var logText = get_parent().settings.get_value('history', 'text_arrivals', 'has arrived') + if eventData.get('type') == 1: + logText = get_parent().settings.get_value('history', 'text_exits', 'has left') + newHistoryRow.add_history(str(characterPrefix, ' ', logText), audioData) + # List Choices + elif eventData.event_id == 'dialogic_010': + newHistoryRow.add_history(str(characterPrefix, eventData.question), audioData) + if eventData.has('options') and get_parent().settings.get_value('history', 'log_choices', true): + var choiceString = "\n\t" + for choice in eventData['options']: + choiceString = str(choiceString, '[', choice.label, ']\t') + newHistoryRow.add_history(choiceString, audioData) + lastQuestionNode = newHistoryRow + + +func add_answer_to_question(stringData): + if lastQuestionNode != null: + lastQuestionNode.add_history(str('\n\t', stringData), lastQuestionNode.audioPath) + lastQuestionNode = null + + +func change_theme(newTheme: ConfigFile): + if get_parent().settings.get_value('history', 'enable_dynamic_theme', false): + curTheme = newTheme + + +func load_theme(theme: ConfigFile): + curTheme = theme + + +func _on_audio_trigger(audioFilepath): + HistoryAudio.stream = load(audioFilepath) + HistoryAudio.play() + + +func _on_HistoryPopup_popup_hide(): + HistoryAudio.stop() + + +func _on_HistoryPopup_about_to_show(): + if HistoryButton != null: + scrollToggle = true + HistoryButton.show() + + + +func _on_HistoryButton_mouse_entered(): + is_mouse_on_button = true + + +func _on_HistoryButton_mouse_exited(): + is_mouse_on_button = false + + +func history_advance_block() -> bool: + return is_mouse_on_button or is_history_open + +# Used to manually toggle the history visibility on or off +# This is most useful when you wish to make your own custom controls +func _on_toggle_history(): + if HistoryPopup.visible == false: + _on_HistoryPopup_about_to_show() + HistoryPopup.show() + if HistoryButton != null: + HistoryButton.hide() + HistoryButton.disabled = true + if CloseButton != null: + CloseButton.disabled = false + CloseButton.show() + is_history_open = true + is_mouse_on_button = false + else: + _on_HistoryPopup_popup_hide() + HistoryPopup.hide() + if HistoryButton != null: + HistoryButton.show() + HistoryButton.disabled = false + if CloseButton != null: + CloseButton.disabled = true + CloseButton.hide() + is_history_open = false + is_mouse_on_button = false + + diff --git a/project/addons/dialogic/Nodes/History.tscn b/project/addons/dialogic/Nodes/History.tscn new file mode 100644 index 0000000..15370c2 --- /dev/null +++ b/project/addons/dialogic/Nodes/History.tscn @@ -0,0 +1,54 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryBackground.tscn" type="PackedScene" id=1] +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryRow.tscn" type="PackedScene" id=2] +[ext_resource path="res://addons/dialogic/Nodes/History.gd" type="Script" id=3] +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryButton.tscn" type="PackedScene" id=4] +[ext_resource path="res://addons/dialogic/Example Assets/History/HistoryReturnButton.tscn" type="PackedScene" id=5] + +[node name="History" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 +script = ExtResource( 3 ) +__meta__ = { +"_edit_use_anchors_": false +} +HistoryRow = ExtResource( 2 ) +HistoryDefaultBackground = ExtResource( 1 ) +HistoryOpenButton = ExtResource( 4 ) +HistoryCloseButton = ExtResource( 5 ) + +[node name="HistoryPopup" type="Control" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="HistoryAudio" type="AudioStreamPlayer" parent="HistoryPopup"] + +[node name="ScrollHistoryContainer" type="ScrollContainer" parent="HistoryPopup"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="HistoryPopup/ScrollHistoryContainer"] +margin_right = 1024.0 +margin_bottom = 10.0 +size_flags_horizontal = 3 +custom_constants/margin_right = 5 +custom_constants/margin_top = 5 +custom_constants/margin_left = 5 +custom_constants/margin_bottom = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HistoryTimeline" type="VBoxContainer" parent="HistoryPopup/ScrollHistoryContainer/MarginContainer"] +margin_left = 5.0 +margin_top = 5.0 +margin_right = 1019.0 +margin_bottom = 5.0 +custom_constants/separation = 16 diff --git a/project/addons/dialogic/Nodes/Portrait.gd b/project/addons/dialogic/Nodes/Portrait.gd new file mode 100644 index 0000000..1b20690 --- /dev/null +++ b/project/addons/dialogic/Nodes/Portrait.gd @@ -0,0 +1,204 @@ +extends Control + +var z_index = 0 + +var character_data = { + 'name': 'Default', + 'image': "res://addons/dialogic/Example Assets/portraits/df-3.png", + 'color': Color(0.973511, 1, 0.152344), + 'file': '', + 'mirror_portraits': false +} + +var single_portrait_mode = false +var dim_time = 0.5 +var direction = 'left' +var debug = false +var fading_out = false +var custom_instance : Node2D = null + +var current_state := {'character':'', 'portrait':'', 'position':'', 'mirrored':false} + +signal animation_finished + +func init(expression: String = '') -> void: + set_portrait(expression) + + +func _ready(): + if debug: + print('Character data loaded: ', character_data) + print(rect_position, $TextureRect.rect_size) + + $AnimationTween.connect('finished_animation', self, 'emit_signal', ['animation_finished']) + + +func set_portrait(expression: String) -> void: + if expression == "(Don't change)": + return + + if expression == '': + expression = 'Default' + + current_state['portrait'] = expression + + # Clearing old custom scenes + for n in get_children(): + if 'DialogicCustomPortraitScene' in n.name: + n.queue_free() + + custom_instance = null + + var default + for p in character_data['portraits']: + if p['name'] == expression: + if is_scene(p['path']): + # Creating a scene portrait + var custom_node = load(p['path']) + custom_instance = custom_node.instance() + custom_instance.name = 'DialogicCustomPortraitScene' + add_child(custom_instance) + + $TextureRect.texture = ImageTexture.new() + return + else: + # Creating an image portrait + if ResourceLoader.exists(p['path']): + $TextureRect.texture = load(p['path']) + else: + $TextureRect.texture = ImageTexture.new() + return + + # Saving what the default is to fallback to it. + if p['name'] == 'Default': + default = p['path'] + + + # Everything failed, go with the default one + if is_scene(default): + push_warning('[Dialogic] Portrait missing: "' + expression + '". Maybe you deleted it? Update your timeline.') + # Creating a scene portrait + var custom_node = load(default) + custom_instance = custom_node.instance() + custom_instance.name = 'DialogicCustomPortraitScene' + add_child(custom_instance) + + $TextureRect.texture = ImageTexture.new() + return + else: + # Creating an image portrait + if ResourceLoader.exists(default): + $TextureRect.texture = load(default) + else: + $TextureRect.texture = ImageTexture.new() + return + + + +func set_mirror(value): + current_state['mirrored'] = value + if character_data["data"].has('mirror_portraits'): + if character_data["data"]['mirror_portraits']: + if custom_instance != null: + custom_instance.scale.x *= get_mirror_scale(custom_instance.scale.x, !value) + else: + $TextureRect.flip_h = !value + else: + if custom_instance != null: + custom_instance.scale.x *= get_mirror_scale(custom_instance.scale.x, value) + else: + $TextureRect.flip_h = value + else: + if custom_instance != null: + custom_instance.scale.x *= get_mirror_scale(custom_instance.scale.x, value) + else: + $TextureRect.flip_h = value + + +func move_to_position(position_offset): + var positions = { + 'left': Vector2(-400, 0), + 'right': Vector2(+400, 0), + 'center': Vector2(0, 0), + 'center_right': Vector2(200, 0), + 'center_left': Vector2(-200, 0)} + + direction = position_offset + rect_position = positions[position_offset] + + # Setting the scale of the portrait + var custom_scale = Vector2(1, 1) + if character_data.has('data'): + if character_data['data'].has('scale'): + custom_scale = Vector2( + float(character_data['data']['scale']) / 100, + float(character_data['data']['scale']) / 100 + ) + rect_scale = custom_scale + if character_data['data'].has('offset_x'): + rect_position += Vector2( + character_data['data']['offset_x'], + character_data['data']['offset_y'] + ) + + if $TextureRect.get('texture'): + rect_position -= Vector2( + $TextureRect.texture.get_width() * 0.5, + $TextureRect.texture.get_height() + ) * custom_scale + + +func animate(animation_name = '[No Animation]', time = 1, loop = 1, delete = false ): + if animation_name == "[No Animation]": + return + + if '_in' in animation_name: + if custom_instance != null: + custom_instance.modulate.a = 0 + else: + $TextureRect.modulate = Color(1,1,1,0) + + + $AnimationTween.loop = loop + if custom_instance != null: + $AnimationTween.play(custom_instance, animation_name, time) + else: + $AnimationTween.play($TextureRect, animation_name, time) + + if delete: + if !$AnimationTween.is_connected("tween_all_completed", self, "queue_free"): + $AnimationTween.connect("tween_all_completed", self, "queue_free") + + +func focus(): + if not fading_out: + tween_modulate(modulate, Color(1,1,1, 1)) + + +func focusout(dim_color = Color(0.5, 0.5, 0.5, 1.0)): + if single_portrait_mode: + dim_color.a = 0 + if not fading_out: + tween_modulate(modulate, dim_color) + + +func tween_modulate(from_value, to_value): + $ModulationTween.stop(self, 'modulation') + $ModulationTween.interpolate_property( + self, "modulate", from_value, to_value, dim_time, + Tween.TRANS_LINEAR, Tween.EASE_IN_OUT + ) + $ModulationTween.start() + return $ModulationTween + + +func is_scene(path) -> bool: + if '.tscn' in path.to_lower(): + return true + return false + +func get_mirror_scale(current_scale:float, mirror_value:bool) -> int: + if mirror_value and current_scale > 0: + return -1 + else: + return 1 diff --git a/project/addons/dialogic/Nodes/Portrait.tscn b/project/addons/dialogic/Nodes/Portrait.tscn new file mode 100644 index 0000000..f53abe4 --- /dev/null +++ b/project/addons/dialogic/Nodes/Portrait.tscn @@ -0,0 +1,24 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/dialogic/Nodes/Anima/DialogicAnimaTween.gd" type="Script" id=1] +[ext_resource path="res://addons/dialogic/Nodes/Portrait.gd" type="Script" id=2] + +[node name="Portrait" type="Control"] +rect_scale = Vector2( 0.7, 0.7 ) +script = ExtResource( 2 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="."] +stretch_mode = 6 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationTween" type="Tween" parent="."] +script = ExtResource( 1 ) + +[node name="ModulationTween" type="Tween" parent="."] + +[node name="TweenPosition" type="Tween" parent="."] diff --git a/project/addons/dialogic/Nodes/TextBubble.gd b/project/addons/dialogic/Nodes/TextBubble.gd new file mode 100644 index 0000000..f52d85f --- /dev/null +++ b/project/addons/dialogic/Nodes/TextBubble.gd @@ -0,0 +1,333 @@ +tool +extends Control + +var text_speed := 0.02 # Higher = lower speed +var theme_text_speed = text_speed +var theme_text_max_height = 0 + +#experimental database of current commands +var commands = [] +#the regex matching object +var regex = RegEx.new() +var bbcoderemoverregex = RegEx.new() + +onready var text_container = $TextContainer +onready var text_label = $TextContainer/RichTextLabel +onready var name_label = $NameLabel +onready var next_indicator = $NextIndicatorContainer/NextIndicator + +var _finished := false +var _theme + +signal text_completed() +signal letter_written(lastLetter) +signal signal_request(arg) + +## ***************************************************************************** +## PUBLIC METHODS +## ***************************************************************************** + + +func update_name(name: String, color: Color = Color.white, autocolor: bool=false) -> void: + var name_is_hidden = _theme.get_value('name', 'is_hidden', false) + if name_is_hidden: + name_label.visible = false + return + + if not name.empty(): + # Hack to reset the size + name_label.rect_min_size = Vector2(0, 0) + name_label.rect_size = Vector2(-1, 40) + # Setting the color and text + name_label.text = name + # Alignment + call_deferred('align_name_label') + if autocolor: + name_label.set('custom_colors/font_color', color) + + name_label.visible = true + else: + name_label.visible = false + +func clear(): + text_label.bbcode_text = "" + name_label.text = "" + $WritingTimer.stop() + +func update_text(text:String): + + var orig_text = text + text_label.bbcode_text = text + var text_bbcodefree = text_label.text + + #regex moved from func scope to class scope + #regex compilation moved to _ready + # - KvaGram + #var regex = RegEx.new() + var result:RegExMatch = null + text_speed = theme_text_speed # Resetting the speed to the default + commands = [] + + ### remove commands from text, and store where and what they are + #current regex: \[\s*(nw|(nw|speed|signal|play|pause)\s*=\s*(.+?)\s*)\](.*?) + #Note: The version defined in _ready will have aditional escape characers. + # DO NOT JUST COPY/PASTE + #remeber regex101.com is your friend. Do not shoot it. You may ask it to verify the code. + #The capture groups, and what they do: + # 0 everything ex [speed=5] + # 1 the "nw" single command or one of the variable commands ex "nw" or "speed=5" + # 2 the command, assuming it is an variable command ex "speed" + # 3 the argument, again assuming a variable command ex "5" + # 4 nothing (ignore it) + #keep this up to date whenever the regex string is updated! - KvaGram + + result = regex.search(text_bbcodefree) + #loops until all commands are cleared from the text + while result: + if result.get_string(1) == "nw" || result.get_string(2) == "nw": + #The no wait command is handled elsewhere. Ignore it. + pass + else: + #Store an assigned varible command as an array by 0 index in text, 1 command-name, 2 argument + commands.append([result.get_start()-1, result.get_string(2).strip_edges(), result.get_string(3).strip_edges()]) + text_bbcodefree = text_bbcodefree.substr(0, result.get_start()) + text_bbcodefree.substr(result.get_end()) + text = text.replace(result.get_string(), "") + + result = regex.search(text_bbcodefree) + + text_label.bbcode_text = text + text_label.visible_characters = 0 + + ## SIZING THE RICHTEXTLABEL + # The sizing is done in a very terrible way because the RichtTextLabel has + # a hard time knowing what size it will be and how to display this. + # for this reason the RichTextLabel ist first set to just go for the size it needs, + # even if this might be more than available. + text_label.size_flags_vertical = 0 + text_label.rect_clip_content = 0 + text_label.fit_content_height = true + # a frame later, when the sizes have been updated, it will check if there + # is enough space or the scrollbar should be activated. + call_deferred("update_sizing") + + + # updating the size alignment stuff + text_label.grab_focus() + start_text_timer() + return true + +func update_sizing(): + # this will enable/disable the scrollbar based on the size of the text + theme_text_max_height = text_container.rect_size.y + + if text_label.rect_size.y >= theme_text_max_height: + text_label.fit_content_height = false + text_label.size_flags_vertical = Control.SIZE_EXPAND_FILL + else: + text_label.fit_content_height = true + text_label.size_flags_vertical = 0 + + +#handle an activated command. +func handle_command(command:Array): + if(command[1] == "speed"): + text_speed = float(command[2]) * 0.01 + $WritingTimer.stop() + start_text_timer() + elif(command[1] == "signal"): + emit_signal("signal_request", command[2]) + elif(command[1] == "play"): + var path = "res://dialogic/sounds/" + command[2] + if ResourceLoader.exists(path, "AudioStream"): + var audio:AudioStream = ResourceLoader.load(path, "AudioStream") + $sounds.stream = audio + $sounds.play() + elif(command[1] == "pause"): + $WritingTimer.stop() + var x = text_label.visible_characters + get_parent().get_node("DialogicTimer").start(float(command[2])) + yield(get_parent().get_node("DialogicTimer"), "timeout") + # only continue, if no skip was performed + if text_label.visible_characters == x: + start_text_timer() + + +func skip(): + text_label.visible_characters = -1 + _handle_text_completed() + + +func reset(): + name_label.text = '' + name_label.visible = false + + +func load_theme(theme: ConfigFile): + # Text + var theme_font = DialogicUtil.path_fixer_load(theme.get_value('text', 'font', 'res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres')) + text_label.set('custom_fonts/normal_font', theme_font) + text_label.set('custom_fonts/bold_font', DialogicUtil.path_fixer_load(theme.get_value('text', 'bold_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultBoldFont.tres'))) + text_label.set('custom_fonts/italics_font', DialogicUtil.path_fixer_load(theme.get_value('text', 'italic_font', 'res://addons/dialogic/Example Assets/Fonts/DefaultItalicFont.tres'))) + name_label.set('custom_fonts/font', DialogicUtil.path_fixer_load(theme.get_value('name', 'font', 'res://addons/dialogic/Example Assets/Fonts/NameFont.tres'))) + + # setting the vertical alignment + var alignment = theme.get_value('text', 'alignment',0) + if alignment <= 2: # top + text_container.alignment = BoxContainer.ALIGN_BEGIN + elif alignment <= 5: # center + text_container.alignment = BoxContainer.ALIGN_CENTER + elif alignment <= 8: # bottom + text_container.alignment = BoxContainer.ALIGN_END + + var text_color = Color(theme.get_value('text', 'color', '#ffffffff')) + text_label.set('custom_colors/default_color', text_color) + name_label.set('custom_colors/font_color', text_color) + + text_label.set('custom_colors/font_color_shadow', Color('#00ffffff')) + name_label.set('custom_colors/font_color_shadow', Color('#00ffffff')) + + if theme.get_value('text', 'shadow', false): + var text_shadow_color = Color(theme.get_value('text', 'shadow_color', '#9e000000')) + text_label.set('custom_colors/font_color_shadow', text_shadow_color) + + var shadow_offset = theme.get_value('text', 'shadow_offset', Vector2(2,2)) + text_label.set('custom_constants/shadow_offset_x', shadow_offset.x) + text_label.set('custom_constants/shadow_offset_y', shadow_offset.y) + + + # Text speed + text_speed = theme.get_value('text','speed', 2) * 0.01 + theme_text_speed = text_speed + + # Margin + text_container.set('margin_left', theme.get_value('text', 'text_margin_left', 20)) + text_container.set('margin_right', theme.get_value('text', 'text_margin_right', -20)) + text_container.set('margin_top', theme.get_value('text', 'text_margin_top', 10)) + text_container.set('margin_bottom', theme.get_value('text', 'text_margin_bottom', -10)) + + # Backgrounds + $TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('background','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png")) + $ColorRect.color = Color(theme.get_value('background','color', "#ff000000")) + + if theme.get_value('background', 'modulation', false): + $TextureRect.modulate = Color(theme.get_value('background', 'modulation_color', '#ffffffff')) + else: + $TextureRect.modulate = Color('#ffffffff') + + $ColorRect.visible = theme.get_value('background', 'use_color', false) + $TextureRect.visible = theme.get_value('background', 'use_image', true) + $TextureRect.visible = theme.get_value('background', 'use_image', true) + $TextureRect.patch_margin_left = theme.get_value('ninepatch', 'ninepatch_margin_left', 0) + $TextureRect.patch_margin_right = theme.get_value('ninepatch', 'ninepatch_margin_right', 0) + $TextureRect.patch_margin_top = theme.get_value('ninepatch', 'ninepatch_margin_top', 0) + $TextureRect.patch_margin_bottom = theme.get_value('ninepatch', 'ninepatch_margin_bottom', 0) + + # Next image + $NextIndicatorContainer.rect_position = Vector2(0,0) + next_indicator.texture = DialogicUtil.path_fixer_load(theme.get_value('next_indicator', 'image', 'res://addons/dialogic/Example Assets/next-indicator/next-indicator.png')) + # Reset for up and down animation + next_indicator.margin_top = 0 + next_indicator.margin_bottom = 0 + next_indicator.margin_left = 0 + next_indicator.margin_right = 0 + # Scale + var indicator_scale = theme.get_value('next_indicator', 'scale', 0.4) + next_indicator.rect_scale = Vector2(indicator_scale, indicator_scale) + # Offset + var offset = theme.get_value('next_indicator', 'offset', Vector2(13, 10)) + next_indicator.rect_position = theme.get_value('box', 'size', Vector2(910, 167)) - (next_indicator.texture.get_size() * indicator_scale) + next_indicator.rect_position -= offset + + # Character Name + $NameLabel/ColorRect.visible = theme.get_value('name', 'background_visible', false) + $NameLabel/ColorRect.color = Color(theme.get_value('name', 'background', '#282828')) + $NameLabel/TextureRect.visible = theme.get_value('name', 'image_visible', false) + $NameLabel/TextureRect.texture = DialogicUtil.path_fixer_load(theme.get_value('name','image', "res://addons/dialogic/Example Assets/backgrounds/background-2.png")) + + var name_padding = theme.get_value('name', 'name_padding', Vector2( 10, 0 )) + var name_style = name_label.get('custom_styles/normal') + name_style.set('content_margin_left', name_padding.x) + name_style.set('content_margin_right', name_padding.x) + name_style.set('content_margin_bottom', name_padding.y) + name_style.set('content_margin_top', name_padding.y) + + var name_shadow_offset = theme.get_value('name', 'shadow_offset', Vector2(2,2)) + if theme.get_value('name', 'shadow_visible', true): + name_label.set('custom_colors/font_color_shadow', Color(theme.get_value('name', 'shadow', '#9e000000'))) + name_label.set('custom_constants/shadow_offset_x', name_shadow_offset.x) + name_label.set('custom_constants/shadow_offset_y', name_shadow_offset.y) + name_label.rect_position.y = theme.get_value('name', 'bottom_gap', 48) * -1 - (name_padding.y) + if theme.get_value('name', 'modulation', false) == true: + $NameLabel/TextureRect.modulate = Color(theme.get_value('name', 'modulation_color', '#ffffffff')) + else: + $NameLabel/TextureRect.modulate = Color('#ffffffff') + + + # Setting next indicator animation + next_indicator.self_modulate = Color('#ffffff') + var animation = theme.get_value('next_indicator', 'animation', 'Up and down') + next_indicator.get_node('AnimationPlayer').play(animation) + + # Saving reference to the current theme + _theme = theme + +## ***************************************************************************** +## PRIVATE METHODS +## ***************************************************************************** + + +func _on_writing_timer_timeout(): + if _finished == false: + text_label.visible_characters += 1 + if(commands.size()>0 && commands[0][0] <= text_label.visible_characters): + handle_command(commands.pop_front()) #handles the command, and removes it from the queue + if text_label.visible_characters > text_label.get_total_character_count(): + _handle_text_completed() + elif ( + text_label.visible_characters > 0 #and + #text_label.text.length() > text_label.visible_characters-1 and + #text_label.text[text_label.visible_characters-1] != " " + ): + emit_signal('letter_written', text_label.text[text_label.visible_characters-1] ) + else: + $WritingTimer.stop() + + +func start_text_timer(): + if text_speed == 0: + text_label.visible_characters = -1 + _handle_text_completed() + else: + $WritingTimer.start(text_speed) + _finished = false + + +func _handle_text_completed(): + $WritingTimer.stop() + _finished = true + emit_signal("text_completed") + + +func align_name_label(): + var name_padding = _theme.get_value('name', 'name_padding', Vector2( 10, 0 )) + var horizontal_offset = _theme.get_value('name', 'horizontal_offset', 0) + var name_label_position = _theme.get_value('name', 'position', 0) + var label_size = name_label.rect_size.x + if name_label_position == 0: + name_label.rect_global_position.x = rect_global_position.x + horizontal_offset + elif name_label_position == 1: # Center + name_label.rect_global_position.x = rect_global_position.x + (rect_size.x / 2) - (label_size / 2) + horizontal_offset + elif name_label_position == 2: # Right + name_label.rect_global_position.x = rect_global_position.x + rect_size.x - label_size + horizontal_offset + +## ***************************************************************************** +## OVERRIDES +## ***************************************************************************** + + +func _ready(): + reset() + $WritingTimer.connect("timeout", self, "_on_writing_timer_timeout") + text_label.meta_underlined = false + regex.compile("\\[\\s*(nw|(nw|speed|signal|play|pause)\\s*=\\s*(.+?)\\s*)\\](.*?)") + diff --git a/project/addons/dialogic/Nodes/TextBubble.tscn b/project/addons/dialogic/Nodes/TextBubble.tscn new file mode 100644 index 0000000..17c4538 --- /dev/null +++ b/project/addons/dialogic/Nodes/TextBubble.tscn @@ -0,0 +1,194 @@ +[gd_scene load_steps=11 format=2] + +[ext_resource path="res://addons/dialogic/Example Assets/Fonts/DefaultFont.tres" type="DynamicFont" id=1] +[ext_resource path="res://addons/dialogic/Example Assets/backgrounds/background-2.png" type="Texture" id=2] +[ext_resource path="res://addons/dialogic/Example Assets/next-indicator/next-indicator.png" type="Texture" id=3] +[ext_resource path="res://addons/dialogic/Nodes/TextBubble.gd" type="Script" id=4] + +[sub_resource type="StyleBoxEmpty" id=1] + +[sub_resource type="StyleBoxFlat" id=2] +bg_color = Color( 1, 1, 1, 0 ) +expand_margin_left = 10.0 + +[sub_resource type="Animation" id=3] +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath(".:self_modulate") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Color( 1, 1, 1, 1 ), Color( 1, 1, 1, 0 ) ] +} + +[sub_resource type="Animation" id=4] + +[sub_resource type="Animation" id=5] +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("..:rect_position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5 ), +"transitions": PoolRealArray( 1, 1 ), +"update": 0, +"values": [ Vector2( 0, 0 ), Vector2( 0, -10 ) ] +} + +[sub_resource type="StyleBoxFlat" id=6] +content_margin_left = 10.0 +content_margin_right = 10.0 +content_margin_top = 0.0 +content_margin_bottom = 0.0 +bg_color = Color( 1, 1, 1, 0 ) +expand_margin_left = 10.0 + +[node name="TextBubble" type="Control"] +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -455.0 +margin_top = 399.0 +margin_right = 455.0 +margin_bottom = 560.0 +script = ExtResource( 4 ) + +[node name="ColorRect" type="ColorRect" parent="."] +visible = false +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0, 0, 0, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="NinePatchRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +texture = ExtResource( 2 ) + +[node name="TextContainer" type="VBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 10.0 +margin_top = 12.0 +margin_right = -10.0 +margin_bottom = -12.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="RichTextLabel" type="RichTextLabel" parent="TextContainer"] +margin_top = 11.0 +margin_right = 890.0 +margin_bottom = 125.0 +focus_mode = 2 +custom_colors/default_color = Color( 1, 1, 1, 1 ) +custom_colors/selection_color = Color( 0, 0, 0, 0 ) +custom_colors/font_color_shadow = Color( 1, 1, 1, 0 ) +custom_constants/shadow_offset_x = 2 +custom_constants/shadow_offset_y = 2 +custom_fonts/normal_font = ExtResource( 1 ) +custom_styles/focus = SubResource( 1 ) +custom_styles/normal = SubResource( 2 ) +bbcode_enabled = true +bbcode_text = "Placeholder text for testing an formatting. +Placeholder text for testing an formatting. +adsd" +visible_characters = 0 +percent_visible = 0.0 +meta_underlined = false +text = "Placeholder text for testing an formatting. +Placeholder text for testing an formatting. +adsd" +fit_content_height = true +selection_enabled = true +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NextIndicatorContainer" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="NextIndicator" type="TextureRect" parent="NextIndicatorContainer"] +margin_top = -10.0 +margin_right = 51.0 +margin_bottom = 41.0 +texture = ExtResource( 3 ) +stretch_mode = 4 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="NextIndicatorContainer/NextIndicator"] +autoplay = "Up and down" +anims/Pulse = SubResource( 3 ) +anims/Static = SubResource( 4 ) +"anims/Up and down" = SubResource( 5 ) + +[node name="NameLabel" type="Label" parent="."] +visible = false +margin_top = -48.0 +margin_right = 58.0 +margin_bottom = -8.0 +size_flags_vertical = 1 +custom_colors/font_color = Color( 0.423529, 0.580392, 0.74902, 1 ) +custom_colors/font_color_shadow = Color( 0, 0, 0, 0.619608 ) +custom_constants/shadow_offset_x = 2 +custom_constants/shadow_offset_y = 2 +custom_fonts/font = ExtResource( 1 ) +custom_styles/normal = SubResource( 6 ) +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ColorRect" type="ColorRect" parent="NameLabel"] +visible = false +show_behind_parent = true +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 15 +size_flags_vertical = 15 +color = Color( 0.156863, 0.156863, 0.156863, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="TextureRect" type="TextureRect" parent="NameLabel"] +visible = false +show_behind_parent = true +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource( 2 ) +expand = true +stretch_mode = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="WritingTimer" type="Timer" parent="."] + +[node name="Tween" type="Tween" parent="."] + +[node name="sounds" type="AudioStreamPlayer" parent="."] +autoplay = true diff --git a/project/addons/dialogic/Nodes/canvas_dialog_node.gd b/project/addons/dialogic/Nodes/canvas_dialog_node.gd new file mode 100644 index 0000000..b80366a --- /dev/null +++ b/project/addons/dialogic/Nodes/canvas_dialog_node.gd @@ -0,0 +1,84 @@ +extends CanvasLayer + +## Mirror node to Dialogic node that duplicate its signals +## and had a reference to that Dialogic node + +# Copied +# Event end/start +signal event_start(type, event) +signal event_end(type) +# Timeline end/start +signal timeline_start(timeline_name) +signal timeline_end(timeline_name) +signal text_complete(text_event) +# Custom user signal +signal dialogic_signal(value) +signal letter_displayed(lastLetter) + +var _dialog_node_scene = load("res://addons/dialogic/Nodes/DialogNode.tscn") +var dialog_node = null + + +func set_dialog_node_scene(scene) -> void: + _dialog_node_scene = scene + dialog_node = _dialog_node_scene.instance() + var _err:int + if dialog_node: + _err = dialog_node.connect("event_start", self, "_on_event_start") + assert(_err == OK) + _err = dialog_node.connect("event_end", self, "_on_event_end") + assert(_err == OK) + _err = dialog_node.connect("timeline_start", self, "_on_timeline_start") + assert(_err == OK) + _err = dialog_node.connect("timeline_end", self, "_on_timeline_end") + assert(_err == OK) + _err = dialog_node.connect("text_complete", self, "_on_text_complete") + assert(_err == OK) + _err = dialog_node.connect("dialogic_signal", self, "_on_dialogic_signal") + assert(_err == OK) + _err = dialog_node.connect("letter_displayed", self, "_on_letter_displayed") + assert(_err == OK) + +func _enter_tree() -> void: + if dialog_node: + add_child(dialog_node) + dialog_node.connect('tree_exited', self, 'dialog_finished') + +func dialog_finished(): + queue_free() + + +func _ready() -> void: + # change the canvas layer + var config = DialogicResources.get_settings_config() + layer = int(config.get_value("theme", "canvas_layer", 1)) + + + + +func _on_event_start(type, event) -> void: + emit_signal("event_start", type, event) + + +func _on_event_end(type) -> void: + emit_signal("event_end", type) + + +func _on_timeline_start(timeline_name) -> void: + emit_signal("timeline_start", timeline_name) + + +func _on_timeline_end(timeline_name) -> void: + emit_signal("timeline_end", timeline_name) + + +func _on_text_complete(text_event) -> void: + emit_signal("text_complete", text_event) + + +func _on_dialogic_signal(value) -> void: + emit_signal("dialogic_signal", value) + + +func _on_letter_displayed(last_letter): + emit_signal("letter_displayed", last_letter) diff --git a/project/addons/dialogic/Nodes/glossary_info.gd b/project/addons/dialogic/Nodes/glossary_info.gd new file mode 100644 index 0000000..f71c2d2 --- /dev/null +++ b/project/addons/dialogic/Nodes/glossary_info.gd @@ -0,0 +1,66 @@ +tool +extends PanelContainer + +onready var nodes = { + 'title': $VBoxContainer/Title, + 'body': $VBoxContainer/Content, + 'extra': $VBoxContainer/Extra, +} + +var in_theme_editor = false +var margin = 10 + + +func _ready(): + set_deferred('rect_size.y', 0) + nodes['title'].bbcode_enabled = true + nodes['body'].bbcode_enabled = true + nodes['extra'].bbcode_enabled = true + + +func _process(_delta): + if Engine.is_editor_hint() == false or in_theme_editor == true: + if visible: + if get_global_mouse_position().x < get_viewport().size.x * 0.5: + rect_global_position = get_global_mouse_position() - Vector2(0, rect_size.y + (margin * 2)) + else: + rect_global_position = get_global_mouse_position() - rect_size - Vector2(0, (margin * 2)) + rect_size.y = 0 +# + +func load_preview(info): + nodes['title'].visible = false + nodes['body'].visible = false + nodes['extra'].visible = false + + if info['title'] != '': + nodes['title'].bbcode_text = info['title'] + nodes['title'].visible = true + + if info['body'] != '': + nodes['body'].bbcode_text = info['body'] + nodes['body'].visible = true + + if info['extra'] != '': + nodes['extra'].bbcode_text = info['extra'] + nodes['extra'].visible = true + + +func load_theme(theme): + # Fonts + $VBoxContainer/Title.set( + 'custom_fonts/normal_font', + DialogicUtil.path_fixer_load(theme.get_value('definitions', 'font', "res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres"))) + $VBoxContainer/Title.set('custom_colors/default_color', theme.get_value('definitions', 'title_color', "#ffffffff")) + + $VBoxContainer/Content.set( + 'custom_fonts/normal_font', + DialogicUtil.path_fixer_load(theme.get_value('definitions', 'text_font', "res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres"))) + $VBoxContainer/Content.set('custom_colors/default_color', theme.get_value('definitions', 'text_color', "#c1c1c1")) + + $VBoxContainer/Extra.set( + 'custom_fonts/normal_font', + DialogicUtil.path_fixer_load(theme.get_value('definitions', 'extra_font', "res://addons/dialogic/Example Assets/Fonts/GlossaryFont.tres"))) + $VBoxContainer/Extra.set('custom_colors/default_color', theme.get_value('definitions', 'extra_color', "#c1c1c1")) + + set("custom_styles/panel", load(theme.get_value('definitions', 'background_panel', "res://addons/dialogic/Example Assets/backgrounds/GlossaryBackground.tres"))) diff --git a/project/addons/dialogic/Nodes/random_audio_stream_player.gd b/project/addons/dialogic/Nodes/random_audio_stream_player.gd new file mode 100644 index 0000000..df17e1a --- /dev/null +++ b/project/addons/dialogic/Nodes/random_audio_stream_player.gd @@ -0,0 +1,91 @@ +# Random Audio Stream PLayer Godot Engine Add-on +# Copyright (c) Tim Krief. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +tool +extends AudioStreamPlayer + +export(Array, AudioStream) var samples = [] +export(String, DIR) var select_samples_from_folder setget load_samples_from_folder +export(int, "Pure", "No consecutive repetition", "Use all samples before repeat") var random_strategy = 0 +onready var base_volume = volume_db +export(float, 0, 80) var random_volume_range = 0 +onready var base_pitch = pitch_scale +export(float, 0, 4) var random_pitch_range = 0 + +var playing_sample_nb : int = -1 +var last_played_sample_nb : int = -1 # only used if random_strategy = 1 +var to_play = [] # only used if random_strategy = 2 + +# You can use playing_sample_nb to choose what sample to use +func play(from_position=0.0, playing_sample_nb=-1): + var number_of_samples = len(samples) + if number_of_samples > 0: + if playing_sample_nb < 0: + if number_of_samples == 1: + playing_sample_nb = 0 + else: + match random_strategy: + 1: + playing_sample_nb = randi() % (number_of_samples - 1) + if last_played_sample_nb == playing_sample_nb: + playing_sample_nb += 1 + last_played_sample_nb = playing_sample_nb + 2: + if len(to_play) == 0: + for i in range(number_of_samples): + if i != last_played_sample_nb: + to_play.append(i) + to_play.shuffle() + playing_sample_nb = to_play.pop_back() + last_played_sample_nb = playing_sample_nb + _: + playing_sample_nb = randi() % number_of_samples + if random_volume_range != 0: + .set_volume_db(base_volume + (randf() - .5) * random_volume_range) + if random_pitch_range != 0: + .set_pitch_scale(max(0.0001, base_pitch + (randf() - .5) * random_pitch_range)) + set_stream(samples[playing_sample_nb]) + .play(from_position) + +func set_volume_db(new_volume_db): + .set_volume_db(new_volume_db) + base_volume = new_volume_db + +func set_pitch_scale(new_pitch): + .set_pitch_scale(max(0.0001, new_pitch)) + base_pitch = new_pitch + +func load_samples_from_folder(path): + if path != "": + samples.clear() + var dir = Directory.new() + if dir.open(path) == OK: + dir.list_dir_begin(true) + var file_name = dir.get_next() + while file_name != "": + if not dir.current_is_dir() and file_name.ends_with(".import"): + var resource_path = dir.get_current_dir() + "/" + file_name.replace('.import', '') + if resource_path.get_extension().to_lower() in ["wav", "ogg"]: + var resource = load(resource_path) + if resource != null: + samples.append(resource) + file_name = dir.get_next() + select_samples_from_folder = "" diff --git a/project/addons/dialogic/Other/DialogicClass.gd b/project/addons/dialogic/Other/DialogicClass.gd new file mode 100644 index 0000000..501976d --- /dev/null +++ b/project/addons/dialogic/Other/DialogicClass.gd @@ -0,0 +1,548 @@ +extends Node + +## Exposed and safe to use methods for Dialogic +## See documentation under 'https://github.com/coppolaemilio/dialogic' or in the editor: + +## ### /!\ ### +## Do not use methods from other classes as it could break the plugin's integrity +## ### /!\ ### + +## Trying to follow this documentation convention: https://github.com/godotengine/godot/pull/41095 +class_name Dialogic + + +## Refactor the start function for 2.0 there should be a cleaner way to do it :) + +## Starts the dialog for the given timeline and returns a Dialog node. +## You must then add it manually to the scene to display the dialog. +## +## Example: +## var new_dialog = Dialogic.start('Your Timeline Name Here') +## add_child(new_dialog) +## +## This is similar to using the editor: +## you can drag and drop the scene located at /addons/dialogic/Dialog.tscn +## and set the current timeline via the inspector. +## +## @param timeline The timeline to load. You can provide the timeline name or the filename. +## If you leave it empty, it will try to load from current data +## In that case, you should do Dialogic.load() or Dialogic.import() before. +## @param default_timeline If timeline == '' and no valid data was found, this will be loaded. +## @param dialog_scene_path If you made a custom Dialog scene or moved it from its default path, you can specify its new path here. +## @param use_canvas_instead Create the Dialog inside a canvas layer to make it show up regardless of the camera 2D/3D situation. +## @returns A Dialog node to be added into the scene tree. +static func start(timeline: String = '', default_timeline: String ='', dialog_scene_path: String="res://addons/dialogic/Nodes/DialogNode.tscn", use_canvas_instead=true): + var dialog_scene = load(dialog_scene_path) + var dialog_node = null + var canvas_dialog_node = null + var returned_dialog_node = null + + if use_canvas_instead: + var canvas_dialog_script = load("res://addons/dialogic/Nodes/canvas_dialog_node.gd") + canvas_dialog_node = canvas_dialog_script.new() + canvas_dialog_node.set_dialog_node_scene(dialog_scene) + dialog_node = canvas_dialog_node.dialog_node + else: + dialog_node = dialog_scene.instance() + + returned_dialog_node = dialog_node if not canvas_dialog_node else canvas_dialog_node + + ## 1. Case: A slot has been loaded OR data has been imported + if timeline == '': + if (Engine.get_main_loop().has_meta('last_dialog_state') + and not Engine.get_main_loop().get_meta('last_dialog_state').empty() + and not Engine.get_main_loop().get_meta('last_dialog_state').get('timeline', '').empty()): + + dialog_node.resume_state_from_info(Engine.get_main_loop().get_meta('last_dialog_state')) + return returned_dialog_node + + ## The loaded data isn't complete + elif (Engine.get_main_loop().has_meta('current_timeline') + and not Engine.get_main_loop().get_meta('current_timeline').empty()): + timeline = Engine.get_main_loop().get_meta('current_timeline') + + ## Else load the default timeline + else: + timeline = default_timeline + + ## 2. Case: A specific timeline should be started + + # check if it's a file name + if timeline.ends_with('.json'): + for t in DialogicUtil.get_timeline_list(): + if t['file'] == timeline: + dialog_node.timeline = t['file'] + dialog_node.timeline_name = timeline + return returned_dialog_node + # No file found. Show error + dialog_node.dialog_script = { + "events":[ + {"event_id":'dialogic_001', + "character":"", + "portrait":"", + "text":"[Dialogic Error] Loading dialog [color=red]" + timeline + "[/color]. It seems like the timeline doesn't exists. Maybe the name is wrong?" + }] + } + return returned_dialog_node + + # else get the file from the name + var timeline_file = _get_timeline_file_from_name(timeline) + if timeline_file: + dialog_node.timeline = timeline_file + dialog_node.timeline_name = timeline + return returned_dialog_node + + # Just in case everything else fails. + return returned_dialog_node + +# Loads the given timeline into the active DialogNode +# This means it's state (theme, characters, background, music) is preserved. +# +# @param timeline the name of the timeline to load +static func change_timeline(timeline: String) -> void: + # Set Timeline + set_current_timeline(timeline) + + # If there is a dialog node + if has_current_dialog_node(): + var dialog_node = Engine.get_main_loop().get_meta('latest_dialogic_node') + + # Get file name + var timeline_file = _get_timeline_file_from_name(timeline) + + dialog_node.change_timeline(timeline_file) + else: + print("[D] Tried to change timeline, but no DialogNode exists!") + +# Immediately plays the next event. +# +# @param discreetly determines whether the Passing Audio will be played in the process +static func next_event(discreetly: bool = false): + + # If there is a dialog node + if has_current_dialog_node(): + var dialog_node = Engine.get_main_loop().get_meta('latest_dialogic_node') + + dialog_node.next_event(discreetly) + + +################################################################################ +## Test to see if a timeline exists +################################################################################ + +## Check to see if a timeline with a given name/path exists. Useful for verifying +## before calling a timeline, or for automated tests to make sure timeline calls +## are valid. Returns a boolean of true if the timeline exists, and false if it +## does not. +static func timeline_exists(timeline: String): + var timeline_file = _get_timeline_file_from_name(timeline) + if timeline_file: + return true + else: + return false + + +################################################################################ +## BUILT-IN SAVING/LOADING +################################################################################ + +## Loads the given slot +static func load(slot_name: String = ''): + _load_from_slot(slot_name) + Engine.get_main_loop().set_meta('current_save_slot', slot_name) + + +## Saves the current definitions and the latest added dialog nodes state info. +## +## @param slot_name The name of the save slot. To load this save you have to specify the same +## If the slot folder doesn't exist it will be created. +static func save(slot_name: String = '', is_autosave = false) -> void: + # check if to save (if this is a autosave) + if is_autosave and not get_autosave(): + return + + # gather the info + var current_dialog_info = {} + if has_current_dialog_node(): + current_dialog_info = Engine.get_main_loop().get_meta('latest_dialogic_node').get_current_state_info() + + var game_state = {} + if Engine.get_main_loop().has_meta('game_state'): + game_state = Engine.get_main_loop().get_meta('game_state') + + var save_data = { + 'game_state': game_state, + 'dialog_state': current_dialog_info + } + + # save the information + _save_state_and_definitions(slot_name, save_data) + + +## Returns an array with the names of all available slots. +static func get_slot_names() -> Array: + return DialogicResources.get_saves_folders() + + +## Will permanently erase the data in the given save_slot. +## +## @param slot_name The name of the slot folder. +static func erase_slot(slot_name: String) -> void: + DialogicResources.remove_save_folder(slot_name) + + +## Whether a save can be performed +## +## @returns True if a save can be performed; otherwise False +static func has_current_dialog_node() -> bool: + return Engine.get_main_loop().has_meta('latest_dialogic_node') and is_instance_valid(Engine.get_main_loop().get_meta('latest_dialogic_node')) + + +## Resets the state and definitions of the given save slot +## +## By default this will also LOAD that reseted save +static func reset_saves(slot_name: String = '', reload:= true) -> void: + DialogicResources.reset_save(slot_name) + if reload: _load_from_slot(slot_name) + + +## Returns the currently loaded save slot +static func get_current_slot(): + if Engine.get_main_loop().has_meta('current_save_slot'): + return Engine.get_main_loop().get_meta('current_save_slot') + else: + return '' + +## +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +## EXPORT / IMPORT +## +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +# this returns a dictionary with the DEFINITIONS, the GAME STATE and the DIALOG STATE +static func export(dialog_node = null) -> Dictionary: + # gather the data + var current_dialog_info = {} + if dialog_node == null and has_current_dialog_node(): + dialog_node = Engine.get_main_loop().get_meta('latest_dialogic_node') + if dialog_node: + current_dialog_info = dialog_node.get_current_state_info() + + # return it + return { + 'definitions': _get_definitions(), + 'state': Engine.get_main_loop().get_meta('game_state'), + 'dialog_state': current_dialog_info + } + + +# this loads a dictionary with GAME STATE, DEFINITIONS and DIALOG_STATE +static func import(data: Dictionary) -> void: + ## Tell the future we want to use the imported data + Engine.get_main_loop().set_meta('current_save_lot', '/') + + # load the data + Engine.get_main_loop().set_meta('definitions', data['definitions']) + Engine.get_main_loop().set_meta('game_state', data['state']) + Engine.get_main_loop().set_meta('last_dialog_state', data.get('dialog_state', null)) + set_current_timeline(get_saved_state_general_key('timeline')) + + +## +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +## DEFINITIONS +## +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +# clears all variables +static func clear_all_variables(): + for d in _get_definitions()['variables']: + d['value'] = "" + +# sets the value of the value definition with the given name +static func set_variable(name: String, value): + var exists = false + + if '/' in name: + var variable_id = _get_variable_from_file_name(name) + if variable_id != '': + for d in _get_definitions()['variables']: + if d['id'] == variable_id: + d['value'] = str(value) + exists = true + else: + for d in _get_definitions()['variables']: + if d['name'] == name: + d['value'] = str(value) + exists = true + if exists == false: + # TODO it would be great to automatically generate that missing variable here so they don't + # have to create it from the editor. + print("[Dialogic] Warning! the variable [" + name + "] doesn't exists. Create it from the Dialogic editor.") + return value + +# returns the value of the value definition with the given name +static func get_variable(name: String, default = null): + if '/' in name: + var variable_id = _get_variable_from_file_name(name) + for d in _get_definitions()['variables']: + if d['id'] == variable_id: + return d['value'] + print("[Dialogic] Warning! the variable [" + name + "] doesn't exists.") + return default + else: + for d in _get_definitions()['variables']: + if d['name'] == name: + return d['value'] + print("[Dialogic] Warning! the variable [" + name + "] doesn't exists.") + return default + + +## +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +## GAME STATE +## +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +# the game state is a global dictionary that can be used to store custom data +# these functions should be renamed in 2.0! These names are outdated. + +# this sets a value in the GAME STATE dictionary +static func get_saved_state_general_key(key: String, default = '') -> String: + if not Engine.get_main_loop().has_meta('game_state'): + return default + if key in Engine.get_main_loop().get_meta('game_state').keys(): + return Engine.get_main_loop().get_meta('game_state')[key] + else: + return default + + +# this gets a value from the GAME STATE dictionary +static func set_saved_state_general_key(key: String, value) -> void: + if not Engine.get_main_loop().has_meta('game_state'): + Engine.get_main_loop().set_meta('game_state', {}) + Engine.get_main_loop().get_meta('game_state')[key] = str(value) + save('', true) + + +################################################################################ +## HISTORY +################################################################################ + +# Used to toggle the history timeline display. Only useful if you do not wish to +# use the provided buttons +static func toggle_history(): + if has_current_dialog_node(): + var dialog_node = Engine.get_main_loop().get_meta('latest_dialogic_node') + dialog_node.HistoryTimeline._on_toggle_history() + else: + print('[D] Tried to toggle history, but no dialog node exists.') + +################################################################################ +## AUTO-ADVANCE +################################################################################ +static func auto_advance_on(toggle: bool, delay : float=2): + if has_current_dialog_node(): + var dialog_node = Engine.get_main_loop().get_meta('latest_dialogic_node') + dialog_node.autoPlayMode = toggle + dialog_node.autoWaitTime = float(delay) + else: + print('[D] Tried to toggle auto advance mode, but no dialog node exists.') + +################################################################################ +## COULD BE USED +################################################################################ +# these are old things, that have little use. + +static func get_autosave() -> bool: + if Engine.get_main_loop().has_meta('autoload'): + return Engine.get_main_loop().get_meta('autoload') + return true + + +static func set_autosave(autoload): + Engine.get_main_loop().set_meta('autoload', autoload) + + +static func set_current_timeline(timeline): + Engine.get_main_loop().set_meta('current_timeline', timeline) + return timeline + + +static func get_current_timeline(): + var timeline + timeline = Engine.get_main_loop().get_meta('current_timeline') + if timeline == null: + timeline = '' + return timeline + + +# Returns a string with the action button set on the project settings +static func get_action_button(): + return DialogicResources.get_settings_value('input', 'default_action_key', 'dialogic_default_action') + +################################################################################ +## NOT TO BE USED FROM OUTSIDE +################################################################################ +## this loads the saves definitions and returns the saves state_info ditionary +static func _load_from_slot(slot_name: String = '') -> Dictionary: + Engine.get_main_loop().set_meta('definitions', DialogicResources.get_saved_definitions(slot_name)) + + var state_info = DialogicResources.get_saved_state_info(slot_name) + Engine.get_main_loop().set_meta('last_dialog_state', state_info.get('dialog_state', null)) + Engine.get_main_loop().set_meta('game_state', state_info.get('game_state', null)) + + return state_info.get('dialog_state', {}) + + +## this saves the current definitions and the given state info into the save folder @save_name +static func _save_state_and_definitions(save_name: String, state_info: Dictionary) -> void: + DialogicResources.save_definitions(save_name, _get_definitions()) + DialogicResources.save_state_info(save_name, state_info) + + + +static func _get_definitions() -> Dictionary: + var definitions + if Engine.get_main_loop().has_meta('definitions'): + definitions = Engine.get_main_loop().get_meta('definitions') + else: + definitions = DialogicResources.get_default_definitions() + Engine.get_main_loop().set_meta('definitions', definitions) + return definitions + + +# used by the DialogNode +static func set_glossary_from_id(id: String, title: String, text: String, extra:String) -> void: + var target_def: Dictionary; + for d in _get_definitions()['glossary']: + if d['id'] == id: + target_def = d; + if target_def != null: + if title and title != "[No Change]": + target_def['title'] = title + if text and text != "[No Change]": + target_def['text'] = text + if extra and extra != "[No Change]": + target_def['extra'] = extra + +# used by the DialogNode +static func set_variable_from_id(id: String, value: String, operation: String) -> void: + var target_def: Dictionary; + for d in _get_definitions()['variables']: + if d['id'] == id: + target_def = d; + if target_def != null: + var converted_set_value = value + var converted_target_value = target_def['value'] + var is_number = converted_set_value.is_valid_float() and converted_target_value.is_valid_float() + if is_number: + converted_set_value = float(value) + converted_target_value = float(target_def['value']) + var result = target_def['value'] + # Do nothing for -, * and / operations on string + match operation: + '=': + result = converted_set_value + '+': + result = converted_target_value + converted_set_value + '-': + if is_number: + result = converted_target_value - converted_set_value + '*': + if is_number: + result = converted_target_value * converted_set_value + '/': + if is_number: + result = converted_target_value / converted_set_value + target_def['value'] = str(result) + +# tries to find the path of a given timeline +static func _get_timeline_file_from_name(timeline_name_path: String) -> String: + var timelines = DialogicUtil.get_full_resource_folder_structure()['folders']['Timelines'] + + # Checks for slash in the name, and uses the folder search if there is + if '/' in timeline_name_path: + #Add leading slash if its a path and it is missing, for paths that have subfolders but no leading slash + if(timeline_name_path.left(1) != '/'): + timeline_name_path = "/" + timeline_name_path + var parts = timeline_name_path.split('/', false) + + # First check if it's a timeline in the root folder + if parts.size() == 1: + for t in DialogicUtil.get_timeline_list(): + for f in timelines['files']: + if t['file'] == f && t['name'] == parts[0]: + return t['file'] + if parts.size() > 1: + var current_data + var current_depth = 0 + for p in parts: + if current_depth == 0: + # Starting the crawl + if (timelines['folders'].has(p) ): + current_data = timelines['folders'][p] + else: + return '' + elif current_depth == parts.size() - 1: + # The final destination + for t in DialogicUtil.get_timeline_list(): + for f in current_data['files']: + if t['file'] == f && t['name'] == p: + return t['file'] + + else: + # Still going deeper + if (current_data['folders'].size() > 0): + if p in current_data['folders']: + current_data = current_data['folders'][p] + else: + return '' + else: + return '' + current_depth += 1 + return '' + else: + # Searching for any timeline that could match that name + for t in DialogicUtil.get_timeline_list(): + if t['name'] == timeline_name_path: + return t['file'] + return '' + +static func _get_variable_from_file_name(variable_name_path: String) -> String: + #First add the leading slash if it is missing so algorithm works properly + if(variable_name_path.left(1) != '/'): + variable_name_path = "/" + variable_name_path + + var definitions = DialogicUtil.get_full_resource_folder_structure()['folders']['Definitions'] + var parts = variable_name_path.split('/', false) + + # Check the root if it's a variable in the root folder + if parts.size() == 1: + for t in _get_definitions()['variables']: + for f in definitions['files']: + if t['id'] == f && t['name'] == parts[0]: + return t['id'] + if parts.size() > 1: + var current_data + var current_depth = 0 + + for p in parts: + if current_depth == 0: + + # Starting the crawl + if (definitions['folders'].has(p)): + current_data = definitions['folders'][p] + else: + return '' + elif current_depth == parts.size() - 1: + # The final destination + for t in _get_definitions()['variables']: + for f in current_data['files']: + if t['id'] == f && t['name'] == p: + return t['id'] + + else: + # Still going deeper + if (current_data['folders'].size() > 0): + if p in current_data['folders']: + current_data = current_data['folders'][p] + else: + return '' + else: + return '' + current_depth += 1 + return '' diff --git a/project/addons/dialogic/Other/DialogicDefinitionsUtil.gd b/project/addons/dialogic/Other/DialogicDefinitionsUtil.gd new file mode 100644 index 0000000..05a67dc --- /dev/null +++ b/project/addons/dialogic/Other/DialogicDefinitionsUtil.gd @@ -0,0 +1,72 @@ +extends Node +class_name DialogicDefinitionsUtil + +## This class handles definitions + +static func get_definition_by_key(data: Dictionary, key: String, value: String): + var variables : Array = data['variables'] + var glossary : Array = data['glossary'] + for v in variables: + if v[key] == value: + return v + for g in glossary: + if g[key] == value: + return g + return null + + +static func get_definition_by_id(data: Dictionary, id: String): + return get_definition_by_key(data, 'id', id) + + +static func get_definition_by_name(data: Dictionary, id: String): + return get_definition_by_key(data, 'name', id) + + +static func set_definition(section: String, data: Dictionary, elem: Dictionary): + delete_definition(data, elem['id']) + var array: Array = data[section] + var found = false; + for e in array: + if e['id'] == elem['id']: + found = true + array.erase(e) + array.append(elem) + break + if not found: + array.append(elem) + + +static func set_definition_variable(data: Dictionary, id: String, name: String, value): + set_definition('variables', data, { + 'id': id, + 'name': name, + 'value': value, + 'type': 0 + }) + + +static func set_definition_glossary(data: Dictionary, id: String, name: String, title: String, text: String, extra: String): + set_definition('glossary', data, { + 'id': id, + 'name': name, + 'title': title, + 'text': text, + 'extra': extra, + 'type': 1 + }) + + +static func delete_definition(data: Dictionary, id: String): + var variables : Array = data['variables'] + var glossary : Array = data['glossary'] + var item = get_definition_by_id(data, id); + if item != null: + if (item['type'] == 0): + variables.erase(item) + else: + glossary.erase(item) + + +static func definitions_json_to_array(data: Dictionary) -> Array: + return data['variables'] + data['glossary'] diff --git a/project/addons/dialogic/Other/DialogicResources.gd b/project/addons/dialogic/Other/DialogicResources.gd new file mode 100644 index 0000000..564f77c --- /dev/null +++ b/project/addons/dialogic/Other/DialogicResources.gd @@ -0,0 +1,461 @@ +tool +class_name DialogicResources + +## This class is used by the DialogicEditor to access the resources files +## For example by the Editors (Timeline, Character, Theme), the MasterTree and the EventParts + +## It is also used by the DialogicUtil class + +const RESOURCES_DIR: String = "res://dialogic" # Readonly, used for static data +const WORKING_DIR: String = "user://dialogic" # Readwrite, used for saves + + +## ***************************************************************************** +## BASIC JSON FUNCTION +## ***************************************************************************** +static func load_json(path: String, default: Dictionary={}) -> Dictionary: + # An easy function to load json files and handle common errors. + var file := File.new() + if file.open(path, File.READ) != OK: + file.close() + return default + var data_text: String = file.get_as_text() + file.close() + if data_text.empty(): + return default + var data_parse: JSONParseResult = JSON.parse(data_text) + if data_parse.error != OK: + return default + + var final_data = data_parse.result + if typeof(final_data) == TYPE_DICTIONARY: + return final_data + + # If everything else fails + return default + + +static func set_json(path: String, data: Dictionary): + var file = File.new() + var err = file.open(path, File.WRITE) + if err == OK: + file.store_line(JSON.print(data, '\t', true)) + file.close() + return err + + +## ***************************************************************************** +## INITIALIZATION +## ***************************************************************************** +static func init_dialogic_files() -> void: + # This functions makes sure that the needed files and folders + # exists when the plugin is loaded. If they don't, we create + # them. + # WARNING: only call while in the editor + var directory = Directory.new() + var paths = get_working_directories() + var files = get_config_files_paths() + # Create directories + for dir in paths: + if not directory.dir_exists(paths[dir]): + directory.make_dir_recursive(paths[dir]) + if dir == 'THEME_DIR': + directory.copy('res://addons/dialogic/Editor/ThemeEditor/default-theme.cfg', str(paths[dir], '/default-theme.cfg')) + # Create empty files + for f in files: + if not directory.file_exists(files[f]): + create_empty_file(files[f]) + + +static func get_working_directories() -> Dictionary: + return { + 'RESOURCES_DIR': RESOURCES_DIR, + 'WORKING_DIR': WORKING_DIR, + 'TIMELINE_DIR': RESOURCES_DIR + "/timelines", + 'THEME_DIR': RESOURCES_DIR + "/themes", + 'CHAR_DIR': RESOURCES_DIR + "/characters", + 'CUSTOM_EVENTS_DIR': RESOURCES_DIR + "/custom-events", + 'SOUNDS':RESOURCES_DIR + "/sounds" + } + + +static func get_config_files_paths() -> Dictionary: + return { + 'SETTINGS_FILE': RESOURCES_DIR + "/settings.cfg", + 'DEFAULT_DEFINITIONS_FILE': RESOURCES_DIR + "/definitions.json", + 'FOLDER_STRUCTURE_FILE': RESOURCES_DIR + "/folder_structure.json", + 'DEFINITIONS_DEFAULT_SAVE': WORKING_DIR + "/definitions_default_save.json", + 'STATE_DEFAULT_SAVE': WORKING_DIR + "/state_default_save.json" + } + + +## ***************************************************************************** +## BASIC FILE FUNCTION +## ***************************************************************************** +static func get_path(name: String, extra: String ='') -> String: + var paths: Dictionary = get_working_directories() + if extra != '': + return paths[name] + '/' + extra + else: + return paths[name] + + +static func get_filename_from_path(path: String, extension = false) -> String: + var file_name: String = path.split('/')[-1] + if extension == false: + file_name = file_name.split('.')[0] + return file_name + + +static func listdir(path: String) -> Array: + # https://docs.godotengine.org/en/stable/classes/class_directory.html#description + var files: Array = [] + var dir := Directory.new() + var err = dir.open(path) + if err == OK: + dir.list_dir_begin() + var file_name = dir.get_next() + while file_name != "": + if not dir.current_is_dir() and not file_name.begins_with("."): + files.append(file_name) + file_name = dir.get_next() + dir.list_dir_end() + else: + print("[Dialogic] Error while accessing path " + path + " - Error: " + str(err)) + return files + + +static func create_empty_file(path): + var file = File.new() + file.open(path, File.WRITE) + file.store_string('') + file.close() + + +static func remove_file(path: String): + var dir = Directory.new() + var _err = dir.remove(path) + + if _err != OK: + print("[D] There was an error when deleting file at {filepath}. Error: {error}".format( + {"filepath":path,"error":_err} + )) + + +static func copy_file(path_from, path_to): + if (path_from == ''): + push_error("[Dialogic] Could not copy empty filename") + return ERR_FILE_BAD_PATH + + if (path_to == ''): + push_error("[Dialogic] Could not copy to empty filename") + return ERR_FILE_BAD_PATH + + var dir = Directory.new() + if (not dir.file_exists(path_from)): + push_error("[Dialogic] Could not copy file %s, File does not exists" % [ path_from ]) + return ERR_FILE_NOT_FOUND + + if (dir.file_exists(path_to)): + push_error("[Dialogic] Could not copy file to %s, file already exists" % [ path_to ]) + return ERR_ALREADY_EXISTS + + var error = dir.copy(path_from, path_to) + if (error): + push_error("[Dialogic] Error while copying %s to %s" % [ path_from, path_to ]) + push_error(error) + return error + + return OK + pass + + +## ***************************************************************************** +## CONFIG +## ***************************************************************************** +static func get_config(id: String) -> ConfigFile: + var paths := get_config_files_paths() + var config := ConfigFile.new() + if id in paths.keys(): + var err = config.load(paths[id]) + if err != OK: + print("[Dialogic] Error while opening config file " + paths[id] + ". Error: " + str(err)) + return config + + +## ***************************************************************************** +## TIMELINES +## ***************************************************************************** +# Can only be edited in the editor + +static func get_timeline_json(path: String): + return load_json(get_path('TIMELINE_DIR', path)) + + +static func set_timeline(timeline: Dictionary): + # WARNING: For use in the editor only + set_json(get_path('TIMELINE_DIR', timeline['metadata']['file']), timeline) + + +static func delete_timeline(filename: String): + # WARNING: For use in the editor only + remove_file(get_path('TIMELINE_DIR', filename)) + + +## ***************************************************************************** +## CHARACTERS +## ***************************************************************************** +# Can only be edited in the editor + +static func get_character_json(path: String): + return load_json(get_path('CHAR_DIR', path)) + + +static func set_character(character: Dictionary): + # WARNING: For use in the editor only + set_json(get_path('CHAR_DIR', character['id']), character) + + +static func delete_character(filename: String): + # WARNING: For use in the editor only + remove_file(get_path('CHAR_DIR', filename)) + + +## ***************************************************************************** +## THEMES +## ***************************************************************************** +# Can only be edited in the editor + +static func get_theme_config(filename: String): + var config = ConfigFile.new() + var path + if filename.begins_with('res://'): + path = filename + else: + path = get_path('THEME_DIR', filename) + var err = config.load(path) + if err == OK: + return config + + +static func set_theme_value(filename:String, section:String, key:String, value): + # WARNING: For use in the editor only + var config = get_theme_config(filename) + config.set_value(section, key, value) + config.save(get_path('THEME_DIR', filename)) + + +static func add_theme(filename: String): + create_empty_file(get_path('THEME_DIR', filename)) + + +static func delete_theme(filename: String): + remove_file(get_path('THEME_DIR', filename)) + + +static func duplicate_theme(from_filename: String, to_filename: String): + copy_file(get_path('THEME_DIR', from_filename), get_path('THEME_DIR', to_filename)) + +## ***************************************************************************** +## SETTINGS +## ***************************************************************************** +# Can only be edited in the editor + + +static func get_settings_config() -> ConfigFile: + return get_config("SETTINGS_FILE") + + +static func set_settings_value(section: String, key: String, value): + var config = get_settings_config() + config.set_value(section, key, value) + config.save(get_config_files_paths()['SETTINGS_FILE']) + +static func get_settings_value(section:String, key: String, default): + var config = get_settings_config() + return config.get_value(section, key, default) + + +## ***************************************************************************** +## DEFAULT DEFINITIONS +## ***************************************************************************** +# Can only be edited in the editor + + +static func get_default_definitions() -> Dictionary: + return load_json(get_config_files_paths()['DEFAULT_DEFINITIONS_FILE'], {'variables': [], 'glossary': []}) + + +static func save_default_definitions(data: Dictionary): + set_json(get_config_files_paths()['DEFAULT_DEFINITIONS_FILE'], data) + + +static func get_default_definition_item(id: String): + var data = get_default_definitions() + return DialogicDefinitionsUtil.get_definition_by_id(data, id) + + +static func set_default_definition_variable(id: String, name: String, value): + # WARNING: For use in the editor only + var data = get_default_definitions() + DialogicDefinitionsUtil.set_definition_variable(data, id, name, value) + save_default_definitions(data) + + +static func set_default_definition_glossary(id: String, name: String, extra_title: String, extra_text: String, extra_extra: String): + # WARNING: For use in the editor only + var data = get_default_definitions() + DialogicDefinitionsUtil.set_definition_glossary(data, id, name, extra_title, extra_text, extra_extra) + save_default_definitions(data) + + +static func delete_default_definition(id: String): + # WARNING: For use in the editor only + var data = get_default_definitions() + DialogicDefinitionsUtil.delete_definition(data, id) + save_default_definitions(data) + + + +## ***************************************************************************** +## SAVES DURING GAME +## ***************************************************************************** +# Folders in the user://dialogic directory function as save_slots. + +# retruns a list of all save folders. +# -> this returns a list of the save_slot-names +static func get_saves_folders() -> Array: + var save_folders = [] + var directory := Directory.new() + if directory.open(WORKING_DIR) != OK: + print("[D] Error: Failed to access working directory.") + return [] + + directory.list_dir_begin() + var file_name = directory.get_next() + while file_name != "": + if directory.current_is_dir() and not file_name.begins_with("."): + save_folders.append(file_name) + file_name = directory.get_next() + + return save_folders + +# this adds a new save folder with the given name +static func add_save_folder(save_name: String) -> void: + var directory := Directory.new() + if directory.open(WORKING_DIR) != OK: + print("[D] Error: Failed to access working directory.") + return + directory.make_dir(save_name) + + var file := File.new() + if file.open(WORKING_DIR+"/"+save_name+"/definitions.json", File.WRITE) == OK: + file.store_string('') + file.close() + if file.open(WORKING_DIR+"/"+save_name+"/state.json", File.WRITE) == OK: + file.store_string('') + file.close() + +# this removes the given folder +static func remove_save_folder(save_name: String) -> void: + var directory := Directory.new() + if directory.open(WORKING_DIR+"/"+save_name) != OK: + print("[D] Error: Failed to access save folder '"+save_name+"'.") + return + + directory.list_dir_begin() + var file_name = directory.get_next() + while file_name != "": + directory.remove(file_name) + file_name = directory.get_next() + directory.remove(WORKING_DIR+"/"+save_name) + +# reset the definitions and state of the given save folder (or default) +static func reset_save(save_name: String = '') -> void: + save_state_info(save_name, {}) + save_definitions(save_name, get_default_definitions()) + +# saves the state_info into the state.json file in the save folder "save_name" +static func save_state_info(save_name: String, state_info: Dictionary) -> void: + if save_name == '': + set_json(get_config_files_paths()['STATE_DEFAULT_SAVE'], state_info) + return + + if not save_name in get_saves_folders(): + add_save_folder(save_name) + + set_json(WORKING_DIR+"/"+save_name+"/state.json", state_info) + +# return the state_info from the state.json file in the save folder "save_name" +static func get_saved_state_info(save_name: String) -> Dictionary: + if save_name == '': + return load_json(get_config_files_paths()['STATE_DEFAULT_SAVE'], {}) + + if not save_name in get_saves_folders(): + return {} + + return load_json(WORKING_DIR+"/"+save_name+"/state.json", {}) + +# saves the given definitions into the definitions.json file in the save folder "save name" +static func save_definitions(save_name: String, definitions_info: Dictionary) -> void: + if save_name == "": + set_json(get_config_files_paths()['DEFINITIONS_DEFAULT_SAVE'], definitions_info) + return + + if not save_name in get_saves_folders(): + add_save_folder(save_name) + + set_json(WORKING_DIR+"/"+save_name+"/definitions.json", definitions_info) + +# return the definition info from the definiiotn.json in the save folder "save name" +static func get_saved_definitions(save_name: String = '') -> Dictionary: + if save_name == '': + return load_json(get_config_files_paths()['DEFINITIONS_DEFAULT_SAVE'], get_default_definitions()) + + if not save_name in get_saves_folders(): + print("[D] Wasn't able to find save '"+save_name+"'. Loaded the default definitions.") + return get_default_definitions() + + return load_json(WORKING_DIR+"/"+save_name+"/definitions.json", {}) + + + +## ***************************************************************************** +## FOLDER STRUCTURE +## ***************************************************************************** +# The DialogicEditor uses a fake folder structure +# Can only be edited in the editor + +static func get_resource_folder_structure() -> Dictionary: + return load_json(get_config_files_paths()['FOLDER_STRUCTURE_FILE'], + {"folders": + {"Timelines": + { + "folders":{}, + "files":[], + 'metadata':{'color':null, 'folded':false} + }, + "Characters": + { + "folders":{}, + "files":[], + 'metadata':{'color':null, 'folded':false} + }, + "Definitions": + { + "folders":{}, + "files":[], + 'metadata':{'color':null, 'folded':false} + }, + "Themes": + { + "folders":{}, + "files":[], + 'metadata':{'color':null, 'folded':false} + }, + }, + "files":[] + }) + +static func save_resource_folder_structure(data): + set_json(get_config_files_paths()['FOLDER_STRUCTURE_FILE'], data) diff --git a/project/addons/dialogic/Other/DialogicSharp.cs b/project/addons/dialogic/Other/DialogicSharp.cs new file mode 100644 index 0000000..bddf8ad --- /dev/null +++ b/project/addons/dialogic/Other/DialogicSharp.cs @@ -0,0 +1,127 @@ +using Godot; +using GC = Godot.Collections; +using System; + +public static class DialogicSharp +{ + private static Script _dialogic = GD.Load