{"version":3,"sources":["function.ts"],"sourcesContent":["import { Pointer, ReactiveValue } from \"../runtime/pointers.ts\";\nimport { Runtime } from \"../runtime/runtime.ts\";\nimport { logger } from \"../utils/global_values.ts\";\nimport type { StreamConsumer, ValueConsumer } from \"./abstract_types.ts\";\nimport { BROADCAST, Endpoint, endpoint_name, LOCAL_ENDPOINT, target_clause } from \"./addressing.ts\";\nimport { Markdown } from \"./markdown.ts\";\nimport { Scope } from \"./scope.ts\";\nimport { Tuple } from \"./tuple.ts\";\nimport type { datex_scope, compile_info } from \"../utils/global_types.ts\";\nimport { Compiler } from \"../compiler/compiler.ts\";\nimport { Stream } from \"./stream.ts\"\nimport { PermissionError, RuntimeError, TypeError, ValueError } from \"./errors.ts\";\nimport { ProtocolDataType } from \"../compiler/protocol_types.ts\";\nimport { DX_EXTERNAL_FUNCTION_NAME, DX_EXTERNAL_SCOPE_NAME, DX_TIMEOUT, VOID } from \"../runtime/constants.ts\";\nimport { Type, type_clause } from \"./type.ts\";\nimport { callWithMetadata, callWithMetadataAsync } from \"../utils/caller_metadata.ts\";\nimport { Datex } from \"../mod.ts\";\nimport { Callable, ExtensibleFunction, getDeclaredExternalVariables, getDeclaredExternalVariablesAsync, getSourceWithoutUsingDeclaration } from \"./function-utils.ts\";\nimport { Conjunction, Disjunction, Target, datex_meta } from \"../datex_all.ts\";\n\n\n\n/**\n * inject meta info to stack trace\n */\n\nexport function getDefaultLocalMeta(): datex_meta {\n    return Object.seal({\n        sender: Runtime.endpoint,\n        caller: Runtime.endpoint,\n        timestamp: new Date(),\n        signed: true,\n        encrypted: false,\n        type: ProtocolDataType.LOCAL,\n        local: true // set true if function was executed locally, not via DATEX (not a DATEX variable)\n    })\n}\n\nexport function getUnknownMeta(): datex_meta {\n    return Object.seal({\n        sender: BROADCAST,\n        caller: BROADCAST,\n        timestamp: new Date(),\n        signed: false,\n        encrypted: false,\n        type: ProtocolDataType.REQUEST\n    })\n}\n\n\n/** function - execute datex or js code - use for normal functions, not for static scope functions */\nexport class Function<T extends (...args: any) => any = (...args: any) => any> extends ExtensibleFunction implements ValueConsumer, StreamConsumer {\n    \n    public context?: object|Pointer;  // the context (this) in which the function exists, if part of an object\n    public body?: Scope<ReturnType<T>>\n    public ntarget?: T\n    public location:Endpoint\n\n    fn?: (...args: any) => ReturnType<T>|Promise<ReturnType<T>> // parameters can be different because of meta\n\n    allowed_callers?:target_clause\n    serialize_result = false // return pointer values, not pointers\n    anonymize_result:boolean\n    params: Tuple<type_clause>\n    unknown_params?: boolean // set to true if params can be arbitrary, e.g. for native functions like console.log\n    params_keys: string[]\n\n    is_async = true;\n\n    datex_timeout?: number\n\n    about?:Markdown\n\n    private proxy_fn?: globalThis.Function // in case the function should be called remotely, a proxy function\n\n    external_variables?: Record<string,unknown>\n\n    get js_source() {\n        if (!this.ntarget) return null;\n        return getSourceWithoutUsingDeclaration(this.ntarget)\n    }\n\n    static #method_params_source:(target:any, method_name:string, meta_param_index?:number)=>Tuple<Type>\n    static #method_meta_index_source:(target:any, method_name:string)=>number\n\n    public static setMethodParamsSource(fn:(target:any, method_name:string, meta_param_index?:number)=>Tuple<Type>){\n        this.#method_params_source = fn;\n    }\n\n    public static setMethodMetaIndexSource(fn:(target:any, method_name:string)=>number) {\n        this.#method_meta_index_source = fn;\n    }\n    \n\n\n    // convert normal JS Function to <Function>\n    public static createFromJSFunction<T extends (...args: any) => any = (...args: any) => any>(\n        ntarget:T, \n        context?:object|Pointer, \n        key_in_parent?:string,\n        location:Endpoint = Runtime.endpoint, \n        allowed_callers?:target_clause, \n        anonymize_result=false,\n        params?:Tuple<Type>\n    ):Function<(...args:Parameters<T>)=>ReturnType<T>> & Callable<Parameters<T>, ReturnType<T>> {\n       \n        if (ntarget.name.startsWith(\"bound \")) {\n            console.log(ntarget, params, key_in_parent);\n            try {\n                throw new Error(\"Cannot convert a bound function to a DATEX function\");\n            } catch (e) {\n                console.error(\"createFromJSFunction\", e)\n                return () => {};\n            }\n        }\n\n        // already a DATEX Function\n        if (ntarget instanceof Function) return ntarget;\n        \n        // auto detect params and meta index\n        if (params == null ) {\n            params = this.getFunctionParamsAndMetaIndex(ntarget, context, key_in_parent)[1]\n        }\n        return <Function<(...args:Parameters<T>)=>ReturnType<T>> & Callable<Parameters<T>, ReturnType<T>>> new Function<(...args:Parameters<T>)=>ReturnType<T>>(undefined, ntarget, context, location, allowed_callers, anonymize_result, params);\n    }\n\n\n    // convert DATEX Scope to <Function>\n    public static createFromDatexScope(\n        scope:Scope, \n        context?:object|Pointer, \n        location:Endpoint = Runtime.endpoint, \n        allowed_callers?:target_clause, \n        anonymize_result=false,\n        params?:Tuple\n    ) {\n        return new Function(scope, undefined, context, location, allowed_callers, anonymize_result, params);\n    }\n\n    private constructor(body?:Scope, ntarget?:T, context?:object|Pointer, location:Endpoint = Runtime.endpoint, allowed_callers?:target_clause, anonymize_result=false, params?:Tuple) {\n        super((...args:any[]) => this.handleApply(new Tuple(args)));\n        \n        this.params = params??new Tuple();\n        this.params_keys = [...this.params.named.keys()];\n\n        this.body = body;\n        this.ntarget = ntarget;\n        this.location = location;\n\n        // execute DATEX code\n        if (body instanceof Scope) {\n            const ctx = context instanceof Pointer ? context.val : context;\n            this.fn = (meta, ...args:any[])=>body.execute(meta.sender, ctx, args); // execute DATEX code\n        }\n        // execute native JS code\n        else if (typeof ntarget == \"function\") {\n            const ctx = context instanceof Pointer ? context.val : context;\n            this.fn = (ctx && ntarget.bind) ? ntarget.bind(ctx) : ntarget;\n            // is asnyc or sync fnc (TODO: only checks for AsyncFunction, function might still return a Promise!)\n            this.is_async = this.fn.constructor.name == \"AsyncFunction\"\n\n            // for native functions like console.log, there are no param declarations in the function declaration\n            // we must assume that the function accepts any number of arguments\n            // setting this.unknown_params to true will disable parameter size constraints\n            if (ntarget.toString().match(/\\[native code\\]\\s*\\}/)) {\n                this.unknown_params = true\n            }\n\n            // get external_variables dependencies from use() statement\n            if (this.is_async) {\n                (async () => {\n                    const {vars, flags} = await getDeclaredExternalVariablesAsync(this.fn!)\n                    this.external_variables = vars;\n                })();\n            }\n            else {\n                const {vars, flags} = getDeclaredExternalVariables(this.fn)\n                this.external_variables = vars;\n            }\n            \n        }\n\n        this.allowed_callers = allowed_callers;\n        this.anonymize_result = anonymize_result;\n\n        Object.defineProperty(this,'context',{\n            enumerable:false,\n            value: context\n        });\n\n        // update location if currently @@local, as soon as connected to cloud\n        if (this.location == LOCAL_ENDPOINT) {\n            Runtime.onEndpointChanged((endpoint)=>{\n                logger.debug(\"update local function location for \" + Runtime.valueToDatexString(this))\n                this.location = endpoint;\n            })\n        }\n\n\n    }\n\n    // returns param data for native js function\n    private static getFunctionParamsAndMetaIndex(value:((...params: any[]) => any), parent?:object|Pointer, key_in_parent?:any):[number|undefined, Tuple<Type>] {\n        const parent_value = parent instanceof Pointer ? parent.val : parent;\n\n        if (typeof value == \"function\" && !(value instanceof Function)) {\n            // try to get more type info for the method params (from JS decorators etc.)\n            const meta_param_index = parent_value ? this.#method_meta_index_source?.(parent_value, key_in_parent) : undefined;\n            let params = parent_value ? this.#method_params_source?.(parent_value, key_in_parent, meta_param_index) : undefined;\n            if (!params) params = this.getFunctionParams(value);\n            return [meta_param_index, params]\n        }\n        throw new ValueError(\"Cannot auto-cast native value to <Function>\");\n    }\n\n    // fallback if no js class adapter method params, get function params from string (all of type <Any>)\n    public static getFunctionParams(fun:globalThis.Function) {\n        const tuple = new Tuple<Type>();\n\n        // get parameter names from function body string\n        const function_body:string = fun?.toString();\n        const args_match = function_body?.match(/^[^(]*\\(([^)]*)\\)/)?.[1];\n\n        if (!args_match?.length) return tuple;\n        const args_strings = this.normalizeFunctionParams(args_match).split(\",\");\n        if (args_strings) {\n            for (let arg of args_strings) {\n                arg = arg.trim().split(/[ =]/)[0];\n                let type = Type.std.Any;\n                // type comment (until function decorators are added) /*<Type>*/\n                const type_comment = arg.match(/^(\\S*)\\s*\\/\\*(\\<.*>)\\*\\//);\n                if (type_comment) {\n                    arg = type_comment[1];\n                    type = Type.get(type_comment[2].slice(1,-1)); // TODO better type evaluation (params, etc)?\n                }\n                tuple.set(arg, type);\n            }\n\n        }\n\n        return tuple;\n    }\n\n    /**\n     * Normalizes a function params string, replacing destructuring with a single variable\n     */\n    private static normalizeFunctionParams(params: string) {\n        let scopes = 0;\n        let nestedIndex = undefined;\n\n        let i=0;\n        let varCount = 0;\n        for (const x of params) {            \n            if (x === \"[\"||x === \"{\") scopes++;\n            if (x === \"]\"||x === \"}\") scopes--;\n            if (nestedIndex == undefined && scopes !== 0) {\n                nestedIndex = i;\n            }\n            else if(nestedIndex != undefined && scopes == 0) {\n                params = [...params].toSpliced(nestedIndex, i-nestedIndex+1, 'x_'+(varCount++)).join(\"\")\n                i = nestedIndex\n                nestedIndex = undefined;\n            }\n            i++;\n        }\n        \n        return params;\n    }\n\n\n    // execute this function remotely, set the endpoint\n    private setRemoteEndpoint(endpoint: Endpoint){\n        //let my_pointer = <Pointer> Pointer.pointerifyValue(this);\n\n        const sid = Compiler.generateSID(true); // fixed sid to keep order\n        \n        // save pointer in variable:\n        /**\n         * _ = $aaaaa328749823749234;\n         * return _(a,b,c);\n         * return _(d,e,f);\n         * return _(g,h,i);\n         * ...\n         */\n        \n        Runtime.datexOut(['#f $=?;', [this], {to:endpoint, end_of_scope:false, sid, return_index: Compiler.getNextReturnIndexForSID(sid)}], endpoint, sid, false);\n\n        this.proxy_fn = async (value: any) => {\n            // TODO convert #f to dynami compiler time variable?\n            const compile_info:compile_info = [this.serialize_result ? 'value (#f ?);return;' : '#f ?;return;', [value], {to:endpoint, end_of_scope:false, sid, return_index: Compiler.getNextReturnIndexForSID(sid)}];\n            \n            // run in scope, get result\n            try {\n                const res = await Runtime.datexOut(compile_info, endpoint, undefined, true, undefined, undefined, false, this.datex_timeout??(this as any)[DX_TIMEOUT]);\n                return res;\n            } catch (e) {\n                // error occured during scope execution => scope is broken, can no longer be used => create new scope\n                // TODO can we ignore this somehow?\n                logger.debug(\"Error ocurred, resetting DATEX scope for proxy function\");\n                this.setRemoteEndpoint(endpoint); // new DATEX scope\n                throw e;\n            }\n        }\n    }\n\n\n    // handle streams\n    write(data:any, scope?:datex_scope) {\n        return this.handleApply(data, scope);\n    }\n\n    async pipe(in_stream:Stream) {\n        const reader = in_stream.getReader();\n        let next:ReadableStreamReadResult<ArrayBuffer>;\n        while (true) {\n            next = await reader.read()\n            if (next.done) break;\n            this.write(next.value);\n        }\n    }\n\n    // call the function either from JS directly (meta data is automatically generated, sender is always the current endpoint) or from a DATEX scope\n    handleApply(value:any, SCOPE?: datex_scope):Promise<ReturnType<T>>|ReturnType<T>{\n\n        // call function remotely if not\n        if (!(\n            Runtime.endpoint.equals(this.location) || // location is own endpoint instance\n            Runtime.endpoint.main.equals(this.location) || // location is own endpoint\n            this.location == LOCAL_ENDPOINT || // location is local\n            this.fn // already has a local function\n        )) this.setRemoteEndpoint(this.location);\n\n        let meta:any; // meta (scope variables)\n\n\n        // called from DATEX scope\n        if (SCOPE) {\n            // check exec permissions\n            // TODO permission check\n            // if (!SCOPE.execution_permission || (this.allowed_callers && !this.allowed_callers.test(SCOPE.sender))) {\n            //     throw new PermissionError(\"No execution permission\", SCOPE);\n            // }\n\n            // is proxy function: call remote, only if has impersonation permission!\n            if (this.proxy_fn) {\n                if (SCOPE.impersonation_permission) return this.proxy_fn(value);\n                else {\n                    console.error(\"No permission to execute functions on external endpoints\", this.proxy_fn)\n                    throw new PermissionError(\"No permission to execute functions on external endpoints (\"+this.name+\",\"+this.proxy_fn.name+\")\", SCOPE)\n                }\n            }\n            // else local call ...\n            meta = SCOPE.meta;\n        }\n\n        // called locally\n        else {\n            // proxy function: call remote\n            if (this.proxy_fn) return this.proxy_fn(value);\n            // else generate meta data\n            meta = getDefaultLocalMeta();\n        }\n\n        // no function or DATEX provided\n        if (!this.fn) {\n            throw new RuntimeError(\"Cannot apply values to a <Function> with no executable DATEX or valid native target\");\n        }\n\n        const context = (this.context instanceof ReactiveValue ? this.context.val : this.context);\n        let params:any[];\n       \n        // record\n        if (value instanceof Tuple) {\n            params = [];\n            for (const [key, val] of value.entries()) {\n                // normal number index\n                if (!isNaN(Number(key.toString()))) {\n                    if (Number(key.toString()) < 0) logger.warn(Datex.Pointer.getByValue(this)?.idString() + \": Invalid function arguments: '\" + key + \"'\");\n                    else if (Number(key.toString()) >= this.params.size) {\n                        // ignore if no params (TODO: just workaround to prevent errors)\n                        // if (this.params.size !== 0) logger.warn(Datex.Pointer.getByValue(this)?.idString()+\": Maximum number of function arguments is \" + (this.params.size));\n                    }\n                    params[Number(key.toString())] = val;\n                }\n                // get index of named argument\n                else {\n                    const index = this.params_keys.indexOf(key.toString());\n                    if (index == -1) throw new RuntimeError(\"Invalid function argument: '\" + key + \"'\", SCOPE);\n                    params[index] = val;\n                }\n            }\n        }\n        // no args\n        else if (value == VOID) params = [];\n        // single arg\n        else {\n            if (this.params.size == 0 && !this.unknown_params) {\n                // ignore if no params (TODO: just workaround to prevent errors)\n                // throw new RuntimeError(\"Maximum number of function arguments is \" + (this.params.size), SCOPE);\n                params = [];\n            }\n            else params = [value];\n        }\n\n\n        let isSpread = false; // has argument with ..., unlimited args size\n        // argument type checking\n        if (this.params) {\n            let i = 0;\n            for (const [name, required_type] of this.params.entries()) {\n                if (typeof name == \"string\" && name.startsWith(\"...\")) isSpread = true;\n\n                const actual_type = Type.ofValue(params[i]);\n\n                if (\n                    required_type\n                    && required_type != Type.std.Object  // argument type is not further specified (can be any typescript type)\n\n                    && actual_type!=Type.std.null\n                    && actual_type!=Type.std.void // void and null are accepted by default\n\n                    && !Type.matchesType(actual_type, required_type) // root type of actual type match\n    \n                ) {\n                    throw new TypeError(`Invalid argument '${name}': type should be ${required_type.toString()}`, SCOPE);\n                }\n                i++;\n            }\n        }\n\n        const required_param_nr = this.params.size;\n\n        // is datex function\n        if (this.body) return this.fn.call(context, meta, ...params);\n\n        // no meta index, still crop the params to the required size if possible\n        // injects meta to stack trace, can be accessed via Datex.getMeta()\n        const call = <CallableFunction&(typeof callWithMetadata)> (this.is_async ? callWithMetadataAsync : callWithMetadata);\n        if (this.unknown_params || isSpread || params.length<=required_param_nr) {\n            return call(meta, this.fn, params, context) // this.fn.call(context, ...params); \n        }\n        else return call(meta, this.fn, params.slice(0,required_param_nr), context);// this.fn.call(context, ...params.slice(0,required_param_nr));\n    }\n\n\n    bodyToString(formatted=false, parentheses=true, spaces = '  '){\n        if (this.body) return this.body.bodyToString(formatted, parentheses, spaces)\n        else return '(### native code ###)'; // <Void> 'native code';\n    }\n\n    override toString(formatted=false, spaces = '  '){\n        return `function ${this.params.size== 0 ? '()' : Runtime.valueToDatexString(this.params)}${(formatted ? \" \":\"\")}${this.bodyToString(formatted, true, spaces)}`;\n    }\n\n}\n\n\n\n\n/**\n * add to() extension method to functions\n */\n\ntype Receiver = target_clause|string|Iterable<Target|string>\n\ndeclare global {\n\tinterface CallableFunction {\n\t\tto<T, A extends unknown[], R>(this: (this: T, ...args: A) => R, receiver?:Receiver): (...args: A)=>Promise<Awaited<Promise<R>>>;\n\t}\n}\n\nfunction to (this:Function, receivers:Receiver) {\n    if (\n        receivers \n        && typeof receivers == \"object\" \n        && typeof (receivers as any)[Symbol.iterator] === 'function'\n        && !(receivers instanceof Conjunction) \n        && !(receivers instanceof Disjunction)\n    ) {\n        receivers = new Disjunction(...[...(receivers as Iterable<Target|endpoint_name>)].map(r => r instanceof Target ? r : Target.get(r as endpoint_name)));\n    }\n    if (this instanceof Function) {\n        return new Proxy(this, {\n            apply: (_target, thisArg, argArray:unknown[]) => {\n                return (_target as any).apply(thisArg, argArray) // TODO: inject receivers\n            }\n        })\n    }\n    else return new Proxy(this, {\n        apply: (target, _thisArg, argArray:unknown[]) => {\n            const externalScopeName = target[DX_EXTERNAL_SCOPE_NAME];\n            const externalFunctionName = target[DX_EXTERNAL_FUNCTION_NAME];\n            const timeout = target[DX_TIMEOUT];\n            return datex(\n                `#public.?.? ?`, \n                [externalScopeName, externalFunctionName, new Tuple(argArray)], \n                receivers as target_clause,\n                undefined, undefined, undefined, undefined,\n                timeout\n            )\n        }\n    })\n}\n\n// @ts-ignore override function prototype\nglobalThis.Function.prototype.to = to;"],"names":["Pointer","ReactiveValue","Runtime","logger","BROADCAST","LOCAL_ENDPOINT","Scope","Tuple","Compiler","PermissionError","RuntimeError","TypeError","ValueError","ProtocolDataType","DX_EXTERNAL_FUNCTION_NAME","DX_EXTERNAL_SCOPE_NAME","DX_TIMEOUT","VOID","Type","callWithMetadata","callWithMetadataAsync","Datex","ExtensibleFunction","getDeclaredExternalVariables","getDeclaredExternalVariablesAsync","getSourceWithoutUsingDeclaration","Conjunction","Disjunction","Target","getDefaultLocalMeta","Object","seal","sender","endpoint","caller","timestamp","Date","signed","encrypted","type","LOCAL","local","getUnknownMeta","REQUEST","Function","context","body","ntarget","location","fn","allowed_callers","serialize_result","anonymize_result","params","unknown_params","params_keys","is_async","datex_timeout","about","proxy_fn","external_variables","js_source","setMethodParamsSource","setMethodMetaIndexSource","createFromJSFunction","key_in_parent","name","startsWith","console","log","Error","e","error","getFunctionParamsAndMetaIndex","undefined","createFromDatexScope","scope","args","handleApply","named","keys","ctx","val","meta","execute","bind","constructor","toString","match","vars","flags","defineProperty","enumerable","value","onEndpointChanged","debug","valueToDatexString","parent","parent_value","meta_param_index","getFunctionParams","fun","tuple","function_body","args_match","length","args_strings","normalizeFunctionParams","split","arg","trim","std","Any","type_comment","get","slice","set","nestedIndex","scopes","i","varCount","x","toSpliced","join","setRemoteEndpoint","sid","generateSID","datexOut","to","end_of_scope","return_index","getNextReturnIndexForSID","compile_info","write","data","pipe","in_stream","next","reader","getReader","read","done","SCOPE","equals","main","impersonation_permission","key","entries","isNaN","Number","index","indexOf","warn","getByValue","idString","size","isSpread","required_type","actual_type","ofValue","null","void","matchesType","required_param_nr","call","bodyToString","formatted","parentheses","spaces","receivers","Symbol","iterator","map","r","Proxy","apply","_target","thisArg","argArray","target","_thisArg","externalScopeName","externalFunctionName","timeout","datex","globalThis","prototype"],"mappings":"AAAA,SAASA,OAAO,EAAEC,aAAa,QAAQ,yBAAyB;AAChE,SAASC,OAAO,QAAQ,wBAAwB;AAChD,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,SAASC,SAAS,EAA2BC,cAAc,QAAuB,kBAAkB;AAEpG,SAASC,KAAK,QAAQ,aAAa;AACnC,SAASC,KAAK,QAAQ,aAAa;AAEnC,SAASC,QAAQ,QAAQ,0BAA0B;AAEnD,SAASC,eAAe,EAAEC,YAAY,EAAEC,SAAS,EAAEC,UAAU,QAAQ,cAAc;AACnF,SAASC,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,yBAAyB,EAAEC,sBAAsB,EAAEC,UAAU,EAAEC,IAAI,QAAQ,0BAA0B;AAC9G,SAASC,IAAI,QAAqB,YAAY;AAC9C,SAASC,gBAAgB,EAAEC,qBAAqB,QAAQ,8BAA8B;AACtF,SAASC,KAAK,QAAQ,YAAY;AAClC,SAAmBC,kBAAkB,EAAEC,4BAA4B,EAAEC,iCAAiC,EAAEC,gCAAgC,QAAQ,sBAAsB;AACtK,SAASC,WAAW,EAAEC,WAAW,EAAEC,MAAM,QAAoB,kBAAkB;AAQ/E,OAAO,SAASC;IACZ,OAAOC,OAAOC,IAAI,CAAC;QACfC,QAAQ9B,QAAQ+B,QAAQ;QACxBC,QAAQhC,QAAQ+B,QAAQ;QACxBE,WAAW,IAAIC;QACfC,QAAQ,CAAA;QACRC,WAAW,CAAA;QACXC,MAAM1B,iBAAiB2B,KAAK;QAC5BC,OAAO,CAAA;IACX;AACJ;AAEA,OAAO,SAASC;IACZ,OAAOZ,OAAOC,IAAI,CAAC;QACfC,QAAQ5B;QACR8B,QAAQ9B;QACR+B,WAAW,IAAIC;QACfC,QAAQ,CAAA;QACRC,WAAW,CAAA;QACXC,MAAM1B,iBAAiB8B,OAAO;IAClC;AACJ;AAIA,OAAO,MAAMC,iBAA0EtB;IAE5EuB,QAAyB;IACzBC,KAA2B;IAC3BC,QAAW;IACXC,SAAiB;IAExBC,GAA2D;IAE3DC,gBAA8B;IAC9BC,mBAAmB,CAAA,EAAK;IACxBC,iBAAwB;IACxBC,OAA0B;IAC1BC,eAAwB;IACxBC,YAAqB;IAErBC,WAAW,CAAA,EAAK;IAEhBC,cAAsB;IAEtBC,MAAe;IAEPC,SAA8B;IAEtCC,mBAA2C;IAE3C,IAAIC,YAAY;eACZ,AAAK,IAAI,CAACd,OAAO,GACVtB,iCAAiC,IAAI,CAACsB,OAAO,IAD1B;IAE9B;IAEA,OAAO,CAAA,oBAAqB,CAAwE;IACpG,OAAO,CAAA,wBAAyB,CAAyC;IAEzE,OAAce,sBAAsBb,EAA0E,EAAC;QAC3G,IAAI,CAAC,CAAA,oBAAqB,GAAGA;IACjC;IAEA,OAAcc,yBAAyBd,EAA2C,EAAE;QAChF,IAAI,CAAC,CAAA,wBAAyB,GAAGA;IACrC;IAKA,OAAce,qBACVjB,OAAS,EACTF,OAAuB,EACvBoB,aAAqB,EACrBjB,WAAoB9C,QAAQ+B,QAAQ,EACpCiB,eAA8B,EAC9BE,mBAAiB,CAAA,CAAK,EACtBC,MAAmB,EACqE;QAExF,IAAIN,QAAQmB,IAAI,CAACC,UAAU,CAAC,WAAW;YACnCC,QAAQC,GAAG,CAACtB,SAASM,QAAQY;YAC7B,IAAI;gBACA,MAAM,AAAIK,MAAM;YACpB,EAAE,OAAOC,GAAG;gBAER,OADAH,QAAQI,KAAK,CAAC,wBAAwBD,IAC/B,KAAO;YAClB;QACJ;eAGA,AAAIxB,mBAAmBH,WAAiBG,WAG1B,QAAVM,UACAA,CAAAA,SAAS,IAAI,CAACoB,6BAA6B,CAAC1B,SAASF,SAASoB,cAAc,CAAC,EAAE,AAAD,GAEiB,IAAIrB,SAAiD8B,KAAAA,GAAW3B,SAASF,SAASG,UAAUE,iBAAiBE,kBAAkBC;IACtO;IAIA,OAAcsB,qBACVC,KAAW,EACX/B,OAAuB,EACvBG,WAAoB9C,QAAQ+B,QAAQ,EACpCiB,eAA8B,EAC9BE,mBAAiB,CAAA,CAAK,EACtBC,MAAa,EACf;QACE,OAAO,IAAIT,SAASgC,OAAOF,KAAAA,GAAW7B,SAASG,UAAUE,iBAAiBE,kBAAkBC;IAChG;IAEA,YAAoBP,IAAW,EAAEC,OAAU,EAAEF,OAAuB,EAAEG,WAAoB9C,QAAQ+B,QAAQ,EAAEiB,eAA8B,EAAEE,mBAAiB,CAAA,CAAK,EAAEC,MAAa,CAAE;QAW/K,IAVA,KAAK,CAAC,CAAC,GAAGwB,OAAe,IAAI,CAACC,WAAW,CAAC,IAAIvE,MAAMsE,SAEpD,IAAI,CAACxB,MAAM,GAAGA,UAAQ,IAAI9C,SAC1B,IAAI,CAACgD,WAAW,GAAG;eAAI,IAAI,CAACF,MAAM,CAAC0B,KAAK,CAACC,IAAI;SAAG,EAEhD,IAAI,CAAClC,IAAI,GAAGA,MACZ,IAAI,CAACC,OAAO,GAAGA,SACf,IAAI,CAACC,QAAQ,GAAGA,UAGZF,gBAAgBxC,OAAO;YACvB,IAAM2E,MAAMpC,mBAAmB7C,UAAU6C,QAAQqC,GAAG,GAAGrC;YACvD,IAAI,CAACI,EAAE,GAAG,CAACkC,MAAM,GAAGN,OAAa/B,KAAKsC,OAAO,CAACD,KAAKnD,MAAM,EAAEiD,KAAKJ;QACpE,OAEK,IAAI,AAAkB,cAAlB,OAAO9B,SAAuB;YACnC,IAAMkC,MAAMpC,mBAAmB7C,UAAU6C,QAAQqC,GAAG,GAAGrC;YAavD,IAZA,IAAI,CAACI,EAAE,GAAG,AAACgC,OAAOlC,QAAQsC,IAAI,GAAItC,QAAQsC,IAAI,CAACJ,OAAOlC,SAEtD,IAAI,CAACS,QAAQ,GAAG,AAA4B,mBAA5B,IAAI,CAACP,EAAE,CAACqC,WAAW,CAACpB,IAAI,EAKpCnB,QAAQwC,QAAQ,GAAGC,KAAK,CAAC,2BACzB,CAAA,IAAI,CAAClC,cAAc,GAAG,CAAA,CAAG,GAIzB,IAAI,CAACE,QAAQ,EACb,AAAC,CAAA;gBACG,IAAM,EAACiC,IAAI,EAAEC,KAAK,EAAC,GAAG,MAAMlE,kCAAkC,IAAI,CAACyB,EAAE;gBACrE,IAAI,CAACW,kBAAkB,GAAG6B;YAC9B,CAAA;iBAEC;gBACD,IAAM,EAACA,IAAI,EAAEC,KAAK,EAAC,GAAGnE,6BAA6B,IAAI,CAAC0B,EAAE;gBAC1D,IAAI,CAACW,kBAAkB,GAAG6B;YAC9B;QAEJ;QAEA,IAAI,CAACvC,eAAe,GAAGA,iBACvB,IAAI,CAACE,gBAAgB,GAAGA,kBAExBtB,OAAO6D,cAAc,CAAC,IAAI,EAAC,WAAU;YACjCC,YAAW,CAAA;YACXC,OAAOhD;QACX,IAGI,IAAI,CAACG,QAAQ,IAAI3C,kBACjBH,QAAQ4F,iBAAiB,CAAC,CAAC7D;YACvB9B,OAAO4F,KAAK,CAAC,wCAAwC7F,QAAQ8F,kBAAkB,CAAC,IAAI,IACpF,IAAI,CAAChD,QAAQ,GAAGf;QACpB;IAIR;IAGA,OAAewC,8BAA8BoB,KAAiC,EAAEI,MAAsB,EAAEhC,aAAkB,EAAkC;QACxJ,IAAMiC,eAAeD,kBAAkBjG,UAAUiG,OAAOf,GAAG,GAAGe;QAE9D,IAAI,AAAgB,cAAhB,OAAOJ,SAAuB,CAAEA,CAAAA,iBAAiBjD,QAAO,GAAI;YAE5D,IAAMuD,mBAAmBD,eAAe,IAAI,CAAC,CAAA,wBAAyB,GAAGA,cAAcjC,iBAAiBS,KAAAA,GACpGrB,SAAS6C,eAAe,IAAI,CAAC,CAAA,oBAAqB,GAAGA,cAAcjC,eAAekC,oBAAoBzB,KAAAA;YAE1G,OADKrB,UAAQA,CAAAA,SAAS,IAAI,CAAC+C,iBAAiB,CAACP,MAAK,GAC3C;gBAACM;gBAAkB9C;aAAO;QACrC;QACA,MAAM,IAAIzC,WAAW;IACzB;IAGA,OAAcwF,kBAAkBC,GAAuB,EAAE;QACrD,IAAMC,QAAQ,IAAI/F,SAGZgG,gBAAuBF,KAAKd,YAC5BiB,aAAaD,eAAef,MAAM,sBAAsB,CAAC,EAAE;QAEjE,IAAI,CAACgB,YAAYC,QAAQ,OAAOH;QAChC,IAAMI,eAAe,IAAI,CAACC,uBAAuB,CAACH,YAAYI,KAAK,CAAC;QACpE,IAAIF,cACA,KAAK,IAAIG,OAAOH,aAAc;YAC1BG,MAAMA,IAAIC,IAAI,GAAGF,KAAK,CAAC,OAAO,CAAC,EAAE;YACjC,IAAIrE,OAAOrB,KAAK6F,GAAG,CAACC,GAAG,EAEjBC,eAAeJ,IAAIrB,KAAK,CAAC;YAC3ByB,iBACAJ,MAAMI,YAAY,CAAC,EAAE,EACrB1E,OAAOrB,KAAKgG,GAAG,CAACD,YAAY,CAAC,EAAE,CAACE,KAAK,CAAC,GAAE,OAE5Cb,MAAMc,GAAG,CAACP,KAAKtE;QACnB;QAIJ,OAAO+D;IACX;IAKA,OAAeK,wBAAwBtD,MAAc,EAAE;QACnD,IACIgE,aADAC,SAAS,GAGTC,IAAE,GACFC,WAAW;QACf,KAAK,IAAMC,KAAKpE,OACRoE,CAAAA,AAAM,QAANA,KAAWA,AAAM,QAANA,CAAQ,KAAGH,UACtBG,CAAAA,AAAM,QAANA,KAAWA,AAAM,QAANA,CAAQ,KAAGH,UACtBD,AAAe3C,KAAAA,KAAf2C,eAA4BC,AAAW,MAAXA,SAC5BD,cAAcE,IAEK7C,KAAAA,KAAf2C,eAA4BC,AAAU,KAAVA,WAChCjE,SAAS;eAAIA;SAAO,CAACqE,SAAS,CAACL,aAAaE,IAAEF,cAAY,GAAG,OAAMG,YAAaG,IAAI,CAAC,KACrFJ,IAAIF,aACJA,cAAc3C,KAAAA,IAElB6C;QAGJ,OAAOlE;IACX;IAIQuE,kBAAkB3F,QAAkB,EAAC;QAGzC,IAAM4F,MAAMrH,SAASsH,WAAW,CAAC,CAAA;QAWjC5H,QAAQ6H,QAAQ,CAAC;YAAC;YAAW;gBAAC,IAAI;aAAC;YAAE;gBAACC,IAAG/F;gBAAUgG,cAAa,CAAA;gBAAOJ;gBAAKK,cAAc1H,SAAS2H,wBAAwB,CAACN;YAAI;SAAE,EAAE5F,UAAU4F,KAAK,CAAA,IAEnJ,IAAI,CAAClE,QAAQ,GAAG,OAAOkC;YAEnB,IAAMuC,eAA4B;gBAAC,IAAI,CAACjF,gBAAgB,GAAG,yBAAyB;gBAAgB;oBAAC0C;iBAAM;gBAAE;oBAACmC,IAAG/F;oBAAUgG,cAAa,CAAA;oBAAOJ;oBAAKK,cAAc1H,SAAS2H,wBAAwB,CAACN;gBAAI;aAAE;YAG1M,IAAI;gBAEA,OADY,MAAM3H,QAAQ6H,QAAQ,CAACK,cAAcnG,UAAUyC,KAAAA,GAAW,CAAA,GAAMA,KAAAA,GAAWA,KAAAA,GAAW,CAAA,GAAO,IAAI,CAACjB,aAAa,IAAE,AAAC,IAAI,AAAQ,CAACzC,WAAW;YAE1J,EAAE,OAAOuD,GAAG;gBAKR,MAFApE,OAAO4F,KAAK,CAAC,4DACb,IAAI,CAAC6B,iBAAiB,CAAC3F,WACjBsC;YACV;QACJ;IACJ;IAIA8D,MAAMC,IAAQ,EAAE1D,KAAkB,EAAE;QAChC,OAAO,IAAI,CAACE,WAAW,CAACwD,MAAM1D;IAClC;IAEA,MAAM2D,KAAKC,SAAgB,EAAE;YAErBC;QADJ,IAAMC,SAASF,UAAUG,SAAS;QAElC,OAEQF,AADJA,CAAAA,OAAO,MAAMC,OAAOE,IAAI,EAAC,EAChBC,IAAI,EACb,IAAI,CAACR,KAAK,CAACI,KAAK5C,KAAK;IAE7B;IAGAf,YAAYe,KAAS,EAAEiD,KAAmB,EAAsC;YAUxE3D,MAqCA9B;QAjCJ,IAVInD,QAAQ+B,QAAQ,CAAC8G,MAAM,CAAC,IAAI,CAAC/F,QAAQ,KACrC9C,QAAQ+B,QAAQ,CAAC+G,IAAI,CAACD,MAAM,CAAC,IAAI,CAAC/F,QAAQ,KAC1C,IAAI,CAACA,QAAQ,IAAI3C,kBACjB,IAAI,CAAC4C,EAAE,IACR,IAAI,CAAC2E,iBAAiB,CAAC,IAAI,CAAC5E,QAAQ,GAMnC8F,OAAO;YAQP,IAAI,IAAI,CAACnF,QAAQ,EAAE;gBACf,IAAImF,MAAMG,wBAAwB,EAAE,OAAO,IAAI,CAACtF,QAAQ,CAACkC;gBAGrD,MADAzB,QAAQI,KAAK,CAAC,4DAA4D,IAAI,CAACb,QAAQ,GACjF,IAAIlD,gBAAgB,+DAA6D,IAAI,CAACyD,IAAI,GAAC,MAAI,IAAI,CAACP,QAAQ,CAACO,IAAI,GAAC,KAAK4E;YAErI;YAEA3D,OAAO2D,MAAM3D,IAAI;QACrB,OAGK;YAED,IAAI,IAAI,CAACxB,QAAQ,EAAE,OAAO,IAAI,CAACA,QAAQ,CAACkC;YAExCV,OAAOtD;QACX;QAGA,IAAI,CAAC,IAAI,CAACoB,EAAE,EACR,MAAM,IAAIvC,aAAa;QAG3B,IAAMmC,UAAW,IAAI,CAACA,OAAO,YAAY5C,gBAAgB,IAAI,CAAC4C,OAAO,CAACqC,GAAG,GAAG,IAAI,CAACrC,OAAO;QAIxF,IAAIgD,iBAAiBtF,OAEjB,KAAK,IAAM,CAAC2I,KAAKhE,IAAI,KADrB7B,SAAS,EAAE,EACcwC,MAAMsD,OAAO,IAElC,IAAKC,MAAMC,OAAOH,IAAI3D,QAAQ,MASzB;YACD,IAAM+D,QAAQ,IAAI,CAAC/F,WAAW,CAACgG,OAAO,CAACL,IAAI3D,QAAQ;YACnD,IAAI+D,AAAS,MAATA,OAAa,MAAM,IAAI5I,aAAa,iCAAiCwI,MAAM,KAAKJ;YACpFzF,MAAM,CAACiG,MAAM,GAAGpE;QACpB,OAZQmE,AAAyB,IAAzBA,OAAOH,IAAI3D,QAAQ,MAASpF,OAAOqJ,IAAI,CAACnI,MAAMrB,OAAO,CAACyJ,UAAU,CAAC,IAAI,GAAGC,aAAa,oCAAoCR,MAAM,OAC1HG,CAAAA,AAAOH,IAAI3D,QAAQ,IAAO,IAAI,CAAClC,MAAM,CAACsG,IAAI,AAAD,GAIlDtG,MAAM,CAACgG,OAAOH,IAAI3D,QAAQ,IAAI,GAAGL;aAWrB7B,SAAfwC,SAAS5E,OAAe,EAAE,GAG3B,AAAoB,KAApB,IAAI,CAACoC,MAAM,CAACsG,IAAI,IAAU,IAAI,CAACrG,cAAc,GAKnC;YAACuC;SAAM,GAFR,EAAE;QAMnB,IAAI+D,WAAW,CAAA;QAEf,IAAI,IAAI,CAACvG,MAAM,EAAE;YACb,IAAIkE,IAAI;YACR,KAAK,IAAM,CAACrD,MAAM2F,cAAc,IAAI,IAAI,CAACxG,MAAM,CAAC8F,OAAO,GAAI;gBACpC,YAAf,OAAOjF,QAAoBA,KAAKC,UAAU,CAAC,UAAQyF,CAAAA,WAAW,CAAA,CAAG;gBAErE,IAAME,cAAc5I,KAAK6I,OAAO,CAAC1G,MAAM,CAACkE,EAAE;gBAE1C,IACIsC,iBACGA,iBAAiB3I,KAAK6F,GAAG,CAACjF,MAAM,IAEhCgI,eAAa5I,KAAK6F,GAAG,CAACiD,IAAI,IAC1BF,eAAa5I,KAAK6F,GAAG,CAACkD,IAAI,IAE1B,CAAC/I,KAAKgJ,WAAW,CAACJ,aAAaD,gBAGlC,MAAM,IAAIlJ,UAAU,CAAC,kBAAkB,EAAEuD,KAAK,kBAAkB,EAAE2F,cAActE,QAAQ,GAAG,CAAC,EAAEuD;gBAElGvB;YACJ;QACJ;QAEA,IAAM4C,oBAAoB,IAAI,CAAC9G,MAAM,CAACsG,IAAI;eAG1C,AAAI,IAAI,CAAC7G,IAAI,GAAS,IAAI,CAACG,EAAE,CAACmH,IAAI,CAACvH,SAASsC,SAAS9B,UAIM,CAAA,IAAI,CAACG,QAAQ,GAAGpC,wBAAwBD,gBAAe,EAElGgE,MAAM,IAAI,CAAClC,EAAE,EAAEI,AAD3B,IAAI,CAACC,cAAc,IAAIsG,YAAYvG,OAAOoD,MAAM,IAAE0D,oBACvB9G,SAECA,OAAO8D,KAAK,CAAC,GAAEgD,oBAFRtH;IAG3C;IAGAwH,aAAaC,YAAU,CAAA,CAAK,EAAEC,cAAY,CAAA,CAAI,EAAEC,SAAS,IAAI,EAAC;eAC1D,AAAI,IAAI,CAAC1H,IAAI,GAAS,IAAI,CAACA,IAAI,CAACuH,YAAY,CAACC,WAAWC,aAAaC,UACzD;IAChB;IAESjF,SAAS+E,YAAU,CAAA,CAAK,EAAEE,SAAS,IAAI,EAAC;QAC7C,OAAO,CAAC,SAAS,EAAE,AAAmB,KAAnB,IAAI,CAACnH,MAAM,CAACsG,IAAI,GAAO,OAAOzJ,QAAQ8F,kBAAkB,CAAC,IAAI,CAAC3C,MAAM,EAAE,EAAGiH,YAAY,MAAI,GAAI,EAAE,IAAI,CAACD,YAAY,CAACC,WAAW,CAAA,GAAME,QAAQ,CAAC;IAClK;AAEJ;AAiBA,SAASxC,GAAmByC,SAAkB;WAU1C,EARIA,aACG,AAAoB,YAApB,OAAOA,aACP,AAA+C,cAA/C,OAAO,AAACA,SAAiB,CAACC,OAAOC,QAAQ,CAAC,IACxCF,qBAAqB/I,eACrB+I,qBAAqB9I,eAE1B8I,CAAAA,YAAY,IAAI9I,eAAe;WAAK8I;KAA6C,CAACG,GAAG,CAACC,CAAAA,IAAKA,aAAajJ,SAASiJ,IAAIjJ,OAAOsF,GAAG,CAAC2D,IAAoB,GAEpJ,IAAI,YAAYjI,YACT,IAAIkI,MAAM,IAAI,EAAE;QACnBC,OAAO,CAACC,SAASC,SAASC,WACf,AAACF,QAAgBD,KAAK,CAACE,SAASC;IAE/C,KAEQ,IAAIJ,MAAM,IAAI,EAAE;QACxBC,OAAO,CAACI,QAAQC,UAAUF;YACtB,IAAMG,oBAAoBF,MAAM,CAACpK,uBAAuB,EAClDuK,uBAAuBH,MAAM,CAACrK,0BAA0B,EACxDyK,UAAUJ,MAAM,CAACnK,WAAW;YAClC,OAAOwK,MACH,iBACA;gBAACH;gBAAmBC;gBAAsB,IAAI/K,MAAM2K;aAAU,EAC9DT,WACA/F,KAAAA,GAAWA,KAAAA,GAAWA,KAAAA,GAAWA,KAAAA,GACjC6G;QAER;IACJ;AACJ;AAGAE,WAAW7I,QAAQ,CAAC8I,SAAS,CAAC1D,EAAE,GAAGA","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"function.ts"}