VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /var/www/html/keeview_app/html/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /var/www/html/keeview_app/html/jsencoding.js
'use strict'

class Date2 extends Date {
    constructor (...args) {
        super(...args);
        var localData = {
            mode: "live",
            hour: Date.prototype.getHours.call(this),
            minute: Date.prototype.getMinutes.call(this),
            saved: Date.prototype.getDate.call(this),
            date: Date.prototype.getDate.call(this),
            month: Date.prototype.getMonth.call(this) + 1,
            year: Date.prototype.getFullYear.call(this)
        };
        Object.defineProperty(this, "mode", {
            get: function (localData) {
                return function () {
                    return localData.mode;
                }
            } (localData),
            set: function (localData) {
                return function (value) {
                    if ((value != "live") && (value != "date") && (value != "datetime")) return localData.mode;
                    localData.mode = value;
                    return value;
                }
            } (localData)
        });
        this.getDate = function (me, localData) {
            return function () {
                if (localData.mode == "live") {
                    return Date.prototype.getDate.call(me);
                }
                return localData.date;
            }
        } (this, localData);
        this.getMonth = function (me, localData) {
            return function () {
                if (localData.mode == "live") {
                    return Date.prototype.getMonth.call(me);
                }
                return localData.month - 1;
            }
        } (this, localData);
        this.getFullYear = function (me, localData) {
            return function () {
                if (localData.mode == "live") {
                    return Date.prototype.getFullYear.call(me);
                }
                return localData.year;
            }
        } (this, localData);
        this.getHours = function (me, localData) {
            return function () {
                switch (localData.mode) {
                    case "live":
                        return Date.prototype.getHours.call(me);
                    case "date":
                        return 0;
                    case "datetime":
                        return localData.hour;
                }
                return 0;
            }
        } (this, localData);
        this.getMinutes = function (me, localData) {
            return function () {
                switch (localData.mode) {
                    case "live":
                        return Date.prototype.getMinutes.call(me);
                    case "date":
                        return 0;
                    case "datetime":
                        return localData.minute;
                }
                return 0;
            }
        } (this, localData);
        this.getSeconds = function (me, localData) {
            return function () {
                if (localData.mode == "live") return Date.prototype.getSeconds.call(me);
                return 0;
            }
        } (this, localData);
        this.getMilliseconds = function (me, localData) {
            return function () {
                if (localData.mode == "live") return Date.prototype.getMilliseconds.call(me);
                return 0;
            }
        } (this, localData);
        this.setDate = function (me, localData) {
            return function (value) {
                localData.date = value;
                return Date.prototype.setDate.call(me, value);
            }
        } (this, localData);
        this.setMonth = function (me, localData) {
            return function (value) {
                localData.month = value + 1;
                return Date.prototype.setMonth.call(me, value);
            }
        } (this, localData);
        this.setFullYear = function (me, localData) {
            return function (value) {
                localData.year = value;
                return Date.prototype.setFullYear.call(me, value);
            }
        } (this, localData);
        this.setHours = function (me, localData) {
            return function (value) {
                if (localData.mode == "date") value = 0;
                localData.hour = value;
                return Date.prototype.setHours.call(me, value);
            }
        } (this, localData);
        this.setMinutes = function (me, localData) {
            return function (value) {
                if (localData.mode == "date") value = 0;
                localData.minute = value;
                return Date.prototype.setMinutes.call(me, value);
            }
        } (this, localData);
        this.setSeconds = function (me, localData) {
            return function () {
                if (localData.mode != "live") value = 0;
                return Date.prototype.setSeconds.call(me, value);
            }
        } (this, localData);
        this.setMilliseconds = function (me, localData) {
            return function () {
                if (localData.mode != "live") value = 0;
                return Date.prototype.setMilliseconds.call(me, value);
            }
        } (this, localData);
    }
}

class Geometry {
    constructor (type) {
        if (type === undefined) type = "";
        if (!EncodingClass.type.isString(type)) {
            if (type.toString !== undefined) {
                type = type.toString();
            }
            else {
                type = "";
            }
        }
        Object.defineProperty(this, "type", {
            get: function (content) {
                return function () {
                    return content.type;
                };
            } ({type: type})
        });
        this.getData = function (type) {
            return function () {
                return {type: type};
            }
        } (type);
    }

    static fromData(data) {
        var i, j, x, y;
        var r, s, content;
        if ((data === undefined) || (data === null)) return null;
        if (!EncodingClass.type.isObject(data)) return null;
        if (data.data === undefined) return null;
        switch (data.type) {
            case "point":
                if (!EncodingClass.type.isObject(data.data)) return null;
                if (data.data.X === undefined) return null;
                if (data.data.Y === undefined) return null;
                if (!EncodingClass.type.isNumber(data.data.X)) return null;
                if (!EncodingClass.type.isNumber(data.data.Y)) return null;
                content = {
                    X: data.data.X,
                    Y: data.data.Y
                };
                break;
            case "polygon":
                if (!EncodingClass.type.isArray(data.data)) return null;
                x = [];
                for (i = 0; i < data.data.length; i++) {
                    s = data.data[i];
                    if (!EncodingClass.type.isArray(s)) return null;
                    y = [];
                    for (j = 0; j < s.length; j++) {
                        r = s[j];
                        if (!EncodingClass.type.isObject(r)) continue;
                        if (r.X === undefined) continue;
                        if (r.Y === undefined) continue;
                        if (!EncodingClass.type.isNumber(r.X)) continue;
                        if (!EncodingClass.type.isNumber(r.Y)) continue;
                        y.push({
                            X: r.X,
                            Y: r.Y
                        });
                    }
                    if (y.length == 0) continue;
                    x.push(y);
                }
                if (x.length == 0) return null;
                content = x;
                break;
            case "linestring":
                if (!EncodingClass.type.isArray(data.data)) return null;
                x = [];
                for (i = 0; i < data.data.length; i++) {
                    r = data.data[i];
                    if (!EncodingClass.type.isObject(r)) continue;
                    if (r.X === undefined) continue;
                    if (r.Y === undefined) continue;
                    if (!EncodingClass.type.isNumber(r.X)) continue;
                    if (!EncodingClass.type.isNumber(r.Y)) continue;
                    x.push({
                        X: r.X,
                        Y: r.Y
                    });
                }
                if (x.length == 0) return null;
                content = x;
                break;
            case "multipoint":
            case "multilinestring":
            case "multipolygon":
            case "collection":
                if (!EncodingClass.type.isArray(data.data)) return null;
                x = [];
                for (i = 0; i < data.data.length; i++) {
                    r = Geometry.fromData(data.data[i]);
                    if (r === null) continue;
                    if (r === undefined) continue;
                    if (data.type != "collection") {
                        if (data.type != "multi" + r.type) continue;
                    }
                    x.push(r);
                }
                if (x.length == 0) return null;
                content = x;
                break;
            default:
                return null;
        }
        r = new Geometry(data.type);
        r.getFirstPoint = function (type, content) {
            return function () {
                switch (type) {
                    case "point":
                        return {
                            X: content.X,
                            Y: content.Y
                        }
                    case "polygon":
                        return {
                            X: content[0][0].X,
                            Y: content[0][0].Y
                        }
                    case "linestring":
                        return {
                            X: content[0].X,
                            Y: content[0].Y
                        }
                    case "multipoint":
                    case "multilinestring":
                    case "multipolygon":
                    case "collection":
                        return content[0].getFirstPoint();
                    default:
                        return null;
                }
            }
        } (data.type, content);
        r.getData = function (type, content) {
            return function () {
                var i, x = [];
                if (type == "point") {
                    return {
                        type: "point",
                        data: content
                    }
                }
                for (i = 0; i < content.length; i++) {
                    if (content[i] instanceof Geometry) {
                        x.push(content[i].getData());
                    }
                    else {
                        x.push(EncodingClass.string.duplicate(content[i]));
                    }
                }
                return {
                    type: type,
                    data: x
                }
            }
        } (data.type, content);
        r.getEncodedString = function (datafunc, encodefunc) {
            return function () {
                return encodefunc(datafunc());
            }
        } (r.getData, EncodingClass.string.fromVariable);
        return r;
    }

    static fromEncodedString(str) {
        var x = EncodingClass.string.toVariable(str);
        if (!EncodingClass.type.isObject(x)) return null;
        return Geometry.fromData(x);
    }

    static Point(X, Y) {
        return Geometry.fromData({
            type: "point",
            data: {
                X: X,
                Y: Y
            }
        });
    }

    static MultiPoint(pointArray) {
        var i, n, x = [];
        if (!EncodingClass.type.isArray(pointArray)) return null;
        n = pointArray.length;
        if (n == 0) return null;
        for (i = 0; i < n; i++) {
            if (!(pointArray[i] instanceof Geometry)) continue;
            if (pointArray[i].type != "point") continue;
            x.push(pointArray[i].getData);
        }
        if (x.length == 0) return null;
        return Geometry.fromData({
            type: "multipoint",
            data: x
        });
    }
}
if (window.EncodingClass === undefined) {
    window.EncodingClass = function () {
        var funcModule = {};
        var typeModule = {};
        var numberModule = {};
        var colorModule = {};
        var stringModule = {};
        var base64Module = {};
        var utf8Module = {};
        var md5Module = {};
        var core = {};
        var ecode = {};
        var packModule = {};

        funcModule.tempFunc = null;
        funcModule.currentCode = "";
        funcModule.exec = function (st) {
            eval(st);
        }

        funcModule.encode = function (st) {
            eval("EncodingClass.func.tempFunc = " + st + ";");
            return EncodingClass.func.tempFunc;
        }

        funcModule.encodeBody = function (st) {
            return new Function (st);
        }

        funcModule.decode = function (fn) {
            return fn.toString();
        }

        funcModule.decodeBody = function (fn) {
            return fn.toString().match(/function[^{]+\{([\s\S]*)\}$/)[1];
        }

        var errhost = {};
        var syntaxhost = {
            queue: [],
            busy: false
        };
        var errorHandler = function (errhost, funcModule) {
            return function (event) {
                var md5code;
                if (funcModule.currentCode != "") {
                    md5code = funcModule.currentCode;
                    funcModule.currentCode = "";
                    errhost.result = {
                        result: false,
                        message: event.error.message,
                        stack: event.error.stack,
                        line: event.lineno - 1,
                        column: event.colno
                    };
                    setTimeout(function (funcModule, md5code, result) {
                        return function () {
                            funcModule.validateSyntax(md5code, result);
                        }
                    } (funcModule, md5code, errhost.result), 10);
                }
            }
        } (errhost, funcModule);
        var rawcheckSyntax = function (syntaxhost, errhost, funcModule, md5Module) {
            return function (content, callbackfunc) {
                var md5code = md5Module.encode(content);
                if (errhost[md5code] !== undefined) {
                    setTimeout (function (callbackfunc, result) {
                        return function () {
                            try {
                                callbackfunc(result);
                            }
                            catch (e) {
                                console.error(e);
                            }
                        }
                    } (callbackfunc, errhost[md5code].result), 10);
                    return;
                }
                syntaxhost.busy = true;
                errhost[md5code] = {
                    callbackfunc: callbackfunc
                };
                funcModule.currentCode = md5code;
                var st = "EncodingClass.func.fcheck = function () {";
                st += "\r\n" + content + "\r\n}\r\n";
                st += "EncodingClass.func.currentCode = \"\"; EncodingClass.func.validateSyntax(\"" + md5code + "\", {result: true});";
                var xurl = window.URL || window.webkitURL;
                var codeblob = new Blob([ st ]);
                var codeurl = xurl.createObjectURL(codeblob, { type: "text/javascript" });
                var head = document.getElementsByTagName("head")[0];
                var hlen = head.length;
                var fileref = document.createElement('script');
                fileref.setAttribute("type","text/javascript");
                fileref.setAttribute("src", codeurl);
                errhost[md5code].fileref = fileref;
                errhost[md5code].codeurl = codeurl;
                head.appendChild(fileref);
                fileref = null;
                codeurl = null;
                codeblob = null;
            }
        } (syntaxhost, errhost, funcModule, md5Module);

        funcModule.checkSyntax = function (syntaxhost, errhost, md5Module, rawcheckSyntax) {
            return function (content, callbackfunc) {
                var md5code = md5Module.encode(content);
                if (errhost[md5code] !== undefined) {
                    if (errhost[md5code].result !== undefined) {
                        setTimeout(function (result, callbackfunc) {
                            return function () {
                                try {
                                    callbackfunc(result);
                                }
                                catch (e) {
                                    console.error(e);
                                }
                            }
                        } (errhost[md5code].result, callbackfunc), 10);
                        return;
                    }
                }
                var sf;
                try {
                    sf = new Function(content);
                    if (errhost[md5code] === undefined) {
                        errhost[md5code] = {
                            result: {
                                result: true
                            }
                        };
                    }
                    setTimeout(function (result, callbackfunc) {
                        return function () {
                            try {
                                callbackfunc(result);
                            }
                            catch (e) {
                                console.error(e);
                            }
                        }
                    } ({result: true}, callbackfunc), 10);
                    return;
                }
                catch (e) {
                }
                if (!syntaxhost.busy) {
                    rawcheckSyntax(content, callbackfunc);
                }
                else {
                    syntaxhost.queue.push({
                        content: content,
                        callbackfunc: callbackfunc
                    });
                }
            }
        } (syntaxhost, errhost, md5Module, rawcheckSyntax);

        funcModule.validateSyntax = function (syntaxhost, errhost, funcModule, rawcheckSyntax) {
            return function (md5code, result) {
                var callbackfunc, r;
                var xurl = window.URL || window.webkitURL;
                funcModule.currentCode = "";
                errhost[md5code].result = result;
                callbackfunc = errhost[md5code].callbackfunc;
                errhost[md5code].fileref.remove();
                xurl.revokeObjectURL(errhost[md5code].codeurl);
                delete errhost[md5code].fileref;
                delete errhost[md5code].codeurl;
                if (EncodingClass.func.fcheck !== undefined) delete EncodingClass.func.fcheck;
                setTimeout(function (callbackfunc, result) {
                    return function () {
                        try {
                            callbackfunc(result);
                        }
                        catch (e) {
                            console.error(e);
                        }
                    }
                } (callbackfunc, result), 10);
                if (syntaxhost.queue.length == 0) {
                    syntaxhost.busy = false;
                }
                else {
                    r = syntaxhost.queue.shift();
                    setTimeout(function (rawcheckSyntax, r) {
                        return function () {
                            rawcheckSyntax(r.content, r.callbackfunc);
                        }
                    } (rawcheckSyntax, r), 10);
                }
            }
        } (syntaxhost, errhost, funcModule, rawcheckSyntax);
        window.addEventListener('error', errorHandler);

        typeModule.isNumber = function (obj) {
            if (typeof obj === "number") return true;
            return false;
        }

        typeModule.isString = function (obj) {
            if (typeof obj === "string") return true;
            if (obj instanceof String) return true;
            return false;
        }

        typeModule.isBoolean = function (obj) {
            if (typeof obj === "boolean") return true;
            return false;
        }

        typeModule.isObject = function (obj) {
            if (typeof obj === "object") return true;
            return false;
        }

        typeModule.isFunction = function (obj) {
            if (typeof obj === "function") return true;
            return false;
        }

        typeModule.isDate = function (obj) {
            if (!(obj instanceof Date)) return false;
            if (typeof obj.getDate !== 'function') return false;
            if (typeof obj.getDay !== 'function') return false;
            if (typeof obj.getFullYear !== 'function') return false;
            if (typeof obj.getHours !== 'function') return false;
            if (typeof obj.getMilliseconds !== 'function') return false;
            if (typeof obj.getMinutes !== 'function') return false;
            if (typeof obj.getMonth !== 'function') return false;
            if (typeof obj.getSeconds !== 'function') return false;
            if (typeof obj.getTime !== 'function') return false;
            return true;
        }

        typeModule.isArray = function (obj) {
            if (obj === undefined) return false;
            if (obj == null) return false;
            if (Array !== undefined) {
                if (Array.isArray !== undefined) return Array.isArray(obj);
                if (obj.constructor !== undefined) {
                    if (obj.constructor === Array) return true;
                }
                if (obj instanceof Array) return true;
            }
            if (Object !== undefined) {
                if (Object.prototype !== undefined) {
                    if (Object.prototype.toString !== undefined) {
                        if (Object.prototype.toString.call !== undefined) {
                            if (Object.prototype.toString.call(obj) == "[object Array]") return true;
                        }
                    }
                }
            }
            return false;
        }

        numberModule.copyArray = function (numberModule) {
            return function (dest, src, callbackfunc, pd, ps, length) {
                if (pd === undefined) pd = 0;
                if (ps === undefined) ps = 0;
                if (length === undefined) length = src.length - ps;
                if (length > src.length - ps) length = src.length - ps;
                if (length > dest.length - pd) length = dest.length - pd;
                if (length < 0) length = 0;
                Thread.exec(function () {
                    var x, ok = false;
                    if (length == 0) return true;
                    x = length;
                    if (x > 4096) x = 4096;
                    if (dest.set !== undefined) {
                        if (src.subarray !== undefined) {
                            dest.set(src.subarray(ps, ps + x), pd);
                            ok = true;
                        }
                        else if (src.slice !== undefined) {
                            dest.set(src.slice(ps, ps + x), pd);
                            ok = true;
                        }
                    }
                    if (!ok) {
                        for (i = 0; i < x; i++) {
                            dest[pd++] = src[ps++];
                        }
                    }
                    else {
                        pd += x;
                        ps += x;
                    }
                    length -= x;
                    return false;
                }, callbackfunc);
            }
        } (numberModule);

        numberModule.promiseCopyArray = function (numberModule) {
            return function (dest, src, pd, ps, length) {
                return new Promise(function(resolve, reject) {
                    numberModule.copyArray(dest, src, function () {
                        resolve();
                    }, pd, ps, length);
                });
            }
        } (numberModule);

        numberModule.duplicateTypedArray = function (numberModule) {
            return function (arr, callbackfunc, start, length) {
                var maxlength, target;
                if (start === undefined) start = 0;
                maxlength = arr.length - start;
                if (length === undefined) length = maxlength;
                if (length > maxlength) length = maxlength;
                if (arr instanceof Int8Array) {
                    target = new Int8Array(length);
                }
                else if (arr instanceof Uint8Array) {
                    target = new Uint8Array(length);
                }
                else if (arr instanceof Int16Array) {
                    target = new Int16Array(length);
                }
                else if (arr instanceof Uint16Array) {
                    target = new Uint16Array(length);
                }
                else if (arr instanceof Int32Array) {
                    target = new Int32Array(length);
                }
                else if (arr instanceof Uint32Array) {
                    target = new Uint32Array(length);
                }
                else if (arr instanceof Float32Array) {
                    target = new Float32Array(length);
                }
                else if (arr instanceof Float64Array) {
                    target = new Float64Array(length);
                }
                else if (self.BigUint64Array && (arr instanceof BigUint64Array)) {
                    target = new BigUint64Array(length);
                }
                else if (self.BigInt64Array && (arr instanceof BigInt64Array)) {
                    target = new BigInt64Array(length);
                }
                else {
                    console.log("unknown type");
                    callbackfunc(undefined);
                }
                numberModule.copyArray(target, arr, function () {
                    Thread.setTimeout({
                        func: callbackfunc,
                        args: [target]
                    });
                }, 0, start, length);
                arr = null;
            }
        } (numberModule);

        numberModule.promiseDuplicateTypedArray = function (numberModule) {
            return function (arr, start, length) {
                return new Promise(function(resolve, reject) {
                    numberModule.duplicateTypedArray(arr, function (values) {
                        resolve(values);
                    }, start, length);
                });
            }
        } (numberModule);

        numberModule.fromString = function (numberModule) {
            return function (format, binaryString, start) {
                var n = binaryString.length, i;
                if (start === undefined) start = 0;
                switch (format) {
                    case "i8":
                    case "u8":
                        n = 1;
                        break;
                    case "i16":
                    case "u16":
                        n = 2;
                        break;
                    case "i32":
                    case "u32":
                    case "f32":
                        n = 4;
                        break;
                    case "f64":
                        n = 8;
                        break;
                    default:
                        return NaN;
                }
                return numberModule.fromArray(format, Array.from(binaryString.substr(start, n), c => (c.charCodeAt() & 0xFF)));
            }
        } (numberModule);

        numberModule.toString = function (numberModule) {
            return function (format, value) {
                return String.fromCharCode(...numberModule.toArray(format, value));
                /*
                var r = numberModule.toArray(format, value);
                var i, n = r.length, s = "";
                for (i = 0; i < n; i++) {
                    s += String.fromCharCode(r[i]);
                }
                return s;
                */
            }
        } (numberModule);

        numberModule.fromArray = function (numberModule) {
            return function (format, binaryArray, start) {
                var v, s, e, f, i;
                var buffer;
                if (start === undefined) start = 0;
                if (core.numbuf === undefined) {
                    buffer = new ArrayBuffer(8);
                    core.numbuf = new DataView(buffer);
                    core.numbufValue = new Uint8Array(buffer);
                }
                switch (format) {
                    case "u8":
                        if (start >= binaryArray.length) return 0;
                        core.numbufValue[0] = binaryArray[start];
                        return core.numbuf.getUint8(0, true);
                    case "i8":
                        if (start >= binaryArray.length) return 0;
                        core.numbufValue[0] = binaryArray[start];
                        return core.numbuf.getInt8(0, true);
                    case "u16":
                        if (start + 1 >= binaryArray.length) return 0;
                        for (i = 0; i < 2; i++) core.numbufValue[i] = binaryArray[start++];
                        return core.numbuf.getUint16(0, true);
                    case "i16":
                        if (start + 1 >= binaryArray.length) return 0;
                        for (i = 0; i < 2; i++) core.numbufValue[i] = binaryArray[start++];
                        return core.numbuf.getInt16(0, true);
                    case "u32":
                        if (start + 3 >= binaryArray.length) return 0;
                        for (i = 0; i < 4; i++) core.numbufValue[i] = binaryArray[start++];
                        return core.numbuf.getUint32(0, true);
                    case "i32":
                        if (start + 3 >= binaryArray.length) return 0;
                        for (i = 0; i < 4; i++) core.numbufValue[i] = binaryArray[start++];
                        return core.numbuf.getInt32(0, true);
                    case "f32":
                        if (start + 3 >= binaryArray.length) return 0;
                        for (i = 0; i < 4; i++) core.numbufValue[i] = binaryArray[start++];
                        return core.numbuf.getFloat32(0, true);
                    case "f64":
                        if (start + 7 >= binaryArray.length) return 0;
                        for (i = 0; i < 8; i++) core.numbufValue[i] = binaryArray[start++];
                        return core.numbuf.getFloat64(0, true);
                    /*
                    case "i8":
                        if (binaryArray.length < start + 1) return NaN;
                        v = binaryArray[start] & 255;
                        if (v >= 128) return v - 256;
                        return v;
                    case "u8":
                        if (binaryArray.length < start + 1) return NaN;
                        return binaryArray[start] & 255;
                    case "i16":
                        if (binaryArray.length < start + 2) return NaN;
                        v = numberModule.fromArray("u16", binaryArray, start);
                        if (v >= 32768) return v - 65536;
                        return v;
                    case "u16":
                        if (binaryArray.length < start + 2) return NaN;
                        v = binaryArray[start + 1] & 255;
                        v = v * 256 + (binaryArray[start] & 255);
                        return v;
                    case "i32":
                        if (binaryArray.length < start + 4) return NaN;
                        v = numberModule.fromArray("u32", binaryArray, start);
                        if (v >= 2147483648) return v - 4294967296;
                        return v;
                    case "u32":
                        if (binaryArray.length < start + 4) return NaN;
                        v = binaryArray[start + 3] & 255;
                        v = v * 256 + (binaryArray[start + 2] & 255);
                        v = v * 256 + (binaryArray[start + 1] & 255);
                        v = v * 256 + (binaryArray[start] & 255);
                        return v;
                    case "f32":
                        if (binaryArray.length < start + 4) return NaN;
                        v = binaryArray[start + 3] & 255;
                        if (v >= 128) {
                            s = -1;
                            e = v - 128;
                        }
                        else {
                            s = 1;
                            e = v;
                        }
                        v = binaryArray[start + 2] & 255;
                        e = e * 2 + ~~(v / 128) - 127;
                        f = 128 + (v & 127);
                        f = f * 256 + (binaryArray[start + 1] & 255);
                        f = f * 256 + (binaryArray[start] & 255);
                        if (e == -127) {
                            if (f == 8388608) {
                                if (s == 1) return 0;
                                return -0.0;
                            }
                        }
                        if (e == 128) {
                            if (f == 8388608) {
                                if (s == 1) return Infinity;
                                return -Infinity;
                            }
                            return NaN;
                        }
                        return f * s * Math.pow(2, e - 23);
                    case "f64":
                        if (binaryArray.length < start + 8) return NaN;
                        v = binaryArray[start + 7] & 255;
                        if (v >= 128) {
                            s = -1;
                            e = v - 128;
                        }
                        else {
                            s = 1;
                            e = v;
                        }
                        v = binaryArray[start + 6] & 255;
                        e = e * 16 + ~~(v / 16) - 1023;
                        f = 16 + (v & 15);
                        f = f * 256 + (binaryArray[start + 5] & 255);
                        f = f * 256 + (binaryArray[start + 4] & 255);
                        f = f * 256 + (binaryArray[start + 3] & 255);
                        f = f * 256 + (binaryArray[start + 2] & 255);
                        f = f * 256 + (binaryArray[start + 1] & 255);
                        f = f * 256 + (binaryArray[start] & 255);
                        if (e == -1023) {
                            if (f == 493455671296) {
                                if (s == 1) return 0;
                                return -0.0;
                            }
                        }
                        if (e == 1024) {
                            if (f == 493455671296) {
                                if (s == 1) return Infinity;
                                return -Infinity;
                            }
                            return NaN;
                        }
                        return f * s * Math.pow(2, e - 52);
                        */
                    default:
                        return NaN;
                }
            }
        } (numberModule);

        numberModule.toArray = function (numberModule) {
            return function (format, value) {
                var i, j, v, s, e, f, t = [], isfirst = true, f = [];
                var buffer;
                if (core.numbuf === undefined) {
                    buffer = new ArrayBuffer(8);
                    core.numbuf = new DataView(buffer);
                    core.numbufValue = new Uint8Array(buffer);
                }
                switch (format) {
                    case "u8":
                        core.numbuf.setUint8(0, value, true);
                        return core.numbufValue[0];
                    case "i8":
                        core.numbuf.setInt8(0, value, true);
                        return core.numbufValue[0];
                    case "u16":
                        core.numbuf.setUint16(0, value, true);
                        return [core.numbufValue[0], core.numbufValue[1]];
                    case "i16":
                        core.numbuf.setInt16(0, value, true);
                        return [core.numbufValue[0], core.numbufValue[1]];
                    case "u32":
                        core.numbuf.setUint32(0, value, true);
                        return [core.numbufValue[0], core.numbufValue[1], core.numbufValue[2], core.numbufValue[3]];
                    case "i32":
                        core.numbuf.setInt32(0, value, true);
                        return [core.numbufValue[0], core.numbufValue[1], core.numbufValue[2], core.numbufValue[3]];
                    case "f32":
                        core.numbuf.setFloat32(0, value, true);
                        return [core.numbufValue[0], core.numbufValue[1], core.numbufValue[2], core.numbufValue[3]];
                    case "f64":
                        core.numbuf.setFloat64(0, value, true);
                        return [core.numbufValue[0], core.numbufValue[1], core.numbufValue[2], core.numbufValue[3], core.numbufValue[4], core.numbufValue[5], core.numbufValue[6], core.numbufValue[7]];
                    /*
                    case "u8":
                    case "i8":
                        return [value & 255];
                    case "u16":
                    case "i16":
                        value = value & 65535;
                        return [value & 255, value >> 8];
                    case "u32":
                    case "i32":
                        value = value & 4294967295;
                        i = numberModule.toArray("u16", value & 65535);
                        j = numberModule.toArray("u16", value >> 16);
                        return [i[0], i[1], j[0], j[1]];
                    case "f32":
                        if (value == 0) {
                            return [0, 0, 0, 0];
                        }
                        else if (isNaN(value)) {
                            return [255, 255, 255, 127];
                        }
                        else if (!isFinite(value)) {
                            if (value == Infinity) {
                                return [0, 0, 240, 127];
                            }
                            return [0, 0, 240, 255];
                        }
                        else if (value > 0) {
                            s = 0;
                        }
                        else {
                            s = 1;
                            value = -value;
                        }
                        e = 0;
                        while (value >= 1) {
                            value /= 2.0;
                            e++;
                        }
                        for (i = 0; i < 23; ) {
                            value *= 2.0;
                            if (isfirst) e--;
                            if (value >= 1) {
                                value -= 1;
                                if (isfirst) {
                                    isfirst = false;
                                }
                                else {
                                    t.push(1);
                                    i++;
                                }
                            }
                            else {
                                if (!isfirst) {
                                    t.push(0);
                                    i++;
                                }
                            }
                        }
                        v = e + 127;
                        for (i = 0; i < 8; i++) {
                            t.unshift(v & 1);
                            v = ~~(v / 2);
                        }
                        t.unshift(s);
                        f = [0, 0, 0, 0];
                        for (i = 0; i < 4; i++) {
                            for (j = v = 0; j < 8; j++) {
                                v = v * 2 + t[i * 8 + j];
                            }
                            f[3-i] = v;
                        }
                        return f;
                    case "f64":
                        if (value == 0) {
                            return [0, 0, 0, 0, 0, 0, 0, 0];
                        }
                        else if (isNaN(value)) {
                            return [255, 255, 255, 255, 255, 255, 255, 127];
                        }
                        else if (!isFinite(value)) {
                            if (value == Infinity) {
                                return [0, 0, 0, 0, 0, 0, 240, 127];
                            }
                            return [0, 0, 0, 0, 0, 0, 240, 255];
                        }
                        else if (value > 0) {
                            s = 0;
                        }
                        else {
                            s = 1;
                            value = -value;
                        }
                        e = 0;
                        while (value >= 1) {
                            value /= 2.0;
                            e++;
                        }
                        for (i = 0; i < 52; ) {
                            value *= 2.0;
                            if (isfirst) e--;
                            if (value >= 1) {
                                value -= 1;
                                if (isfirst) {
                                    isfirst = false;
                                }
                                else {
                                    t.push(1);
                                    i++;
                                }
                            }
                            else {
                                if (!isfirst) {
                                    t.push(0);
                                    i++;
                                }
                            }
                        }
                        v = e + 1023;
                        for (i = 0; i < 11; i++) {
                            t.unshift(v & 1);
                            v = ~~(v / 2);
                        }
                        t.unshift(s);
                        f = [0, 0, 0, 0, 0, 0, 0, 0];
                        for (i = 0; i < 8; i++) {
                            for (j = v = 0; j < 8; j++) {
                                v = v * 2 + t[i * 8 + j];
                            }
                            f[7 - i] = v;
                        }
                        return f;
                    */
                    default:
                        return [];
                }
            }
        } (numberModule);

        numberModule.writeArray = function (numberModule) {
            return function (format, value, destination, start) {
                var i, j, v, s, e, f, t = [], isfirst = true, f = [];
                var buffer;
                if (core.numbuf === undefined) {
                    buffer = new ArrayBuffer(8);
                    core.numbuf = new DataView(buffer);
                    core.numbufValue = new Uint8Array(buffer);
                }
                if (start === undefined) start = 0;
                switch (format) {
                    case "u8":
                        core.numbuf.setUint8(0, value, true);
                        destination[start] = core.numbufValue[0];
                        break;
                    case "i8":
                        core.numbuf.setInt8(0, value, true);
                        destination[start] = core.numbufValue[0];
                        break;
                    case "u16":
                        core.numbuf.setUint16(0, value, true);
                        for (i = 0; i < 2; i++) destination[start++] = core.numbufValue[i];
                        break;
                    case "i16":
                        core.numbuf.setInt16(0, value, true);
                        for (i = 0; i < 2; i++) destination[start++] = core.numbufValue[i];
                        break;
                    case "u32":
                        core.numbuf.setUint32(0, value, true);
                        for (i = 0; i < 4; i++) destination[start++] = core.numbufValue[i];
                        break;
                    case "i32":
                        core.numbuf.setInt32(0, value, true);
                        for (i = 0; i < 4; i++) destination[start++] = core.numbufValue[i];
                        break;
                    case "f32":
                        core.numbuf.setFloat32(0, value, true);
                        for (i = 0; i < 4; i++) destination[start++] = core.numbufValue[i];
                        break;
                    case "f64":
                        core.numbuf.setFloat64(0, value, true);
                        for (i = 0; i < 8; i++) destination[start++] = core.numbufValue[i];
                        break;
                    case "s":
                        for (i = 0; i < value.length; i++) {
                            destination[start++] = value.charCodeAt(i) & 0xFF;
                        }
                        break;

                    default:
                }
            }
        } (numberModule);

        numberModule.toTable = function (stringModule, numberModule, utf8Module) {
            return function (data, start, length) {
                var i, fieldname = [], scode = [], r = [], n, m, t, h, v, soc, eoc;
                var readFunc, substr;
                if (start === undefined) start = 0;
                if (length === undefined) length = data.length - start;
                if (start + length > data.length) length = data.length - start;
                eoc = start + length;
                if (EncodingClass.type.isString(data)) {
                    readFunc = numberModule.fromString;
                    substr = stringModule.substr;
                }
                else {
                    readFunc = numberModule.fromArray;
                    substr = function (arr, start, length) {
                        var r = [], t;
                        var i, n, ilen;
                        if (start + length > arr.length) length = arr.length - start;
                        while (length > 0) {
                            if (length > 128) {
                                ilen = 128;
                            }
                            else {
                                ilen = length;
                            }
                            n = start + ilen;
                            t = arr.slice(start, n);
                            start = n;
                            length -= ilen;
                            r.push(String.fromCharCode(...t));
                        }
                        return stringModule.merge(r);
                    }
                }
                n = readFunc("i32", data, start);
                soc = start + 4;
                for (i = 0; i < n; i++) {
                    m = readFunc("i32", data, soc);
                    soc += 4;
                    fieldname.push(substr(data, soc, m));
                    soc += m;
                    scode.push(readFunc("u8", data, soc++));
                }
                while (soc < eoc) {
                    v = {};
                    for (i = 0; i < n; i++) {
                        switch (scode[i]) {
                            case 1:
                                t = readFunc("i32", data, soc);
                                soc += 4;
                                break;
                            case 2:
                                t = readFunc("i32", data, soc);
                                soc += 4;
                                t = new Date(t * 1000);
                                break;
                            case 6:
                                t = readFunc("f64", data, soc);
                                soc += 8;
                                t = new Date(t * 1000);
                                break;
                            case 3:
                                t = readFunc("i32", data, soc);
                                soc += 4;
                                t = new Date2(t * 1000);
                                t.mode = "date";
                                break;
                            case 7:
                                t = readFunc("f64", data, soc);
                                soc += 8;
                                t = new Date2(t * 1000);
                                t.mode = "date";
                                break;
                            case 4:
                                t = readFunc("f64", data, soc);
                                soc += 8;
                                break;
                            case 5:
                                h = readFunc("i32", data, soc);
                                soc += 4;
                                t = utf8Module.decode(substr(data, soc, h));
                                soc += h;
                                break;
                            default:
                                console.log("undefined type");
                                return r;
                        }
                        v[fieldname[i]] = t;
                        if ((i < n - 1) && (soc >= eoc)) {
                            console.log("invalid table alignment (1/" + i + ")", v, eoc - soc);
                            return r;
                        }
                        if ((i == n - 1) && (soc > eoc)) {
                            console.log("invalid table alignment (2)", v, eoc - soc);
                            return r;
                        }
                    }
                    r.push(v);
                }
                return r;
            }
        } (stringModule, numberModule, utf8Module);

        numberModule.fromVariable = function (typeModule, base64Module, stringModule, numberModule) {
            return function (obj) {
                var i, n, x, z, st, sx, sy, keys, ss;
                /*
                    charcode        meaning
                    0               undefined
                    1               null
                    2               shortarray (32k)
                    3               longarray  (2m)
                    4               shortobj    (32k)
                    5               longobj     (2m)
                    6               function
                    7               boolean - true
                    8               boolean - false
                    9               number (i32)
                    10              number (f64)
                    11              short string (32k)
                    12              long string (2m)
                    13              realtime (date / date2a)
                    14              date (date2b)
                    15              datetime (date2c)
                    16              geometry
                */
                if (obj === undefined) return String.fromCharCode(0);
                if (obj === null) return String.fromCharCode(1);
                if (typeModule.isArray(obj)) {
                    n = obj.length;
                    if (n < 32768) {
                        st = [String.fromCharCode(2) + numberModule.toString("i16", n)];
                    }
                    else {
                        st = [String.fromCharCode(3) + numberModule.toString("i32", n)];
                    }
                    for (i = 0; i < n; i++) {
                        st.push(numberModule.fromVariable(obj[i]));
                    }
                    return stringModule.merge(st);
                }
                else if (obj instanceof Geometry) {
                    st = stringModule.fromVariable(obj.getData());
                    return String.fromCharCode(16) + numberModule.toString("i32", st.length) + st;
                }
                else if (typeModule.isDate(obj)) {
                    let tobj = obj.getTime();
                    st = ~~(tobj / 1000000);
                    sx = tobj - st * 1000000;
                    ss = numberModule.toString("i32", st) + numberModule.toString("i32", sx);
                    if (obj instanceof Date2) {
                        if (obj.mode == "date") {
                            return String.fromCharCode(14) + ss + numberModule.toString("i16", obj.getFullYear()) + String.fromCharCode(obj.getMonth()) + String.fromCharCode(obj.getDate());
                        }
                        if (obj.mode == "datetime") {
                            return String.fromCharCode(15) + ss
                                + numberModule.toString("i16", obj.getFullYear()) + String.fromCharCode(obj.getMonth()) + String.fromCharCode(obj.getDate())
                                + String.fromCharCode(obj.getHours()) + String.fromCharCode(obj.getMinutes());
                        }
                    }
                    return String.fromCharCode(13) + ss;
                }
                else if (typeModule.isObject(obj)) {
                    keys = Object.keys(obj);
                    n = keys.length;
                    if (n < 32768) {
                        st = [String.fromCharCode(4) + numberModule.toString("i16", n)];
                    }
                    else {
                        st = [String.fromCharCode(5) + numberModule.toString("i32", n)];
                    }
                    for (i = 0; i < n; i++) {
                        sx = utf8Module.encode(keys[i]);
                        st.push(numberModule.toString("i16", sx.length) + sx);
                        sx = numberModule.fromVariable(obj[keys[i]]);
                        st.push(sx);
                    }
                    return stringModule.merge(st);
                }
                else if (typeModule.isFunction(obj)) {
                    sx = utf8Module.encode(obj.toString() + "");
                    return String.fromCharCode(6) + numberModule.toString("i32", sx.length) + sx;
                }
                else if (typeModule.isBoolean(obj)) {
                    if (obj) {
                        return String.fromCharCode(7);
                    }
                    else {
                        return String.fromCharCode(8);
                    }
                }
                else if (typeModule.isNumber(obj)) {
                    if ((obj == ~~obj) && (-2147483648 <= obj) && (obj < 2147483648)) {
                        return String.fromCharCode(9) + numberModule.toString("i32", obj);
                    }
                    else {
                        return String.fromCharCode(10) + numberModule.toString("f64", obj);
                    }
                }
                else if (typeModule.isString(obj)) {
                    sx = utf8Module.encode(obj + "");
                    if (sx.length < 32768) {
                        return String.fromCharCode(11) + numberModule.toString("i16", sx.length) + sx;
                    }
                    else {
                        return String.fromCharCode(12) + numberModule.toString("i32", sx.length) + sx;
                    }
                }
                else {
                    return String.fromCharCode(255);
                }
            }
        } (typeModule, base64Module, stringModule, numberModule);

        numberModule.toVariable = function (typeModule, base64Module, stringModule, numberModule) {
            return function (str) {
                var i, n, x, z, st, sx, sy, keys, ss;
                var code;
                if (EncodingClass.type.isString(str)) {
                    return numberModule.toVariable({
                        str: str,
                        position: 0
                    }).retval;
                }
                /*
                    charcode        meaning
                    0               undefined
                    1               null
                    2               shortarray (32k)
                    3               longarray  (2m)
                    4               shortobj    (32k)
                    5               longobj     (2m)
                    6               function
                    7               boolean - true
                    8               boolean - false
                    9               number (i32)
                    10              number (f64)
                    11              short string (32k)
                    12              long string (2m)
                    13              realtime (date / date2a)
                    14              date (date2b)
                    15              datetime (date2c)
                    16              geometry
                */
                code = str.str.charCodeAt(str.position);
                str.position++;
                if (code == 0) {
                    str.retval = undefined;
                    return str;
                }
                if (code == 1) {
                    str.retval = null;
                    return str;
                }
                if ((code == 2) || (code == 3)) {
                    if (code == 2) {
                        n = numberModule.fromString("i16", str.str, str.position);
                        str.position += 2;
                    }
                    else {
                        n = numberModule.fromString("i32", str.str, str.position);
                        str.position += 4;
                    }
                    ss = [];
                    for (i = 0; i < n; i++) {
                        ss.push(numberModule.toVariable(str).retval);
                    }
                    str.retval = ss;
                    return str;
                }
                if ((code == 4) || (code == 5)) {
                    if (code == 4) {
                        n = numberModule.fromString("i16", str.str, str.position);
                        str.position += 2;
                    }
                    else {
                        n = numberModule.fromString("i32", str.str, str.position);
                        str.position += 4;
                    }
                    ss = {};
                    for (i = 0; i < n; i++) {
                        sx = numberModule.fromString("i16", str.str, str.position);
                        str.position += 2;
                        keys = stringModule.substr(str.str, str.position, sx);
                        str.position += sx;
                        keys = utf8Module.decode(keys);
                        ss[keys] = numberModule.toVariable(str).retval;
                    }
                    str.retval = ss;
                    return str;
                }
                if (code == 6) {
                    n = numberModule.fromString("i32", str.str, str.position);
                    str.position += 4;
                    ss = utf8Module.decode(str.str.substr(str.position, n));
                    str.position += n;
                    str.retval = ss;
                    return str;
                }
                if ((code == 7) || (code == 8)) {
                    str.retval = (code == 7);
                    return str;
                }
                if (code == 9) {
                    str.retval = numberModule.fromString("i32", str.str, str.position);
                    str.position += 4;
                    return str;
                }
                if (code == 10) {
                    str.retval = numberModule.fromString("f64", str.str, str.position);
                    str.position += 8;
                    return str;
                }
                if ((code == 11) || (code == 12)) {
                    if (code == 11) {
                        n = numberModule.fromString("i16", str.str, str.position);
                        str.position += 2;
                    }
                    else {
                        n = numberModule.fromString("i32", str.str, str.position);
                        str.position += 4;
                    }
                    ss = utf8Module.decode(str.str.substr(str.position, n));
                    str.position += n;
                    str.retval = ss;
                    return str;
                }
                if ((code == 13) || (code == 14) || (code == 15)) {
                    st = numberModule.fromString("i32", str.str, str.position);
                    str.position += 4;
                    sx = numberModule.fromString("i32", str.str, str.position);
                    str.position += 4;
                    ss = st * 1000000 + sx;
                    ss = new Date2(ss);
                    if (code > 13) {
                        ss = new Date2(ss);
                        ss.setDate(1);
                        ss.setMonth(0);
                        ss.setFullYear(numberModule.fromString("i16", str.str, str.position));
                        str.position += 2;
                        ss.setMonth(str.str.charCodeAt(str.position++));
                        ss.setDate(str.str.charCodeAt(str.position++));
                        if (code == 15) {
                            ss.setHours(str.str.charCodeAt(str.position++));
                            ss.setMinutes(str.str.charCodeAt(str.position++));
                        }
                    }
                    str.retval = ss;
                    return str;
                }
                if (code == 16) {
                    n = numberModule.fromString("i32", str.str, str.position);
                    str.position += 4;
                    st = str.str.substr(str.position, n);
                    str.position += n;
                    st = stringModule.toVariable(st);
                    str.retval = Geometry.fromData(st);
                    return str;
                }
                str.retval = undefined;
                return str;
            }
        } (typeModule, base64Module, stringModule, numberModule);

        numberModule.fromStructRecord = function (numberModule) {
            return function (keys, obj) {
                var st = "";
                var i;
                for (i = 0; i < keys.length; i++) {
                    st += numberModule.fromVariable(obj[keys[i]]);
                }
                return st;
            }
        } (numberModule);

        numberModule.toStructRecord = function (numberModule) {
            return function (keys, str) {
                var st = {};
                var host = {
                    str: str,
                    position: 0
                };
                var i;
                for (i = 0; i < keys.length; i++) {
                    st[keys[i]] = numberModule.toVariable(host).retval;
                }
                return st;
            }
        } (numberModule);

        numberModule.rndFunc = function (a, b, c, d) {
            var host = {
                a: a & 4294967295,
                b: b & 4294967295,
                c: c & 4294967295,
                d: d & 4294967295
            };
            var f = function (host) {
                return function (range) {
                    var t = (host.a + host.b + host.d) | 0;
                    host.d = (host.d + 1) | 0;
                    host.a = host.b ^ host.b >>> 9;
                    host.b = host.c + (host.c << 3) | 0;
                    host.c = (host.c << 21 | host.c >>> 11);
                    host.c = host.c + t | 0;
                    var r = t / 4294967296;
                    if (range === undefined) return r;
                    r = ~~Math.floor(range * r);
                    if (r == range) r = r - 1;
                    return r;
                }
            } (host);
            var i;
            for (i = 0; i < 100; i++) f(1000);
            return f;
        };

        numberModule.asyncSort = function (arr, cmpFunc, callbackfunc) {
            var iarray, ilen;

            if (arr.length == 0) {
                Thread.setTimeout({
                    func: callbackfunc,
                    args: [arr]
                });
                return;
            }
            iarray = new Array(arr.length);
            var apush = function (value) {
                var index, hindex, t;
                iarray[index = ilen++] = value;
                while (index > 0) {
                    hindex = ((index + 1) >> 1) - 1;
                    if (cmpFunc(arr[iarray[hindex]], arr[iarray[index]]) >= 0) break;
                    t = iarray[index];
                    iarray[index] = iarray[hindex];
                    iarray[hindex] = t;
                    index = hindex;
                }
            }

            var apop = function () {
                var r, index, index1, index2, t;
                var index, index1, index2;
                r = iarray[0];
                if (ilen == 1) {
                    ilen--;
                    return r;
                }
                iarray[0] = iarray[--ilen];
                index = 0;
                while (true) {
                    index2 = (index << 1) + 2;
                    index1 = index2 - 1;
                    if (index1 >= ilen) break;
                    if (index2 < ilen) {
                        if (cmpFunc(arr[iarray[index2]], arr[iarray[index1]]) > 0) index1 = index2;
                    }
                    if (cmpFunc(arr[iarray[index]], arr[iarray[index1]]) >= 0) break;
                    t = iarray[index];
                    iarray[index] = iarray[index1];
                    iarray[index1] = t;
                    index = index1;
                }
                return r;
            }

            var step1 = function () {
                ilen = 0;
                Thread.exec(
                    function () {
                        if (ilen >= arr.length) return true;
                        apush(ilen);
                        return false;
                    },
                    step2
                );
            };

            var step2 = function () {
                Thread.exec(
                    function () {
                        var t;
                        if (ilen == 0) return true;
                        t = apop();
                        iarray[ilen] = t;
                        return false;
                    },
                    step3
                );
            }

            var step3 = function () {
                Thread.exec(
                    function () {
                        if (ilen >= arr.length) return true;
                        iarray[ilen] = arr[iarray[ilen]];
                        ilen++;
                        return false;
                    },
                    step4
                );
            }

            var step4 = function () {
                ilen = 0;
                Thread.exec(
                    function () {
                        if (ilen >= arr.length) return true;
                        arr[ilen] = iarray[ilen];
                        ilen++;
                        return false;
                    },
                    function () {
                        iarray = null;
                        Thread.setTimeout({
                            func: callbackfunc,
                            args: [arr]
                        });
                    }
                );
            }
            step1();

        }

        ecode.pack = {};

        ecode.pack.getData = function (numberModule, stringModule) {
            return function (content, type, position) {
                var length, s, r;
                var i, k, n, key;
                var dd, mm, yy, hh, m2;
                switch (type) {
                    case 0:
                        if (position == 0) return undefined;
                        if (position == 1) return null;
                        return undefined;
                    case 1:
                        length = numberModule.fromArray("i32", content.text, position);
                        s = stringModule.fromUint8Array(content.text, position + 4, length);
                        s = utf8Module.decode(s);
                        return (new Function("return " + s))();
                    case 2:
                        r = [];
                    case 3:
                    case 11:
                        if ((type == 3) || (type == 11)) r = {};
                        k = content.int[position++];
                        n = content.int[position++];
                        for (i = 0; i < k; i++) {
                            key = content.int[position++];
                            length = numberModule.fromArray("i32", content.text, key);
                            key = stringModule.fromUint8Array(content.text, key + 4, length);
                            key = utf8Module.decode(key);
                            type = content.int[position++];
                            r[key] = ecode.pack.getData(content, type, content.int[position++]);
                        }
                        for (i = 0; i < n; i++) {
                            key = content.int[position++];
                            type = content.int[position++];
                            r[key] = ecode.pack.getData(content, type, content.int[position++]);
                        }
                        if (type == 11) r = Geometry.fromData(r);
                        return r;
                    case 4:
                        return position != 0;
                    case 5:
                        return position;
                    case 6:
                        return content.nums[position];
                    case 7:
                        length = numberModule.fromArray("i32", content.text, position);
                        s = stringModule.fromUint8Array(content.text, position + 4, length);
                        return utf8Module.decode(s);
                    case 8:
                        k = content.nums[position++];
                        return new Date(k);
                    case 9:
                    case 10:
                        k = content.nums[position++];
                        r = new Date2(k);
                        if (type == 8) {
                            r.mode = "date";
                        }
                        else {
                            r.mode = "datetime";
                        }
                        r.setDate(1);
                        r.setMonth(0);
                        n = ~~content.nums[position++];
                        m2 = n % 60;
                        n = ~~((n - m2) / 60);
                        hh = n % 24;
                        n = ~~((n - hh) / 24);
                        dd = (n % 31) + 1;
                        n = ~~((n - dd - 1) / 31);
                        mm = (n % 12);
                        n = ~~((n - mm) / 12);
                        r.setFullYear(n);
                        r.setMonth(mm);
                        r.setDate(dd);
                        if (type == 9) return r;
                        r.setHours(hh);
                        r.setMinutes(m2);
                        return r;
                }
                return undefined;
            }
        } (numberModule, stringModule);

        ecode.pack.asyncGetData = function (numberModule, stringModule) {
            return function (content, type, position, callbackfunc) {
                var length, s, r;
                var i, k, n, key;
                var dd, mm, yy, hh, m2;
                var retval;
                var stacks = [{
                    type: type,
                    position: position,
                    index: 0
                }];
                var getData = function () {
                    if (stacks.length == 0) return true;
                    position = stacks[stacks.length - 1].position;

                    if (stacks[stacks.length - 1].index == 0) {
                        type = stacks[stacks.length - 1].type;
                        switch (type) {
                            case 0:
                                if (position == 0) {
                                    retval = undefined;
                                    stacks.pop();
                                    return false;
                                }
                                if (position == 1) {
                                    retval = null;
                                    stacks.pop();
                                    return false;
                                }
                                retval = undefined;
                                stacks.pop();
                                return false;
                            case 1:
                                length = numberModule.fromArray("i32", content.text, position);
                                s = stringModule.fromUint8Array(content.text, position + 4, length);
                                s = utf8Module.decode(s);
                                retval = (new Function("return " + s))();
                                stacks.pop();
                                return false;
                            case 4:
                                retval = position != 0;
                                stacks.pop();
                                return false;
                            case 5:
                                retval = position;
                                stacks.pop();
                                return false;
                            case 6:
                                retval = content.nums[position];
                                stacks.pop();
                                return false;
                            case 7:
                                length = numberModule.fromArray("i32", content.text, position);
                                s = stringModule.fromUint8Array(content.text, position + 4, length);
                                retval = utf8Module.decode(s);
                                stacks.pop();
                                return false;
                            case 8:
                                k = content.nums[position++];
                                retval = new Date(k);
                                stacks.pop();
                                return false;
                            case 9:
                            case 10:
                                k = content.nums[position++];
                                r = new Date2(k);
                                if (type == 8) {
                                    r.mode = "date";
                                }
                                else {
                                    r.mode = "datetime";
                                }
                                r.setDate(1);
                                r.setMonth(0);
                                n = ~~content.nums[position++];
                                m2 = n % 60;
                                n = ~~((n - m2) / 60);
                                hh = n % 24;
                                n = ~~((n - hh) / 24);
                                dd = (n % 31) + 1;
                                n = ~~((n - dd - 1) / 31);
                                mm = (n % 12);
                                n = ~~((n - mm) / 12);
                                r.setFullYear(n);
                                r.setMonth(mm);
                                r.setDate(dd);
                                if (type == 9) {
                                    retval = r;
                                    stacks.pop();
                                    return false;
                                }
                                r.setHours(hh);
                                r.setMinutes(m2);
                                retval = r;
                                stacks.pop();
                                return false;
                            case 2:
                                stacks[stacks.length - 1].r = [];
                            case 3:
                            case 11:
                                if ((type == 3) || (type == 11)) stacks[stacks.length - 1].r = {};
                                stacks[stacks.length - 1].k = content.int[stacks[stacks.length - 1].position++];
                                stacks[stacks.length - 1].n = content.int[stacks[stacks.length - 1].position++];
                                stacks[stacks.length - 1].i = 0;
                                stacks[stacks.length - 1].index = 1;
                                return false;
                        }
                        retval = undefined;
                        stacks.pop();
                        return false;
                    }
                    if (stacks[stacks.length - 1].index == 1) {
                        if (stacks[stacks.length - 1].i < stacks[stacks.length - 1].k) {
                            key = content.int[stacks[stacks.length - 1].position++];
                            length = numberModule.fromArray("i32", content.text, key);
                            key = stringModule.fromUint8Array(content.text, key + 4, length);
                            stacks[stacks.length - 1].key = utf8Module.decode(key);
                            type = content.int[stacks[stacks.length - 1].position++]
                            stacks[stacks.length - 1].index = 2;
                            stacks.push({
                                type: type,
                                position: content.int[stacks[stacks.length - 1].position++],
                                index: 0
                            });
                        }
                        else {
                            stacks[stacks.length - 1].index = 3;
                        }
                        return false;
                    }
                    if (stacks[stacks.length - 1].index == 2) {
                        stacks[stacks.length - 1].r[stacks[stacks.length - 1].key] = retval;
                        stacks[stacks.length - 1].i++;
                        stacks[stacks.length - 1].index = 1;
                        return false;
                    }
                    if (stacks[stacks.length - 1].index == 3) {
                        stacks[stacks.length - 1].i = 0;
                        stacks[stacks.length - 1].index = 4;
                        return false;
                    }
                    if (stacks[stacks.length - 1].index == 4) {
                        if (stacks[stacks.length - 1].i < stacks[stacks.length - 1].n) {
                            stacks[stacks.length - 1].key = content.int[stacks[stacks.length - 1].position++];
                            type = content.int[stacks[stacks.length - 1].position++];
                            stacks[stacks.length - 1].index = 5;
                            stacks.push({
                                type: type,
                                position: content.int[stacks[stacks.length - 1].position++],
                                index: 0
                            });
                        }
                        else {
                            stacks[stacks.length - 1].index = 6;
                        }
                        return false;
                    }
                    if (stacks[stacks.length - 1].index == 5) {
                        if (stacks[stacks.length - 1].type == 11) retval = Geometry.fromData(retval);
                        stacks[stacks.length - 1].r[stacks[stacks.length - 1].key] = retval;
                        stacks[stacks.length - 1].i++;
                        stacks[stacks.length - 1].index = 4;
                        return false;
                    }
                    if (stacks[stacks.length - 1].index == 6) {
                        retval = stacks[stacks.length - 1].r;
                        stacks.pop();
                        return false;
                    }
                    retval = undefined;
                    stacks.pop();
                    return false;
                }
                Thread.exec(getData, function () {
                    Thread.setTimeout({
                        func: callbackfunc,
                        args: [retval]
                    });
                });

                return undefined;
            }
        } (numberModule, stringModule);

        ecode.pack.findPositionByKey = function (ecode, numberModule, stringModule) {
            return function (content, length, position, key) {
                var l = 0;
                var m, r = length - 1;
                var lkey = content.int[position];
                var rkey = content.int[position + r * 3];
                var mkey, slen;
                slen = numberModule.fromArray("i32", content.text, lkey);
                lkey = stringModule.fromUint8Array(content.text, lkey + 4, slen);
                lkey = utf8Module.decode(lkey);
                slen = numberModule.fromArray("i32", content.text, rkey);
                rkey = stringModule.fromUint8Array(content.text, rkey + 4, slen);
                rkey = utf8Module.decode(rkey);
                while (l <= r) {
                    m = (l + r) >> 1;
                    mkey = content.int[position + m * 3];
                    slen = numberModule.fromArray("i32", content.text, mkey);
                    mkey = stringModule.fromUint8Array(content.text, mkey + 4, slen);
                    mkey = utf8Module.decode(mkey);
                    if (mkey == key) return position + m * 3;
                    if (mkey < key) {
                        l = m + 1;
                        if (l >= length) return null;
                        lkey = content.int[position + l * 3];
                        slen = numberModule.fromArray("i32", content.text, lkey);
                        lkey = stringModule.fromUint8Array(content.text, lkey + 4, slen);
                        lkey = utf8Module.decode(lkey);
                    }
                    else {
                        r = m - 1;
                        if (r < 0) return null;
                        rkey = content.int[position + r * 3];
                        slen = numberModule.fromArray("i32", content.text, rkey);
                        rkey = stringModule.fromUint8Array(content.text, rkey + 4, slen);
                        rkey = utf8Module.decode(rkey);
                    }
                }
                return null;
            }
        } (ecode, numberModule, stringModule);

        ecode.pack.findPositionByNumKey = function (ecode) {
            return function (content, length, position, key) {
                var l = 0;
                var m, r = length - 1;
                var lkey = content.int[position];
                var mkey, rkey = content.int[position + r * 3];
                while (l <= r) {
                    m = (l + r) >> 1;
                    mkey = content.int[position + m * 3];
                    if (mkey == key) return position + m * 3;
                    if (mkey < key) {
                        l = m + 1;
                        if (l >= length) return null;
                        lkey = content.int[position + l * 3];
                    }
                    else {
                        r = m - 1;
                        if (r < 0) return null;
                        rkey = content.int[position + r * 3];
                    }
                }
                return null;
            }
        } (ecode);

        ecode.pack.findPosition = function (ecode) {
            return function (content, path) {
                var i, k, type, position, key;
                var l1, l2;
                type = content.int[0];
                position = content.int[1];
                for (i = 0; i < path.length; i++) {
                    if ((type != 2) && (type != 3)) return undefined;
                    key = path[i];
                    k = ~~(parseInt(key));
                    l1 = content.int[position++];
                    l2 = content.int[position++];
                    if (("" + k == key) && (-2147483648 <= k) && (k < 2147483648)) {
                        position = ecode.pack.findPositionByNumKey(content, l2, position + l1 * 3, k);
                    }
                    else {
                        position = ecode.pack.findPositionByKey(content, l1, position, key);
                    }
                    if (position === null) return undefined;
                    type = content.int[++position];
                    position = content.int[position + 1];
                }
                return {
                    type: type,
                    position: position
                };
            }
        } (ecode);

        ecode.pack.read = function (ecode, typeModule) {
            return function (content, path, callbackfunc) {
                if (path === undefined) path = [];
                if ((path !== undefined) && (callbackfunc === undefined)) {
                    if (typeModule.isFunction(path)) {
                        callbackfunc = path;
                        path = [];
                    }
                }
                if (callbackfunc !== undefined) {
                    if (!typeModule.isFunction(callbackfunc)) callbackfunc = undefined;
                }
                if (typeModule.isString(path) || typeModule.isNumber(path)) path = [path];
                if (!typeModule.isArray(path)) {
                    if (callbackfunc !== undefined) Thread.setTimeout({ func: callbackfunc });
                    return undefined;
                }
                var r = ecode.pack.findPosition(content, path);
                if (r === undefined) {
                    if (callbackfunc !== undefined) Thread.setTimeout({ func: callbackfunc });
                    return undefined;
                }
                if (callbackfunc !== undefined) {
                    ecode.pack.asyncGetData(content, r.type, r.position, callbackfunc);
                    return;
                }
                return ecode.pack.getData(content, r.type, r.position);
            }
        } (ecode, typeModule);

        ecode.pack.getKeys = function (ecode, numberModule, stringModule, utf8Module) {
            return function (content, path) {
                var r, i, skey, nkey, position, keys = [], key, slen;
                if (path === undefined) path = [];
                r = ecode.pack.findPosition(content, path);
                if (r === undefined) undefined;
                if ((r.type != 2) && (r.type != 3)) return undefined;
                position = r.position;
                skey = content.int[position++];
                nkey = content.int[position++];
                for (i = 0; i < skey; i++, position += 3) {
                    key = content.int[position];
                    slen = numberModule.fromArray("i32", content.text, key);
                    key = stringModule.fromUint8Array(content.text, key + 4, slen);
                    key = utf8Module.decode(key);
                    keys.push(key);
                }
                for (i = 0; i < nkey; i++, position += 3) {
                    key = content.int[position];
                    keys.push(key);
                }
                return keys;
            }
        } (ecode, numberModule, stringModule, utf8Module);

        ecode.pack.toString = function (numberModule, stringModule) {
            return function (content, callbackfunc) {
                var ilen = content.int.byteLength;
                var nlen = 0;
                var tlen = 0;
                if (content.nums !== undefined) nlen = content.nums.byteLength;
                if (content.text !== undefined) tlen = content.text.byteLength;
                var r = [numberModule.toString("i32", ilen), numberModule.toString("i32", nlen)];
                if (nlen > 0) r.push(stringModule.fromUint8Array(new Uint8Array(content.nums.buffer)));
                if (tlen > 0) r.push(stringModule.fromUint8Array(content.text));
                return stringModule.merge(r);
            }
        } (numberModule, stringModule);

        ecode.pack.toUint8Array = function (numberModule) {
            return function (content, callbackfunc) {
                var ilen = content.int.byteLength;
                var nlen = 0;
                var tlen = 0;
                if (content.nums !== undefined) nlen = content.nums.byteLength;
                if (content.text !== undefined) tlen = content.text.byteLength;
                var length = ilen + nlen + tlen + 8;
                var r = new Uint8Array(length);
                numberModule.writeArray("i32", ilen, r);
                numberModule.writeArray("i32", nlen, r, 4);
                r.set(new Uint8Array(content.int.buffer), 8);
                if (nlen > 0) r.set(new Uint8Array(content.nums.buffer), ilen + 8);
                if (tlen > 0) r.set(content.text, ilen + nlen + 8);
                return r;
            }
        } (numberModule);

        ecode.pack.getInstance = function (content) {
            var retval = {};
            retval.read = function (path, callbackfunc) {
                return ecode.pack.read(content, path, callbackfunc);
            };
            retval.getKeys = function (path) {
                return ecode.pack.getKeys(content, path);
            };
            retval.toString = function (callbackfunc) {
                return ecode.pack.toString(content, callbackfunc);
            };
            retval.toUint8Array = function (callbackfunc) {
                return ecode.pack.toUint8Array(content, callbackfunc);
            };
            retval.terminate = function () {
                delete retval.read;
                delete retval.getKeys;
                delete retval.toString;
                delete retval.toUint8Array;
                delete retval.terminate;
                delete content.int;
                delete content.nums;
                delete content.text;
            }
            return retval;
        }

        ecode.pack.fromVariable = function (ecode, numberModule, typeModule, utf8Module) {
            return function (obj) {
                var stringList = [];
                var keyList = {};
                var numList = [];
                var intList = [0, 0];
                var slength = 0;

                /*
                    type:
                        0: system
                        1: function
                        2: array
                        3: object
                        4: boolean
                        5: int
                        6: double
                        7: string
                        8: Date / date2a
                        9: date2b
                        10: date2c
                        11: Geometry

                        20: Int8Array
                        21: Uint8Array
                        22: Int16Array
                        23: Uint16Array
                        24: Int32Array
                        25: Uint32Array
                        26: Float32Array
                        27: Float64Array
                        28: BigInt64Array
                        29: BigUint64Array
                */

                var writeData = function (obj) {
                    var i, k, n, t, keys, nkeys, cpos, tpos;
                    var rtype;
                    if (obj === undefined) return {
                        type: 0,
                        content: 0
                    };
                    if (obj == null) return {
                        type: 0,
                        content: 1
                    };
                    if (obj === true) return {
                        type: 4,
                        content: 1
                    };
                    if (obj === false) return {
                        type: 4,
                        content: 0
                    };
                    if (obj instanceof Int8Array) {
                        stringList.push(new Uint8Array((new Int8Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 20,
                            content: tpos
                        }
                    }
                    if (obj instanceof Uint8Array) {
                        stringList.push(obj);
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 21,
                            content: tpos
                        }
                    }
                    if (obj instanceof Int16Array) {
                        stringList.push(new Uint8Array((new Int16Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 22,
                            content: tpos
                        }
                    }
                    if (obj instanceof Uint16Array) {
                        stringList.push(new Uint8Array((new Uint16Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 23,
                            content: tpos
                        }
                    }
                    if (obj instanceof Int32Array) {
                        stringList.push(new Uint8Array((new Int32Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 24,
                            content: tpos
                        }
                    }
                    if (obj instanceof Uint32Array) {
                        stringList.push(new Uint8Array((new Uint32Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 25,
                            content: tpos
                        }
                    }
                    if (obj instanceof Float32Array) {
                        stringList.push(new Uint8Array((new Float32Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 26,
                            content: tpos
                        }
                    }
                    if (obj instanceof Float64Array) {
                        stringList.push(new Uint8Array((new Float64Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 27,
                            content: tpos
                        }
                    }
                    if (self.BigInt64Array && (obj instanceof BigInt64Array)) {
                        stringList.push(new Uint8Array((new BigInt64Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 28,
                            content: tpos
                        }
                    }
                    if (self.BigUint64Array && (obj instanceof BigUint64Array)) {
                        stringList.push(new Uint8Array((new BigUint64Array(obj)).buffer));
                        tpos = slength;
                        slength += stringList[stringList.length - 1].length + 4;
                        return {
                            type: 29,
                            content: tpos
                        }
                    }
                    if (typeModule.isFunction(obj)) {
                        obj = utf8Module.encode(obj.toString());
                        stringList.push(obj);
                        tpos = slength;
                        slength += obj.length + 4;
                        return {
                            type: 1,
                            content: tpos
                        };
                    }
                    if (typeModule.isDate(obj)) {
                        if (obj instanceof Date2) {
                            if (obj.mode == "date") {
                                tpos = numList.length;
                                numList.push(obj.getTime());
                                numList.push(
                                    obj.getFullYear() * 535680 +
                                    obj.getMonth() * 44640
                                    (obj.getDate() - 1) * 1440
                                );
                                return {
                                    type: 9,
                                    content: tpos
                                };
                            }
                            if (obj.mode == "datetime") {
                                tpos = numList.length;
                                numList.push(obj.getTime());
                                numList.push(
                                    obj.getFullYear() * 535680 +
                                    obj.getMonth() * 44640
                                    (obj.getDate() - 1) * 1440 +
                                    obj.getHours() * 24 +
                                    obj.getMinutes()
                                );
                                return {
                                    type: 10,
                                    content: tpos
                                };
                            }
                        }
                        tpos = numList.length;
                        numList.push(obj.getTime());
                        return {
                            type: 8,
                            content: tpos
                        };
                    }
                    if (typeModule.isNumber(obj)) {
                        k = ~~(obj);
                        if ((k == obj) && (-2147483648 <= k) && (k < 2147483648)) {
                            return {
                                type: 5,
                                content: k
                            };
                        }
                        tpos = numList.length;
                        numList.push(obj);
                        return {
                            type: 6,
                            content: tpos
                        };
                    }
                    if (typeModule.isString(obj)) {
                        obj = utf8Module.encode(obj);
                        stringList.push(obj);
                        tpos = slength;
                        slength += obj.length + 4;
                        return {
                            type: 7,
                            content: tpos
                        };
                    }
                    if (typeModule.isArray(obj) || typeModule.isObject(obj) || (obj instanceof Geometry)) {
                        cpos = intList.length;
                        if (obj instanceof Geometry) {
                            rtype = 11;
                            obj = obj.getData();
                        }
                        else if (typeModule.isArray(obj)) {
                            rtype = 2;
                        }
                        else {
                            rtype = 3;
                        }
                        keys = Object.keys(obj);
                        nkeys = [];
                        for (i = n = 0; i < keys.length; i++) {
                            k = ~~(parseInt(keys[i]));
                            if (("" + k == keys[i]) && (-2147483648 <= k) && (k < 2147483648)) {
                                nkeys.push(k);
                            }
                            else {
                                keys[n++] = {
                                    o: keys[i],
                                    u: utf8Module.encode(keys[i])
                                }
                            }
                        }
                        intList.push(n);
                        intList.push(nkeys.length);
                        tpos = intList.length;
                        for (i = 0; i < keys.length; i++) {
                            intList.push(0);
                            intList.push(0);
                            intList.push(0);
                        }
                        if (n > 0) {
                            keys = keys.slice(0, n);
                            keys.sort(function (a, b) {
                                if (a.u < b.u) return -1;
                                if (a.u == b.u) return 0;
                                return 1;
                            });
                            for (i = 0; i < n; i++) {
                                if (keyList[keys[i].u] === undefined) {
                                    keyList[keys[i].u] = slength;
                                    stringList.push(keys[i].u);
                                    slength += keys[i].u.length + 4;
                                }
                                intList[tpos++] = keyList[keys[i].u];
                                t = writeData(obj[keys[i].o]);
                                intList[tpos++] = t.type;
                                intList[tpos++] = t.content;
                            }
                        }
                        nkeys.sort((a, b) => (a - b));
                        for (i = 0; i < nkeys.length; i++) {
                            intList[tpos++] = nkeys[i];
                            t = writeData(obj[nkeys[i]]);
                            intList[tpos++] = t.type;
                            intList[tpos++] = t.content;
                        }
                        return {
                            type: rtype,
                            content: cpos
                        };
                    }
                    return undefined;
                }
                var t = writeData(obj);
                intList[0] = t.type;
                intList[1] = t.content;
                var content = {}, tpos = 0;
                if (slength > 0) {
                    content.text = new Uint8Array(slength);
                    for (i = 0; i < stringList.length; i++) {
                        numberModule.writeArray("i32", stringList[i].length, content.text, tpos);
                        tpos += 4;
                        if (stringList[i] instanceof Uint8Array) {
                            content.text.set(stringList[i], tpos);
                        }
                        else {
                            numberModule.writeArray("s", stringList[i], content.text, tpos);
                        }
                        tpos += stringList[i].length;
                        stringList[i] = null;
                    }
                }
                if (numList.length > 0) content.nums = new Float64Array(numList);
                content.int = new Int32Array(intList);
                return ecode.pack.getInstance(content);
            }
        } (ecode, numberModule, typeModule, utf8Module);

        ecode.pack.asyncFromVariable = function (ecode, numberModule, typeModule, utf8Module) {
            return function (obj, callbackfunc) {
                var stringList = [];
                var keyList = {};
                var numList = [];
                var intList = [0, 0];
                var slength = 0;
                var stacks = [{
                    obj: obj,
                    index: 0
                }];
                var rettype, retcontent;
                var content = {};
                var index, tpos;

                var writeData = function () {
                    var i, k, n, t, keys, nkeys;
                    var rtype;

                    if (stacks.length == 0) return true;
                    if (stacks[stacks.length - 1].index == 0) {
                        if (stacks[stacks.length - 1].obj === undefined) {
                            rettype = 0;
                            retcontent = 0;
                            stacks.pop();
                            return false;
                        }
                        if (stacks[stacks.length - 1].obj === null) {
                            rettype = 0;
                            retcontent = 1;
                            stacks.pop();
                            return false;
                        }
                        if (stacks[stacks.length - 1].obj === true) {
                            rettype = 4;
                            retcontent = 1;
                            stacks.pop();
                            return false;
                        }
                        if (stacks[stacks.length - 1].obj === false) {
                            rettype = 4;
                            retcontent = 0;
                            stacks.pop();
                            return false;
                        }
                        if (typeModule.isFunction(stacks[stacks.length - 1].obj)) {
                            t = utf8Module.encode(stacks[stacks.length - 1].obj.toString());
                            stringList.push(t);
                            retcontent = slength;
                            slength += t.length + 4;
                            rettype = 1;
                            stacks.pop();
                            return false;
                        }
                        if (typeModule.isDate(stacks[stacks.length - 1].obj)) {
                            if (stacks[stacks.length - 1].obj instanceof Date2) {
                                if (stacks[stacks.length - 1].obj.mode == "date") {
                                    retcontent = numList.length;
                                    numList.push(stacks[stacks.length - 1].obj.getTime());
                                    numList.push(
                                        stacks[stacks.length - 1].obj.getFullYear() * 535680 +
                                        stacks[stacks.length - 1].obj.getMonth() * 44640
                                        (stacks[stacks.length - 1].obj.getDate() - 1) * 1440
                                    );
                                    rettype = 9;
                                    stacks.pop();
                                    return false;
                                }
                                if (stacks[stacks.length - 1].obj.mode == "datetime") {
                                    retcontent = numList.length;
                                    numList.push(stacks[stacks.length - 1].obj.getTime());
                                    numList.push(
                                        obj.getFullYear() * 535680 +
                                        obj.getMonth() * 44640
                                        (obj.getDate() - 1) * 1440 +
                                        obj.getHours() * 24 +
                                        obj.getMinutes()
                                    );
                                    rettype = 10;
                                    stacks.pop();
                                    return false;
                                }
                            }
                            retcontent = numList.length;
                            numList.push(stacks[stacks.length - 1].obj.getTime());
                            rettype = 8;
                            stacks.pop();
                            return false;
                        }
                        if (typeModule.isNumber(stacks[stacks.length - 1].obj)) {
                            k = ~~(stacks[stacks.length - 1].obj);
                            if ((k == stacks[stacks.length - 1].obj) && (-2147483648 <= k) && (k < 2147483648)) {
                                rettype = 5;
                                retcontent = k;
                                stacks.pop();
                                return false;
                            }
                            retcontent = numList.length;
                            numList.push(stacks[stacks.length - 1].obj);
                            rettype = 6;
                            stacks.pop();
                            return false;
                        }
                        if (typeModule.isString(stacks[stacks.length - 1].obj)) {
                            t = utf8Module.encode(stacks[stacks.length - 1].obj);
                            stringList.push(t);
                            retcontent = slength;
                            slength += t.length + 4;
                            rettype = 7;
                            stacks.pop();
                            return false;
                        }
                        if (typeModule.isArray(stacks[stacks.length - 1].obj) || typeModule.isObject(stacks[stacks.length - 1].obj) || (stacks[stacks.length - 1].obj instanceof Geometry)) {
                            stacks[stacks.length - 1].cpos = intList.length;
                            if (obj instanceof Geometry) {
                                stacks[stacks.length - 1].rtype = 11;
                                stacks[stacks.length - 1].obj = stacks[stacks.length - 1].obj.getData();
                            }
                            else if (typeModule.isArray(stacks[stacks.length - 1].obj)) {
                                stacks[stacks.length - 1].rtype = 2;
                            }
                            else {
                                stacks[stacks.length - 1].rtype = 3;
                            }
                            stacks[stacks.length - 1].keys = Object.keys(stacks[stacks.length - 1].obj);
                            stacks[stacks.length - 1].nkeys = [];
                            for (i = n = 0; i < stacks[stacks.length - 1].keys.length; i++) {
                                k = ~~(parseInt(stacks[stacks.length - 1].keys[i]));
                                if (("" + k == stacks[stacks.length - 1].keys[i]) && (-2147483648 <= k) && (k < 2147483648)) {
                                    stacks[stacks.length - 1].nkeys.push(k);
                                }
                                else {
                                    stacks[stacks.length - 1].keys[n++] = {
                                        o: stacks[stacks.length - 1].keys[i],
                                        u: utf8Module.encode(stacks[stacks.length - 1].keys[i])
                                    }
                                }
                            }
                            intList.push(n);
                            intList.push(stacks[stacks.length - 1].nkeys.length);
                            stacks[stacks.length - 1].tpos = intList.length;
                            for (i = 0; i < stacks[stacks.length - 1].keys.length; i++) {
                                intList.push(0);
                                intList.push(0);
                                intList.push(0);
                            }
                            if (n > 0) {
                                stacks[stacks.length - 1].keys = stacks[stacks.length - 1].keys.slice(0, n);
                                stacks[stacks.length - 1].keys.sort(function (a, b) {
                                    if (a.u < b.u) return -1;
                                    if (a.u == b.u) return 0;
                                    return 1;
                                });
                                stacks[stacks.length - 1].n = n;
                                stacks[stacks.length - 1].i = 0;
                                stacks[stacks.length - 1].index = 1;
                            }
                            else {
                                stacks[stacks.length - 1].index = 3;
                            }
                            return false;
                        }
                        rettype = 0;
                        retcontent = 0;
                        stacks.pop();
                        return false;
                    }

                    if (stacks[stacks.length - 1].index == 1) {
                        if (stacks[stacks.length - 1].i < stacks[stacks.length - 1].n) {
                            if (keyList[stacks[stacks.length - 1].keys[stacks[stacks.length - 1].i].u] === undefined) {
                                keyList[stacks[stacks.length - 1].keys[stacks[stacks.length - 1].i].u] = slength;
                                stringList.push(stacks[stacks.length - 1].keys[stacks[stacks.length - 1].i].u);
                                slength += stacks[stacks.length - 1].keys[stacks[stacks.length - 1].i].u.length + 4;
                            }
                            intList[stacks[stacks.length - 1].tpos++] = keyList[stacks[stacks.length - 1].keys[stacks[stacks.length - 1].i].u];
                            stacks[stacks.length - 1].index = 2;
                            stacks.push({
                                obj: stacks[stacks.length - 1].obj[stacks[stacks.length - 1].keys[stacks[stacks.length - 1].i].o],
                                index: 0
                            });
                        }
                        else {
                            stacks[stacks.length - 1].index = 3;
                        }
                        return false;
                    }

                    if (stacks[stacks.length - 1].index == 2) {
                        intList[stacks[stacks.length - 1].tpos++] = rettype;
                        intList[stacks[stacks.length - 1].tpos++] = retcontent;
                        stacks[stacks.length - 1].i++;
                        stacks[stacks.length - 1].index = 1;
                        return false;
                    }

                    if (stacks[stacks.length - 1].index == 3) {
                        stacks[stacks.length - 1].nkeys.sort((a, b) => (a - b));
                        stacks[stacks.length - 1].i = 0;
                        stacks[stacks.length - 1].index = 4;
                        return false;
                    }

                    if (stacks[stacks.length - 1].index == 4) {
                        if (stacks[stacks.length - 1].i < stacks[stacks.length - 1].nkeys.length) {
                            intList[stacks[stacks.length - 1].tpos++] = stacks[stacks.length - 1].nkeys[stacks[stacks.length - 1].i];
                            stacks[stacks.length - 1].index = 5;
                            stacks.push({
                                obj: stacks[stacks.length - 1].obj[stacks[stacks.length - 1].nkeys[stacks[stacks.length - 1].i]],
                                index: 0
                            });
                        }
                        else {
                            stacks[stacks.length - 1].index = 6;
                        }
                        return false;
                    }

                    if (stacks[stacks.length - 1].index == 5) {
                        intList[stacks[stacks.length - 1].tpos++] = rettype;
                        intList[stacks[stacks.length - 1].tpos++] = retcontent;
                        stacks[stacks.length - 1].i++;
                        stacks[stacks.length - 1].index = 4;
                        return false;
                    }

                    if (stacks[stacks.length - 1].index == 6) {
                        rettype = stacks[stacks.length - 1].rtype;
                        retcontent = stacks[stacks.length - 1].cpos;
                        stacks.pop();
                        return false;
                    }
                    rettype = 0;
                    retcontent = 0;
                    stacks.pop();
                    return false;
                }
                Thread.exec(writeData, function () {
                    var p1, p2, p3;
                    intList[0] = rettype;
                    intList[1] = retcontent;
                    p1 = p2 = p3 = 0;
                    if (slength > 0) {
                        content.text = new Uint8Array(slength);
                        tpos = 0;
                        Thread.exec(function () {
                            if (p1 == stringList.length) return true;
                            numberModule.writeArray("i32", stringList[p1].length, content.text, tpos);
                            tpos += 4;
                            numberModule.writeArray("s", stringList[p1], content.text, tpos);
                            tpos += stringList[p1++].length;
                            return false;
                        });
                    }
                    if (numList.length > 0) {
                        content.nums = new Float64Array(numList.length);
                        numberModule.copyArray(content.nums, numList, function () {
                            p2 = numList.length;
                        });
                    }
                    content.int = new Int32Array(intList.length);
                    numberModule.copyArray(content.int, intList, function () {
                        p3 = intList.length;
                    });
                    Thread.wait(
                        function () {
                            return (p1 == stringList.length) && (p2 == numList.length) && (p3 == intList.length);
                        },
                        function () {
                            Thread.setTimeout({
                                func: callbackfunc,
                                args: [ecode.pack.getInstance(content)]
                            });
                        }
                    );
                });
            }
        } (ecode, numberModule, typeModule, utf8Module);

        packModule.fromVariable = function (packModule, ecode) {
            return function (obj, callbackfunc) {
                if (callbackfunc === undefined) return ecode.pack.fromVariable(obj);
                return ecode.pack.asyncFromVariable(obj, callbackfunc);
            }
        } (packModule, ecode);

        packModule.fromUint8Array = function (packModule, numberModule) {
            return function (arr) {
                var ilen, nlen, tlen, content, t;
                ilen = numberModule.fromArray("i32", arr);
                nlen = numberModule.fromArray("i32", arr, 4);
                tlen = arr.length - ilen - nlen - 8;
                t = new Uint8Array(ilen);
                t.set(arr.subarray(8, ilen + 8));
                content = { int: new Int32Array(t.buffer)};
                if (nlen > 0) {
                    t = new Uint8Array(nlen);
                    t.set(arr.subarray(ilen + 8, ilen + nlen + 8));
                    content.nums = new Float64Array(t.buffer);
                }
                if (tlen > 0) {
                    content.text = new Uint8Array(tlen);
                    content.text.set(arr.subarray(ilen + nlen + 8, arr.length));
                }
                t = null;
                return ecode.pack.getInstance(content);
            }
        } (packModule, numberModule);

        packModule.fromString = function (packModule, numberModule, stringModule) {
            return function (str) {
                var ilen, nlen, tlen, content, t;
                ilen = numberModule.fromString("i32", str);
                nlen = numberModule.fromString("i32", str, 4);
                tlen = arr.length - ilen - nlen - 8;
                t = stringModule.toUint8Array(str, 8, ilen);
                content = { int: new Int32Array(t.buffer)};
                if (nlen > 0) {
                    t = stringModule.toUint8Array(str, ilen + 8, nlen);
                    content.nums = new Float64Array(t.buffer);
                }
                if (tlen > 0) {
                    content.text = stringModule.toUint8Array(str, ilen + nlen + 8, tlen);
                }
                t = null;
                return ecode.pack.getInstance(content);
            }
        } (packModule, numberModule, stringModule);


        colorModule.nameToHex = function (name) {
            var t = {
                "aliceblue": "#f0f8ff",
                "antiquewhite": "#faebd7",
                "aqua": "#00ffff",
                "aquamarine": "#7fffd4",
                "azure": "#f0ffff",
                "beige": "#f5f5dc",
                "bisque": "#ffe4c4",
                "black": "#000000",
                "blanchedalmond": "#ffebcd",
                "blue": "#0000ff",
                "blueviolet": "#8a2be2",
                "brown": "#a52a2a",
                "burlywood": "#deb887",
                "cadetblue": "#5f9ea0",
                "chartreuse": "#7fff00",
                "chocolate": "#d2691e",
                "coral": "#ff7f50",
                "cornflowerblue": "#6495ed",
                "cornsilk": "#fff8dc",
                "crimson": "#dc143c",
                "cyan": "#00ffff",
                "darkblue": "#00008b",
                "darkcyan": "#008b8b",
                "darkgoldenrod": "#b8860b",
                "darkgray": "#a9a9a9",
                "darkgreen": "#006400",
                "darkkhaki": "#bdb76b",
                "darkmagenta": "#8b008b",
                "darkolivegreen": "#556b2f",
                "darkorange": "#ff8c00",
                "darkorchid": "#9932cc",
                "darkred": "#8b0000",
                "darksalmon": "#e9967a",
                "darkseagreen": "#8fbc8f",
                "darkslateblue": "#483d8b",
                "darkslategray": "#2f4f4f",
                "darkturquoise": "#00ced1",
                "darkviolet": "#9400d3",
                "deeppink": "#ff1493",
                "deepskyblue": "#00bfff",
                "dimgray": "#696969",
                "dodgerblue": "#1e90ff",
                "firebrick": "#b22222",
                "floralwhite": "#fffaf0",
                "forestgreen": "#228b22",
                "fuchsia": "#ff00ff",
                "gainsboro": "#dcdcdc",
                "ghostwhite": "#f8f8ff",
                "gold": "#ffd700",
                "goldenrod": "#daa520",
                "gray": "#808080",
                "green": "#008000",
                "greenyellow": "#adff2f",
                "honeydew": "#f0fff0",
                "hotpink": "#ff69b4",
                "indianred ": "#cd5c5c",
                "indigo": "#4b0082",
                "ivory": "#fffff0",
                "khaki": "#f0e68c",
                "lavender": "#e6e6fa",
                "lavenderblush": "#fff0f5",
                "lawngreen": "#7cfc00",
                "lemonchiffon": "#fffacd",
                "lightblue": "#add8e6",
                "lightcoral": "#f08080",
                "lightcyan": "#e0ffff",
                "lightgoldenrodyellow": "#fafad2",
                "lightgrey": "#d3d3d3",
                "lightgreen": "#90ee90",
                "lightpink": "#ffb6c1",
                "lightsalmon": "#ffa07a",
                "lightseagreen": "#20b2aa",
                "lightskyblue": "#87cefa",
                "lightslategray": "#778899",
                "lightsteelblue": "#b0c4de",
                "lightyellow": "#ffffe0",
                "lime": "#00ff00",
                "limegreen": "#32cd32",
                "linen": "#faf0e6",
                "magenta": "#ff00ff",
                "maroon": "#800000",
                "mediumaquamarine": "#66cdaa",
                "mediumblue": "#0000cd",
                "mediumorchid": "#ba55d3",
                "mediumpurple": "#9370d8",
                "mediumseagreen": "#3cb371",
                "mediumslateblue": "#7b68ee",
                "mediumspringgreen": "#00fa9a",
                "mediumturquoise": "#48d1cc",
                "mediumvioletred": "#c71585",
                "midnightblue": "#191970",
                "mintcream": "#f5fffa",
                "mistyrose": "#ffe4e1",
                "moccasin": "#ffe4b5",
                "navajowhite": "#ffdead",
                "navy": "#000080",
                "oldlace": "#fdf5e6",
                "olive": "#808000",
                "olivedrab": "#6b8e23",
                "orange": "#ffa500",
                "orangered": "#ff4500",
                "orchid": "#da70d6",
                "palegoldenrod": "#eee8aa",
                "palegreen": "#98fb98",
                "paleturquoise": "#afeeee",
                "palevioletred": "#d87093",
                "papayawhip": "#ffefd5",
                "peachpuff": "#ffdab9",
                "peru": "#cd853f",
                "pink": "#ffc0cb",
                "plum": "#dda0dd",
                "powderblue": "#b0e0e6",
                "purple": "#800080",
                "red": "#ff0000",
                "rosybrown": "#bc8f8f",
                "royalblue": "#4169e1",
                "saddlebrown": "#8b4513",
                "salmon": "#fa8072",
                "sandybrown": "#f4a460",
                "seagreen": "#2e8b57",
                "seashell": "#fff5ee",
                "sienna": "#a0522d",
                "silver": "#c0c0c0",
                "skyblue": "#87ceeb",
                "slateblue": "#6a5acd",
                "slategray": "#708090",
                "snow": "#fffafa",
                "springgreen": "#00ff7f",
                "steelblue": "#4682b4",
                "tan": "#d2b48c",
                "teal": "#008080",
                "thistle": "#d8bfd8",
                "tomato": "#ff6347",
                "turquoise": "#40e0d0",
                "violet": "#ee82ee",
                "wheat": "#f5deb3",
                "white": "#ffffff",
                "whitesmoke": "#f5f5f5",
                "yellow": "#ffff00",
                "yellowgreen": "#9acd32",
                "transparent": "#ffffff"
            };
            name = name.toLowerCase();
            if (name == "") name = "transparent";
            if (t[name] !== undefined) return t[name];
            return name;
        }

        /////////
        colorModule.hex2rgb = function (c) {
            if (c[0] === '#') c = c.substr(1);
            var r = parseInt(c.slice(0,2), 16),
            g = parseInt(c.slice(2,4), 16),
            b = parseInt(c.slice(4,6), 16);
            return {
                r: r,
                g: g,
                b: b
            }
        }

        stringModule.releaseDOMElement = function (stringModule, typeModule) {
            return function (element, options) {
                var children = [];
                var keys;
                var i, t, n;

                if ((options === undefined) || (options === null) || (!typeModule.isObject(options))) {
                    options = {};
                    keys = [];
                }
                else {
                    keys = Object.keys(options);
                }
                if (element.childNodes.length > 0) {
                    children = new Array(element.childNodes.length);
                    for (i = 0; i < element.childNodes.length; i++) {
                        children[i] = element.childNodes[element.childNodes.length - i - 1];
                    }
                }
                for (i = 0; i < children.length; i++) {
                    element.removeChild(children[i]);
                    if (children[i].revokeResource !== undefined) {
                    }
                }
                for (i = n = 0; i < keys.length; i++) {
                    if (element[keys[i]] !== undefined) {
                        t = element[keys[i]];
                        try {
                            delete element[keys[i]];
                            if ((element[keys[i]] === undefined) && typeModule.isObject(t) && typeModule.isFunction(options[keys[i]])) {
                                keys[n++] = {
                                    data: t,
                                    func: options[keys[i]]
                                };
                            }
                        }
                        catch (e) {
                        }
                    }
                }
                for (i = 0; i < n; i++) {
                    try {
                        keys[i].func(keys[i].data);
                    }
                    catch (e) {
                    }
                }
                keys = null;
                for (i = 0; i < children.length; i++) {
                    stringModule.releaseDOMElement(children[i], options);
                }
                options = null;
                children = null;
            }
        }

        stringModule.releaseObject = function (stringModule, typeModule) {
            return function (obj, options) {
                var i, t, keys, n;
                var m_DOMList = [];
                var recursive = false, removeDOM = true;
                if ((options === undefined) || (options === null) || (!typeModule.isObject(options))) {
                    options = {
                        recursive: false,
                        removeDOM: false
                    };
                }
                if (options.recursive !== undefined) recursive = options.recursive;
                if (options.removeDOM !== undefined) removeDOM = options.removeDOM;
                if (typeModule.isArray(obj) || typeModule.isObject(obj)) {
                    try {
                        keys = Object.keys(obj);
                    }
                    catch (e) {
                        keys = [];
                    }
                    for (i = n = 0; i < keys.length; i++) {
                        h = keys[i];
                        t = obj[h];
                        try {
                            delete obj[h];
                            if (obj[h] === undefined) {
                                if (typeModule.isArray(t) || typeModule.isObject(t)) {
                                    if ((t.tagName !== undefined) && (t.textContent !== undefined) && (t.innerHTML !== undefined) && (t.outerHTML !== undefined)) {
                                        if (removeDOM === true) {
                                            m_DOMList.push(t);
                                        }
                                    }
                                    else if (recursive === true) {
                                        keys[n++] = t;
                                    }
                                }
                            }

                        }
                        catch (e) {
                        }
                    }
                    for (i = 0; i < n; i++) {
                        stringModule.releaseObject(keys[i], options);
                    }
                    keys = null;
                    if (removeDOM === true) {
                        for (i = 0; i < m_DOMList.length; i++) {
                            stringModule.releaseDOMElement(m_DOMList[i], {});
                        }
                    }
                    m_DOMList = null;
                }
            }
        } (stringModule, typeModule);

        stringModule.substr = function (stringModule) {
            return function (str, start, length) {
                var r = [], buffer;
                var i, end, ilen;
                if (length === undefined) length = str.length;
                if (start === undefined) start = 0;
                if (start + length > str.length) length = str.length - start;
                if (length <= 0) return "";
                end = start + length;
                while (start < end) {
                    ilen = end - start;
                    if (ilen > 1024) ilen = 1024;
                    buffer = Array.from(str.substr(start, ilen), c => c.charCodeAt());
                    r.push(String.fromCharCode.apply(null, buffer));
                    start += ilen;
                }
                return EncodingClass.string.merge(r);
            }
        } (stringModule);

        stringModule.xor = function (stringModule) {
            return function (str, xorFunc, start, length) {
                var i, r;
                if (start === undefined) start = 0;
                if (length === undefined) length = str.length;
                if (start + length > str.length) length = str.length - start;
                if (length > 0) {
                    r = new Uint8Array(length);
                    for (i = 0; i < length; i++) {
                        r[i] = (str.charCodeAt(start++) ^ xorFunc(256)) & 0xFF;
                    }
                    return stringModule.fromUint8Array(r);
                }
                return "";
            }
        } (stringModule);

        stringModule.toUint8Array = function (str, start, length) {
            var i, r;
            if (length === undefined) length = str.length;
            if (start === undefined) start = 0;
            if (start + length > str.length) {
                length = str.length - start;
            }
            if (length > 0) {
                r = Uint8Array.from(str.substr(start, length), c => (c.charCodeAt() & 0xFF));
                return r;
            }
            else {
                return new Uint8Array(0);
            }
        };

        stringModule.fromUint8Array = function (arr, start, length) {
            var r = [], ts;
            if (start === undefined) start = 0;
            if (length === undefined) length = arr.length;
            if (start + length > arr.length) length = arr.length - start;
            while (length > 0) {
                if (length > 1024) {
                    ts = 1024;
                }
                else {
                    ts = length;
                }
                r.push(String.fromCharCode.apply(null, arr.subarray(start, start + ts)));
                start += ts;
                length -= ts;
            }
            if (r.length == 0) return "";
            return EncodingClass.string.merge(r);
        }

        stringModule.merge = function (stringArray) {
            var i, k, x, t, fs, flen;
            if (stringArray.length == 0) return "";
            while (stringArray.length > 1) {
                if (stringArray.length <= 128) {
                    stringArray = ["".concat(...stringArray)];
                }
                else {
                    x = [];
                    fs = 0;
                    while (fs < stringArray.length) {
                        flen = stringArray.length - fs;
                        if (flen > 128) flen = 128;
                        x.push("".concat(...(stringArray.slice(fs, fs + flen))));
                        fs += flen;
                    }
                    stringArray = x;
                }
            }
            return stringArray[0];
        }

        stringModule.cvtest = function (varname) {
            var sx, st;
            eval("sx = stringModule.fromVariable(" + varname + ");");
            st = "Length = " + sx.length;
            console.log(st);
            console.log(sx);
            st = stringModule.toVariable(sx);
            console.log(st);
        }

        stringModule.exportVariable = function (typeModule, stringModule) {
            return function (obj, level) {
                var i, k, n, x, z, ch, st, sx, keys, ok;
                if (obj === undefined) return "undefined";
                if (obj == null) return "null";
                if (level === undefined) level = 0;
                if (typeModule.isArray(obj)) {
                    n = obj.length;
                    if (n == 0) return "[]";
                    st = "[\r\n";
                    for (i = 0; i < n; i++) {
                        for (k = 0; k < level+4; k++) st += " ";
                        st += stringModule.exportVariable(obj[i], level + 4);
                        if (i+1 < n) st += ",";
                        st += "\r\n";
                    }
                    for (k = 0; k < level; k++) st += " ";
                    return st + "]";
                }
                else if (typeModule.isDate(obj)) {
                    return "new Date(" + obj.getTime() + ")";
                }
                else if (typeModule.isObject(obj)) {
                    keys = Object.keys(obj);
                    n = keys.length;
                    st = ["{\r\n"];
                    for (i = 0; i < n; i++) {
                        sx = "";
                        for (k = 0; k < level+4; k++) sx += " ";
                        st.push(sx);
                        ch = keys[i].substr(1);
                        ok = false;
                        if (("a" <= ch) && (ch <= "z")) ok = true;
                        if (("A" <= ch) && (ch <= "Z")) ok = true;
                        if (ch == "_") ok = true;
                        if (ok) {
                            st.push(keys[i] + ": ");
                        }
                        else {
                            st.push("\"" + stringModule.addslashes(keys[i]) + "\": ");
                        }
                        st.push(stringModule.exportVariable(obj[keys[i]], level + 4));
                        if (i+1 < n) st.push(",");
                        st.push("\r\n");
                    }
                    sx = "";
                    for (k = 0; k < level; k++) sx += " ";
                    st.push(sx + "}");
                    return stringModule.merge(st);
                }
                else if (typeModule.isFunction(obj)) {
                    return obj.toString();
                }
                else if (typeModule.isBoolean(obj)) {
                    if (obj) return "true";
                    return "false";
                }
                else if (typeModule.isNumber(obj)) {
                    return obj;
                }
                else if (typeModule.isString(obj)) {
                    st = "";
                    n = obj.length;
                    for (i = 0; i < n; i++) {
                        k = obj.substr(i, 1);
                        switch (k) {
                            case "\\":
                                st += "\\\\";
                                break;
                            case "\"":
                                st += "\\\"";
                                break;
                            case "\r":
                                st += "\\r";
                                break;
                            case "\n":
                                st += "\\n";
                                break;
                            case "\t":
                                st += "\\t";
                                break;
                            default:
                                st += k;
                        }
                    }
                    return "\"" + st + "\"";
                }
                else {
                    return "unknown";
                }
            }
        } (typeModule, stringModule);

        stringModule.datecompare = function (stringModule) {
            return function (date1, date2) {
                var mode1, mode2, k;
                if (!(date1 instanceof Date)) return stringModule.compare(date1, date2);
                if (!(date2 instanceof Date)) return stringModule.compare(date1, date2);
                if (date1 instanceof Date2) {
                    mode1 = date1.mode;
                }
                else {
                    mode1 = "live";
                }
                if (date2 instanceof Date2) {
                    mode2 = date2.mode;
                }
                else {
                    mode2 = "live";
                }
                if ((mode1 == "live") && (mode2 == "live")) return stringModule.compare(date1.getTime(), date2.getTime());
                k = stringModule.compare(date1.getFullYear(), date2.getFullYear());
                if (k == 0) k = stringModule.compare(date1.getMonth(), date2.getMonth());
                if (k == 0) k = stringModule.compare(date1.getDate(), date2.getDate());
                if ((k != 0) || (mode1 == "date") || (mode2 == "date")) return k;
                k = stringModule.compare(date1.getHours(), date2.getHours());
                if (k == 0) k = stringModule.compare(date1.getMinutes(), date2.getMinutes());
                return k;
            }
        } (stringModule);

        stringModule.compare = function (typeModule, stringModule) {
            return function (obj1, obj2) {
                var i, k, m, n, x, z, keys, keys2;
                if ((obj1 === undefined) && (obj2 === undefined)) return 0;
                if (obj1 === undefined) return -1;
                if (obj2 === undefined) return 1;
                if ((obj1 === null) && (obj2 === null)) return 0;
                if (obj1 === null) return -1;
                if (obj2 === null) return 1;
                if (typeModule.isArray(obj1) && typeModule.isArray(obj2)) {
                    n = obj1.length;
                    m = obj2.length;
                    for (i = 0; i < n; i++) {
                        if (i >= m) return 1;
                        k = stringModule.compare(obj1[i], obj2[i]);
                        if (k != 0) return k;
                    }
                    if (n < m) return -1;
                    return 0;
                }
                else if (typeModule.isDate(obj1) && typeModule.isDate(obj2)) {
                    return stringModule.datecompare(obj1, obj2);
                }
                else if (typeModule.isDate(obj1)) {
                    return stringModule.compare(obj1.getTime(), obj2);
                }
                else if (typeModule.isDate(obj2)) {
                    return stringModule.compare(obj1, obj2.getTime());
                }
                else if (obj1 instanceof Geometry) {
                    return stringModule.compare(obj1.getData(), obj2);
                }
                else if (obj2 instanceof Geometry) {
                    return stringModule.compare(obj1, obj2.getData());
                }
                else if (typeModule.isObject(obj1) && typeModule.isObject(obj2)) {
                    keys = Object.keys(obj1);
                    n = keys.length;
                    keys2 = Object.keys(obj2);
                    m = keys2.length;
                    keys.sort();
                    keys2.sort();
                    for (i = 0; i < n; i++) {
                        if (i >= m) return 1;
                        k = stringModule.compare(keys[i], keys2[i]);
                        if (k != 0) return k;
                        k = stringModule.compare(obj1[keys[i]], obj2[keys2[i]]);
                        if (k != 0) return k;
                    }
                    if (n < m) return -1;
                    return 0;
                }
                else if (typeModule.isObject(obj1) && typeModule.isArray(obj2)) {
                    keys = Object.keys(obj1);
                    n = keys.length;
                    keys.sort();
                    m = obj2.length;
                    for (i = 0; i < n; i++) {
                        if (i >= m) return 1;
                        k = stringModule.compare(obj1[keys[i]], obj2[i]);
                        if (k != 0) return k;
                    }
                    if (n < m) return -1;
                    return 0;
                }
                else if (typeModule.isArray(obj1) && typeModule.isObject(obj2)) {
                    n = obj1.length;
                    keys2 = Object.keys(obj2);
                    m = keys2.length;
                    keys2.sort();
                    for (i = 0; i < n; i++) {
                        if (i >= m) return 1;
                        k = stringModule.compare(obj1[i], obj2[keys2[i]]);
                        if (k != 0) return k;
                    }
                    if (n < m) return -1;
                    return 0;
                }
                else if (typeModule.isArray(obj1)) {
                    if (obj1.length == 0) return -1;
                    k = typeModule.compare(obj1[0], obj2);
                    if (k != 0) return k;
                    if (obj1.length > 0) return 1;
                    return 0;
                }
                else if (typeModule.isArray(obj2)) {
                    if (obj2.length == 0) return 1;
                    k = stringModule.compare(obj1, obj2[0]);
                    if (k != 0) return k;
                    if (obj2.length > 0) return -1;
                    return 0;
                }
                else if (typeModule.isObject(obj1)) {
                    keys = Object.keys(obj1);
                    if (keys.length == 0) return -1;
                    keys.sort();
                    k = stringModule.compare(obj1[keys[0]], obj2);
                    if (k != 0) return k;
                    if (keys.length > 0) return 1;
                    return 0;
                }
                else if (typeModule.isObject(obj2)) {
                    keys = Object.keys(obj2);
                    if (keys.length == 0) return 1;
                    keys.sort();
                    k = stringModule.compare(obj1, obj2[keys[0]]);
                    if (k != 0) return k;
                    if (keys.length > 0) return -1;
                    return 0;
                }
                else if (typeModule.isBoolean(obj1)) {
                    if (obj1) {
                        return stringModule.compare(1, obj2);
                    }
                    else {
                        return stringModule.compare(0, obj2);
                    }
                }
                else if (typeModule.isBoolean(obj2)) {
                    if (obj2) {
                        return stringModule.compare(obj1, 1);
                    }
                    else {
                        return stringModule.compare(obj1, 0);
                    }
                }
                else if (typeModule.isNumber(obj1) && typeModule.isNumber(obj2)) {
                    if (obj1 < obj2) return -1;
                    if (obj1 > obj2) return 1;
                    return 0;
                }
                else if (typeModule.isFunction(obj1)) {
                    return  stringModule.compare(obj1.toString(), obj2);
                }
                else if (typeModule.isFunction(obj2)) {
                    return  stringModule.compare(obj1, obj2.toString());
                }
                else if (typeModule.isString(obj1) && typeModule.isString(obj2)) {
                    if (obj1 < obj2) return -1;
                    if (obj1 > obj2) return 1;
                    return 0;
                }
                else if (typeModule.isString(obj1)) {
                    return  stringModule.compare(obj1, obj2.toString());
                }
                else if (typeModule.isString(obj2)) {
                    return  stringModule.compare(obj1.toString(), obj2);
                }
                return stringModule.compare(obj1.toString(), obj2.toString());
            }
        } (typeModule, stringModule);

        stringModule.duplicateObject = function (obj) {
            var r, keys, i;
            if (EncodingClass.type.isArray(obj)) {
                r = [];
            }
            else {
                r = {};
            }
            keys = Object.keys(obj);
            for (i = 0; i < keys.length; i++) {
                r[keys[i]] = obj[keys[i]];
            }
            return r;
        };

        stringModule.duplicate = function (typeModule, stringModule) {
            return function (obj) {
                var i, n, m, x, z, st, sx, keys, ss;
                if (obj === undefined) return undefined;
                if (obj === null) return null;
                if (typeModule.isArray(obj)) {
                    n = obj.length;
                    st = [];
                    for (i = 0; i < n; i++) {
                        st.push(stringModule.duplicate(obj[i]));
                    }
                    return st;
                }
                else if (obj instanceof Geometry) {
                    return Geometry.fromData(obj.getData());
                }
                else if (typeModule.isDate(obj)) {
                    return new Date(obj.getTime());
                }
                else if (typeModule.isObject(obj)) {
                    keys = Object.keys(obj);
                    n = keys.length;
                    st = {};
                    for (i = 0; i < n; i++) {
                        st[keys[i]] = stringModule.duplicate(obj[keys[i]]);
                    }
                    return st;
                }
                else if (typeModule.isFunction(obj)) {
                    return obj;
                }
                else if (typeModule.isBoolean(obj)) {
                    if (obj) {
                        return true;
                    }
                    else {
                        return false;
                    }
                }
                else if (typeModule.isNumber(obj)) {
                    return obj;
                }
                else if (typeModule.isString(obj)) {
                    return stringModule.substr(obj, 0);
                }
                return obj;
            }
        } (typeModule, stringModule);

        stringModule.fromVariable = function (typeModule, base64Module, stringModule) {
            return function (obj) {
                var i, n, x, z, st, sx, sy, keys, ss;
                if (obj === undefined) return "undefined#";
                if (obj == null) return "null#";
                if (typeModule.isArray(obj)) {
                    n = obj.length;
                    st = ["array#" + n + "#"];
                    for (i = 0; i < n; i++) {
                        sx = stringModule.fromVariable(obj[i]);
                        st.push(sx.length + "#" + sx);
                    }
                    return stringModule.merge(st);
                }
                else if (obj instanceof Geometry) {
                    st = stringModule.fromVariable(obj.getData());
                    st = base64Module.encode(st);
                    return "geometry#" + st.length + "#" + st;
                }
                else if (typeModule.isDate(obj)) {
                    let tobj = obj.getTime();
                    if (obj instanceof Date2) {
                        if (obj.mode == "date") {
                            sx = base64Module.encode(tobj + "");
                            sx += obj.getFullYear();
                            if (obj.getMonth() < 9) {
                                sx += "0" + (obj.getMonth() + 1);
                            }
                            else {
                                sx += obj.getMonth() + 1;
                            }
                            if (obj.getDate() < 10) {
                                sx += "0" + obj.getDate();
                            }
                            else {
                                sx += obj.getDate();
                            }
                            return "date2b#" + sx.length + "#" + sx;
                        }
                        else if (obj.mode == "datetime") {
                            sx = base64Module.encode(tobj + "");
                            sx += obj.getFullYear();
                            if (obj.getMonth() < 9) {
                                sx += "0" + (obj.getMonth() + 1);
                            }
                            else {
                                sx += obj.getMonth() + 1;
                            }
                            if (obj.getDate() < 10) {
                                sx += "0" + obj.getDate();
                            }
                            else {
                                sx += obj.getDate();
                            }
                            if (obj.getHours() < 10) {
                                sx += "0" + obj.getHours();
                            }
                            else {
                                sx += obj.getHours();
                            }
                            if (obj.getMinutes() < 10) {
                                sx += "0" + obj.getMinutes();
                            }
                            else {
                                sx += obj.getMinutes();
                            }
                            return "date2c#" + sx.length + "#" + sx;
                        }
                    }
                    sx = base64Module.encode(tobj + "");
                    x = obj.getTimezoneOffset() * (-60);
                    if (x < 0) {
                        sx += "-";
                        x = -x;
                    }
                    else {
                        sx += "+";
                    }
                    x = x + "";
                    while (x.length < 5) x = "0" + x;
                    sx += x;
                    return "date2a#" + sx.length + "#" + sx;
                }
                else if (typeModule.isObject(obj)) {
                    keys = Object.keys(obj);
                    n = keys.length;
                    st = [];
                    for (i = 0; i < n; i++) {
                        sx = base64Module.encode(keys[i]);
                        st.push(sx.length + "#" + sx);
                        sx = stringModule.fromVariable(obj[keys[i]]);
                        st.push(sx.length + "#" + sx);
                    }
                    return "obj#" + n + "#" + stringModule.merge(st);
                }
                else if (typeModule.isFunction(obj)) {
                    sx = base64Module.encode(utf8Module.encode(obj.toString() + ""));
                    return "function#" + sx.length + "#" + sx;
                }
                else if (typeModule.isBoolean(obj)) {
                    if (obj) {
                        st = "1";
                    }
                    else {
                        st = "0";
                    }
                    return "bool#" + st;
                }
                else if (typeModule.isNumber(obj)) {
                    sx = base64Module.encode(obj + "");
                    return "number#" + sx.length + "#" + sx;
                }
                else if (typeModule.isString(obj)) {
                    sx = base64Module.encode(utf8Module.encode(obj));
                    return "string#" + sx.length + "#" + sx;
                }
                else {
                    return "unknown#";
                }
            }
        } (typeModule, base64Module, stringModule);

        stringModule.toVariable = function (base64Module, utf8Module, stringModule) {
            return function (str) {
                var i, j, k, t, x, n, m, z, r, sx, st, kv;
                if (str === undefined) return undefined;
                k = str.indexOf("#");
                if (k <= 0) return undefined;
                st = str.substr(0, k);
                str = str.substr(k + 1);
                switch (st) {
                    case "null":
                        return null;
                    case "geometry":
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        sx = str.substr(0, k);
                        str = str.substr(k + 1);
                        str = base64Module.decode(str);
                        str = stringModule.toVariable(str);
                        return Geometry.fromData(str);
                    case "string":
                    case "number":
                    case "date":
                    case "date2a":
                    case "date2b":
                    case "date2c":
                    case "function":
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        sx = str.substr(0, k);
                        str = str.substr(k + 1);
                        if (st == "date") return new Date(parseInt(base64Module.decode(str), 10));
                        if (st == "date2a") {
                            let n = str.length - 6;
                            return new Date2(parseInt(base64Module.decode(str.substr(0, n)), 10));
                        }
                        if (st == "date2b") {
                            let n = str.length - 8;
                            x = new Date2(parseInt(base64Module.decode(str.substr(0, n)), 10));
                            x.mode = "date";
                            x.setDate(1);
                            x.setMonth(0);
                            x.setFullYear(parseInt(str.substr(n, 4)));
                            x.setMonth(parseInt(str.substr(n + 4, 2)) - 1);
                            x.setDate(parseInt(str.substr(n + 6, 2)));
                            return x;
                        }
                        if (st == "date2c") {
                            let n = str.length - 12;
                            x = new Date2(parseInt(base64Module.decode(str.substr(0, n)), 10));
                            x.mode = "datetime";
                            x.setDate(1);
                            x.setMonth(0);
                            x.setFullYear(parseInt(str.substr(n, 4)));
                            x.setMonth(parseInt(str.substr(n + 4, 2)) - 1);
                            x.setDate(parseInt(str.substr(n + 6, 2)));
                            x.setHours(parseInt(str.substr(n + 8, 2)));
                            x.setMinutes(parseInt(str.substr(n + 10, 2)));
                            return x;
                        }
                        if (st == "number") return parseFloat(base64Module.decode(str));
                        sx = utf8Module.decode(base64Module.decode(str));
                        if (st == "string") return stringModule.substr(sx, 0);
                        return (new Function("return " + sx))();
                    case "sarray":
                        r = [];
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        n = parseInt(str.substr(0, k), 10);
                        str = str.substr(k + 1);
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        m = parseInt(str.substr(0, k), 10);
                        str = str.substr(k + 1);
                        kv = [];
                        for (i = 0; i < m; i++) {
                            k = str.indexOf("#");
                            if (k <= 0) return undefined;
                            j = parseInt(str.substr(0, k), 10);
                            kv.push(stringModule.substr(str, k + 1, j));
                            str = str.substr(k + j + 1);
                        }
                        for (i = 0; i < n; i++) {
                            t = {};
                            for (j = 0; j < m; j++) {
                                k = str.indexOf("#");
                                if (k <= 0) return undefined;
                                z = parseInt(str.substr(0, k), 10);
                                x = str.substr(k + 1, z);
                                str = str.substr(k + z + 1);
                                t[kv[j]] = stringModule.toVariable(x);
                            }
                            r.push(t);
                        }
                        return r;
                    case "array":
                        r = [];
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        n = parseInt(str.substr(0, k), 10);
                        str = str.substr(k + 1);
                        for (i = 0; i < n; i++) {
                            k = str.indexOf("#");
                            if (k <= 0) return undefined;
                            z = parseInt(str.substr(0, k), 10);
                            x = str.substr(k + 1, z);
                            str = str.substr(k + z + 1);
                            r.push(stringModule.toVariable(x));
                        }
                        return r;
                    case "obj":
                        r = {};
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        n = parseInt(str.substr(0, k), 10);
                        str = str.substr(k + 1);
                        for (i = 0; i < n; i++) {
                            k = str.indexOf("#");
                            if (k <= 0) return undefined;
                            z = parseInt(str.substr(0, k), 10);
                            x = str.substr(k + 1, z);
                            str = str.substr(k + z + 1);
                            kv = base64Module.decode(x);
                            k = str.indexOf("#");
                            if (k <= 0) return undefined;
                            z = parseInt(str.substr(0, k), 10);
                            x = str.substr(k + 1, z);
                            str = str.substr(k + z + 1);
                            r[kv] = stringModule.toVariable(x);
                        }
                        return r;
                    case "obj2":
                        r = {};
                        k = str.indexOf("#");
                        if (k <= 0) return undefined;
                        n = parseInt(str.substr(0, k), 10);
                        str = str.substr(k + 1);
                        for (i = 0; i < n; i++) {
                            k = str.indexOf("#");
                            if (k <= 0) return undefined;
                            z = parseInt(str.substr(0, k), 10);
                            x = str.substr(k + 1, z);
                            str = str.substr(k + z + 1);
                            kv = base64Module.decode(x);
                            k = str.indexOf("#");
                            if (k <= 0) return undefined;
                            z = parseInt(str.substr(0, k), 10);
                            x = str.substr(k + 1, z);
                            str = str.substr(k + z + 1);
                            r[kv] = stringModule.toVariable(x);
                        }
                        return r;
                    case "bool":
                        if (str == "1") return true;
                        if (str == "0") return false;
                    case "undefined":
                    case "unknown":
                    default:
                        return undefined;
                };
            }
        } (base64Module, utf8Module, stringModule);

        stringModule.fromDouble = function (value, precision) {
            var s, d, k, sign;
            if (precision === undefined) precision = -3;
            if (precision < 0) {
                if (value >= 0) {
                    sign = "";
                }
                else {
                    sign = "-";
                    value = -value;
                }
                s = value.toFixed(-precision) + "";
                k = s.indexOf(".");
                if (k >= 0) {
                    d = s.substr(0, k);
                    s = s.substr(k+1);
                    while (s != "") {
                        k = s.length - 1;
                        if (s.substr(k, 1) == "0") {
                            s = s.substr(0, k - 1);
                        }
                        else {
                            break;
                        }
                    }
                    if (s == "") return d;
                    return sign + d + "." + s;
                }
                return sign + s;
            }
            if (value >= 0) return value.toFixed(precision);
            return "-" + (-value).toFixed(precision);
        }

        stringModule.addslashes = function (stringModule) {
            return function (str) {
                if (true) {
                    str = JSON.stringify(String(str));
                    return stringModule.substr(str, 1, str.length-2);
                }
                else {
                    return str.replace(/\\/g, '\\\\').
                        replace(/\u0008/g, '\\b').
                        replace(/\t/g, '\\t').
                        replace(/\n/g, '\\n').
                        replace(/\f/g, '\\f').
                        replace(/\r/g, '\\r').
                        replace(/'/g, '\\\'').
                        replace(/"/g, '\\"');
                }
            }
        } (stringModule);

        stringModule.readln = function (str) {
            var k = str.indexOf("\n");
            if (k == -1) return {
                result: str,
                remain: ""
            }
            return {
                result: str.substr(0, k),
                remain: str.substr(k+1)
            }
        }

        stringModule.readlnInt = function (stringModule) {
            return function (str) {
                var t = stringModule.readln(str);
                return {
                    result: parseInt(t.result, 10),
                    remain: t.remain
                }
            }
        } (stringModule);

        stringModule.readlnHex = function (stringModule) {
            return function (str) {
                var t = stringModule.readln(str);
                return {
                    result: parseInt(t.result, 16),
                    remain: t.remain
                }
            }
        } (stringModule);

        stringModule.readlnFloat = function (stringModule) {
            return function (str) {
                var t = stringModule.readln(str);
                return {
                    result: parseFloat(t.result, 10),
                    remain: t.remain
                }
            }
        } (stringModule);

        stringModule.toHex = function (number, width) {
            var i, t, h;
            if (width === undefined) width = 0;
            t = number.toString(16);
            if (width == 0) return t;
            h = t.length;
            if (width > 0) {
                for (i = h; i < width; i++) {
                    t = "0" + t;
                }
                return t;
            }
            else {
                width = -width;
                if (h <= width) {
                    for (i = h; i < width; i++) {
                        t = "0" + t;
                    }
                    return t;
                }
                else {
                    return t.substr(width - h);
                }
            }
        }

        stringModule.fromHex = function (str) {
            return parseInt(str, 16);
        }

        stringModule.getStringLine = function (st) {
            var k;
            k = st.indexOf("\n");
            if (k == -1) return {
                result: st,
                remain: null
            };
            return {
                result: st.substr(0, k),
                remain: st.substr(k+1)
            };
        }

        stringModule.getBase64StringLine = function (base64Module, utf8Module) {
            return function (st) {
                var k;
                k = st.indexOf("\n");
                if (k == -1) return {
                    result: utf8Module.decode(base64Module.decode(st)),
                    remain: null
                };
                return {
                    result: utf8Module.decode(base64Module.decode(st.substr(0, k))),
                    remain: st.substr(k+1)
                };
            }
        } (base64Module, utf8Module);

        stringModule.innerHTML2Text = function (st) {
            var x = document.createElement("div");
            x.innerHTML = st;
            if (x.textContent !== undefined) return x.textContent;
            if (x.innerText !== undefined) return x.innerText;
            return "";
        }

        utf8Module.encode = function (typeModule) {
            return function (sx) {
                var i, k, x;
                var buffer, target = [];
                if (!typeModule.isString(sx)) sx = sx + "";
                if (sx.length < 256) {
                    buffer = new Array(sx.length * 4);
                }
                else {
                    buffer = new Array(1024);
                }
                for (i = k = 0; i < sx.length; i++) {
                    x = sx.charCodeAt(i);
                    if (x <= 0x7f) {
                        buffer[k++] = x;
                    }
                    else if (x <= 0x7FF) {
                        buffer[k++] = 192 + (x >> 6);
                        buffer[k++] = 128 + (x & 0x3f);
                    }
                    else if (x <= 0xFFFF) {
                        buffer[k++] = 224 + (x >> 12);
                        buffer[k++] = 128 + ((x >> 6) & 0x3f);
                        buffer[k++] = 128 + (x & 0x3f);
                    }
                    else {
                        buffer[k++] = 240 + (x >> 18);
                        buffer[k++] = 128 + ((x >> 12) & 0x3f);
                        buffer[k++] = 128 + ((x >> 6) & 0x3f);
                        buffer[k++] = 128 + (x & 0x3f);
                    }
                    if (k >= 1020) {
                        target.push(String.fromCharCode.apply(null, buffer.slice(0, k)));
                        if (target.length == 128) target = ["".concat(...target)];
                        k = 0;
                    }
                }
                if (k > 0) target.push(String.fromCharCode.apply(null, buffer.slice(0, k)));
                return "".concat(...target);
            }
        } (typeModule);

        utf8Module.encodeu8 = function (sx) {
            return (new TextEncoder()).encode(sx);
        }

        utf8Module.decode = function (typeModule) {
            return function (sx) {
                var i, k, x, m, target = [], buffer = new Array(1024);
                if (!typeModule.isString(sx)) sx = sx + "";
                for (i = k = 0; i < sx.length; i++) {
                    x = sx.charCodeAt(i);
                    if (x >= 240) {
                        m = x & 0x7;
                        x = sx.charCodeAt(++i);
                        m = (m << 6) + (x & 0x3F);
                        x = sx.charCodeAt(++i);
                        m = (m << 6) + (x & 0x3F);
                        x = sx.charCodeAt(++i);
                        m = (m << 6) + (x & 0x3F);
                        buffer[k++] = m;
                    }
                    else if (x >= 224) {
                        m = x & 0xF;
                        x = sx.charCodeAt(++i);
                        m = (m << 6) + (x & 0x3F);
                        x = sx.charCodeAt(++i);
                        m = (m << 6) + (x & 0x3F);
                        buffer[k++] = m;
                    }
                    else if (x >= 192) {
                        m = x & 0x1F;
                        x = sx.charCodeAt(++i);
                        m = (m << 6) + (x & 0x3F);
                        buffer[k++] = m;
                    }
                    else {
                        buffer[k++] = x;
                    }
                    if (k == 1024) {
                        target.push(String.fromCharCode.apply(null, buffer));
                        if (target.length == 128) target = ["".concat(...target)];
                        k = 0;
                    }
                }
                if (k > 0) target.push(String.fromCharCode.apply(null, buffer.slice(0, k)));
                return "".concat(...target);
            }
        } (typeModule);

        utf8Module.decodeU8 = function (buffer) {
            return (new TextDecoder()).decode(buffer);
        }

        base64Module.encode = function (st) {
            var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
            var i, j, k, x, sx, v1, v2, v3, t1, t2, t3, t4;
            try {
                return btoa(st);
            }
            catch (e) {
                console.log("invalid string", e, st);
            }
            sx = "";
            x = st.length;
            for (i = 0; i + 3 <= x; ) {
                v1 = st.charCodeAt(i++) & 255;
                v2 = st.charCodeAt(i++) & 255;
                v3 = st.charCodeAt(i++) & 255;
                t1 = v1 >> 2;
                t2 = ((v1 & 3) << 4) + (v2 >> 4);
                t3 = ((v2 & 15) << 2) + (v3 >> 6);
                t4 = v3 & 63;
                sx += keyStr.substr(t1, 1) + keyStr.substr(t2, 1) + keyStr.substr(t3, 1) + keyStr.substr(t4, 1);
            }
            if (i + 1 == x) {
                v1 = st.charCodeAt(i++) & 255;
                t1 = v1 >> 2;
                t2 = (v1 & 3) << 4;
                sx += keyStr.substr(t1, 1) + keyStr.substr(t2, 1) + "==";
            }
            else if (i + 2 == x) {
                v1 = st.charCodeAt(i++) & 255;
                v2 = st.charCodeAt(i++) & 255;
                t1 = v1 >> 2;
                t2 = ((v1 & 3) << 4) + (v2 >> 4);
                t3 = (v2 & 15) << 2;
                sx += keyStr.substr(t1, 1) + keyStr.substr(t2, 1) + keyStr.substr(t3, 1) + "=";
            }
            return sx;
        }

        base64Module.chartovalue = function (c) {
            if ((65 <= c) && (c <= 90)) return c - 65;
            if ((97 <= c) && (c <= 122)) return c + 26 - 97;
            if ((48 <= c) && (c <= 57)) return c + 52 - 48;
            if (c == 43) return 62;
            if (c == 47) return 63;
            return 64;
        }

        base64Module.decodeu8 = function (base64Module, stringModule) {
            return function (st, start, length) {
                return stringModule.toUint8Array(base64Module.decode(stringModule.fromUint8Array(st, start, length)));
                /*
                var i, j, k, x, sx, tag;
                var t1, t2, t3, t4;
                var v1, v2, v3;
                if (start === undefined) start = 0;
                if (length === undefined) length = st.length - start;
                if (start + length > st.length) length = st.length - start;
                x = start + length;
                if (length <= 0) return new Uint8Array(0);
                var rawdec = function (a, b, c, d) {
                    t1 = base64Module.chartovalue(a);
                    t2 = base64Module.chartovalue(b);
                    t3 = base64Module.chartovalue(c);
                    t4 = base64Module.chartovalue(d);
                    if (t3 == 64) {
                        v1 = (t1 << 2) + (t2 >> 4);
                    }
                    else if (t4 == 64) {
                        v1 = (t1 << 2) + (t2 >> 4);
                        v2 = ((t2 & 15) << 4) + (t3 >> 2);
                    }
                    else {
                        v1 = (t1 << 2) + (t2 >> 4);
                        v2 = ((t2 & 15) << 4) + (t3 >> 2);
                        v3 = ((t3 & 3) << 6) + t4;
                    }
                }
                var decode4 = function () {
                    if (t3 == 64) {
                        return [v1];
                    }
                    else if (t4 == 64) {
                        return [v1, v2];
                    }
                    else {
                        return [v1, v2, v3];
                    }
                }
                if ((length % 4) == 0) {
                    tag = [];
                }
                else if ((length % 4) == 3) {
                    rawdec(st[x - 3], st[x - 2], st[x - 1], 61);
                    tag = decode4();
                }
                else if ((length % 4) == 2) {
                    rawdec(st[x - 2], st[x - 1], 61, 61);
                    tag = decode4();
                }
                else {
                    rawdec(st[x - 1], 65, 61, 61);
                    tag = decode4();
                }
                sx = new Uint8Array((~~(length / 4)) * 3 + tag.length);
                for (i = 0; i < tag.length; i++) {
                    sx[sx.length - tag.length + i] = tag[i];
                }
                k = 0;
                for (i = 0; i < length; i += 4) {
                    if (i + 3 >= length) break;
                    rawdec(st[start + i], st[start + i + 1], st[start + i + 2], st[start + i + 3]);
                    sx[k++] = v1;
                    sx[k++] = v2;
                    sx[k++] = v3;
                }
                if (k != sx.length) {
                    console.log("incorrect decode u8 size", k, sx.length);
                }
                return sx;
                */
            }
        } (base64Module, stringModule);

        base64Module.decode = function (base64Module) {
            return function (st) {
                var i, j, k, x, sx, v1, v2, v3, t1, t2, t3, t4;
                try {
                    sx = atob(st);
                    return sx;
                }
                catch (e) {
                    console.log("invalid base64 string", e, st);
                }
                sx = "";
                x = st.length;
                for (i = 0; i < x; ) {
                    t1 = base64Module.chartovalue(st.charCodeAt(i++));
                    t2 = base64Module.chartovalue(st.charCodeAt(i++));
                    t3 = base64Module.chartovalue(st.charCodeAt(i++));
                    t4 = base64Module.chartovalue(st.charCodeAt(i++));
                    if (t3 == 64) {
                        v1 = (t1 << 2) + (t2 >> 4);
                        sx += String.fromCharCode(v1);
                    }
                    else if (t4 == 64) {
                        v1 = (t1 << 2) + (t2 >> 4);
                        v2 = ((t2 & 15) << 4) + (t3 >> 2);
                        sx += String.fromCharCode(v1) + String.fromCharCode(v2);
                    }
                    else {
                        v1 = (t1 << 2) + (t2 >> 4);
                        v2 = ((t2 & 15) << 4) + (t3 >> 2);
                        v3 = ((t3 & 3) << 6) + t4;
                        sx += String.fromCharCode(v1) + String.fromCharCode(v2) + String.fromCharCode(v3);
                    }
                }
                return sx;
            }
        } (base64Module);

        md5Module.encode = function (md5Module) {
            return function (str, start, length) {
                if (start === undefined) start = 0;
                if (length === undefined) length = str.length - start;
                var x = md5Module.str2blks_MD5(str, start, length);
                var a =  1732584193;
                var b = -271733879;
                var c = -1732584194;
                var d =  271733878;
                var olda, oldb, oldc, oldd, i;

                for (i = 0; i < x.length; i += 16) {
                    olda = a;
                    oldb = b;
                    oldc = c;
                    oldd = d;

                    a = md5Module.local_md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
                    d = md5Module.local_md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
                    c = md5Module.local_md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
                    b = md5Module.local_md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
                    a = md5Module.local_md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
                    d = md5Module.local_md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
                    c = md5Module.local_md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
                    b = md5Module.local_md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
                    a = md5Module.local_md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
                    d = md5Module.local_md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
                    c = md5Module.local_md5_ff(c, d, a, b, x[i+10], 17, -42063);
                    b = md5Module.local_md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
                    a = md5Module.local_md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
                    d = md5Module.local_md5_ff(d, a, b, c, x[i+13], 12, -40341101);
                    c = md5Module.local_md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
                    b = md5Module.local_md5_ff(b, c, d, a, x[i+15], 22,  1236535329);

                    a = md5Module.local_md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
                    d = md5Module.local_md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
                    c = md5Module.local_md5_gg(c, d, a, b, x[i+11], 14,  643717713);
                    b = md5Module.local_md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
                    a = md5Module.local_md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
                    d = md5Module.local_md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
                    c = md5Module.local_md5_gg(c, d, a, b, x[i+15], 14, -660478335);
                    b = md5Module.local_md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
                    a = md5Module.local_md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
                    d = md5Module.local_md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
                    c = md5Module.local_md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
                    b = md5Module.local_md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
                    a = md5Module.local_md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
                    d = md5Module.local_md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
                    c = md5Module.local_md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
                    b = md5Module.local_md5_gg(b, c, d, a, x[i+12], 20, -1926607734);

                    a = md5Module.local_md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
                    d = md5Module.local_md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
                    c = md5Module.local_md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
                    b = md5Module.local_md5_hh(b, c, d, a, x[i+14], 23, -35309556);
                    a = md5Module.local_md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
                    d = md5Module.local_md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
                    c = md5Module.local_md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
                    b = md5Module.local_md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
                    a = md5Module.local_md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
                    d = md5Module.local_md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
                    c = md5Module.local_md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
                    b = md5Module.local_md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
                    a = md5Module.local_md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
                    d = md5Module.local_md5_hh(d, a, b, c, x[i+12], 11, -421815835);
                    c = md5Module.local_md5_hh(c, d, a, b, x[i+15], 16,  530742520);
                    b = md5Module.local_md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);

                    a = md5Module.local_md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
                    d = md5Module.local_md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
                    c = md5Module.local_md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
                    b = md5Module.local_md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
                    a = md5Module.local_md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
                    d = md5Module.local_md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
                    c = md5Module.local_md5_ii(c, d, a, b, x[i+10], 15, -1051523);
                    b = md5Module.local_md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
                    a = md5Module.local_md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
                    d = md5Module.local_md5_ii(d, a, b, c, x[i+15], 10, -30611744);
                    c = md5Module.local_md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
                    b = md5Module.local_md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
                    a = md5Module.local_md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
                    d = md5Module.local_md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
                    c = md5Module.local_md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
                    b = md5Module.local_md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);

                    a = md5Module.local_md5_add(a, olda);
                    b = md5Module.local_md5_add(b, oldb);
                    c = md5Module.local_md5_add(c, oldc);
                    d = md5Module.local_md5_add(d, oldd);
                }
                return md5Module.local_md5_rhex(a) + md5Module.local_md5_rhex(b) + md5Module.local_md5_rhex(c) + md5Module.local_md5_rhex(d);
            };
        } (md5Module);

        md5Module.local_md5_hex_chr = "0123456789abcdef";

        md5Module.local_md5_rhex = function (md5Module) {
            return function (num) {
                var str = "";
                var j;
                for (j = 0; j <= 3; j++)
                str += md5Module.local_md5_hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
                md5Module.local_md5_hex_chr.charAt((num >> (j * 8)) & 0x0F);
                return str;
            }
        } (md5Module);

        md5Module.str2blks_MD5 = function (str, start, length) {
            var nblk, blks, i;
            nblk = ((length + 8) >> 6) + 1;
            blks = new Array(nblk * 16);
            for(i = 0; i < nblk * 16; i++) blks[i] = 0;
            if (EncodingClass.type.isString(str)) {
                for(i = 0; i < length; i++) {
                    blks[i >> 2] |= str.charCodeAt(start + i) << ((i % 4) * 8);
                }
            }
            else {
                for(i = 0; i < length; i++) {
                    blks[i >> 2] |= str[start + i] << ((i % 4) * 8);
                }
            }
            blks[i >> 2] |= 0x80 << ((i % 4) * 8);
            blks[nblk * 16 - 2] = length * 8;
            return blks;
        }

        md5Module.local_md5_add = function (x, y) {
            var lsw = (x & 0xFFFF) + (y & 0xFFFF);
            var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
            return (msw << 16) | (lsw & 0xFFFF);
        }

        md5Module.local_md5_rol = function (num, cnt) {
            return (num << cnt) | (num >>> (32 - cnt));
        }

        md5Module.local_md5_cmn = function (md5Module) {
            return function (q, a, b, x, s, t) {
                return md5Module.local_md5_add(md5Module.local_md5_rol(md5Module.local_md5_add(md5Module.local_md5_add(a, q), md5Module.local_md5_add(x, t)), s), b);
            }
        } (md5Module);

        md5Module.local_md5_ff = function (md5Module) {
            return function (a, b, c, d, x, s, t) {
                return md5Module.local_md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
            }
        } (md5Module);

        md5Module.local_md5_gg = function (md5Module) {
            return function (a, b, c, d, x, s, t) {
                return md5Module.local_md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
            }
        } (md5Module);

        md5Module.local_md5_hh = function (md5Module) {
            return function (a, b, c, d, x, s, t) {
                return md5Module.local_md5_cmn(b ^ c ^ d, a, b, x, s, t);
            }
        } (md5Module);

        md5Module.local_md5_ii = function (md5Module) {
            return function (a, b, c, d, x, s, t) {
                return md5Module.local_md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
            }
        } (md5Module);

        var retval = {
            func: funcModule,
            type : typeModule,
            number : numberModule,
            color : colorModule,
            string : stringModule,
            utf8 : utf8Module,
            base64 : base64Module,
            md5 : md5Module,
            pack : packModule
        };

        retval.quickEncrypt = function (utf8Module) {
            return function (sx) {
                var i, k, x, st;
                var i, k, x, st;
                sx = utf8Module.encode(sx);
                k = sx.length;
                st = "";
                for (i = 0; i < k; i++) {
                    x = sx.charCodeAt(i);
                    st += String.fromCharCode(65 + (x & 0xF)) + String.fromCharCode(65 + ((x >> 4) & 0xF));
                }
                return st;
            }
        } (utf8Module);

        retval.quickDecrypt = function (utf8Module) {
            return function (sx) {
                var i, k, x, y, st;
                k = sx.length;
                st = "";
                for (i = 0; i < k; i++) {
                    x = sx.charCodeAt(i++) - 65;
                    y = sx.charCodeAt(i) - 65;
                    st += String.fromCharCode((y << 4) + x);
                }
                return utf8Module.decode(st);
            }
        } (utf8Module);

        retval.inputvalue = function (str) {
            var st = "";
            str = "" + str;
            var i;
            var x = str.length;
            for (i = 0; i < x; i++) {
                st = st + "&#" + str.charCodeAt(i) + ";";
            }
            return st;
        };

        retval.textshow = function (str, tabEnabled) {
            var st = "", t;
            str = "" + str;
            var i;
            var x = str.length;
            for (i = 0; i < x; i++) {
                t = str.charCodeAt(i);
                if ((t != 10) && (t != 13)) {
                    st += "&#" + t + ";";
                }
                else if (t == 10) st += "<br>";
            }
            if (tabEnabled === undefined) tabEnabled = false;
            if (tabEnabled) return "<pre>" + st + "</pre>";
            return st;
        };

        retval.exportCode = function (stringModule) {
            return function () {
                var st = [Date2.toString() + ";\r\n" + Geometry.toString() + ";\r\n"];
                st.push("var EncodingClass = function () {\r\n");
                st.push("var funcModule, typeModule, numberModule, colorModule, stringModule, utf8Module, base64Module, md5Module, packModule;\r\n");
                st.push("var core = {};\r\n");
                st.push("var ecode = " + stringModule.exportVariable(ecode) + ";\r\n");
                st.push("funcModule = " + stringModule.exportVariable(funcModule) + ";\r\n");
                st.push("typeModule = " + stringModule.exportVariable(typeModule) + ";\r\n");
                st.push("numberModule = " + stringModule.exportVariable(numberModule) + ";\r\n");
                st.push("colorModule = " + stringModule.exportVariable(colorModule) + ";\r\n");
                st.push("stringModule = " + stringModule.exportVariable(stringModule) + ";\r\n");
                st.push("utf8Module = " + stringModule.exportVariable(utf8Module) + ";\r\n");
                st.push("base64Module = " + stringModule.exportVariable(base64Module) + ";\r\n");
                st.push("md5Module = " + stringModule.exportVariable(md5Module) + ";\r\n");
                st.push("packModule = " + stringModule.exportVariable(packModule) + ";\r\n");

                st.push("return {func: funcModule, type : typeModule, number : numberModule, color : colorModule, string : stringModule, utf8 : utf8Module, base64 : base64Module, md5 : md5Module, pack : packModule};\r\n");
                st.push("} ();\r\n");
                return stringModule.merge(st);
            }
        } (stringModule);

        return retval;
    } ();
    if (window.ModuleManagerClass !== undefined) {
        window.ModuleManagerClass.register("EncodingClass");
    }
}

VaKeR 2022