Skip to content

Interface

github-actions[bot] edited this page Jul 14, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-07-14, 16:40:14 UTC presenting an overview of flowR's interfaces (v2.2.16, using R v4.5.0). Please do not edit this file/wiki page directly.

Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.

💬 Communicating with the Server

As explained in the Overview, you can simply run the TCP server by adding the --server flag (and, due to the interactive mode, exit with the conventional CTRL+C). Currently, every connection is handled by the same underlying RShell - so the server is not designed to handle many clients at a time. Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).

Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.

Note

The default --server uses a simple TCP connection. If you want flowR to expose a WebSocket server instead, add the --ws flag (i.e., --server --ws) when starting flowR from the command line.

  • Hello Message (hello)
    View Details. The server informs the client about the successful connection and provides Meta-Information.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client-->Server: connects
        Server->>Client: hello
    	
    
    Loading

    After launching flowR, for example, with docker run -it --rm eagleoutice/flowr --server (🐳️), simply connecting should present you with a hello message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:

    {
      "type": "hello",
      "clientName": "client-0",
      "versions": {
        "flowr": "2.2.16",
        "r": "4.5.0",
        "engine": "r-shell"
      }
    }

    There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.


    Message schema (hello)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-hello.ts.

    • . object [required]
      • type string [required] The type of the hello message. Allows only the values: 'hello'
      • id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
      • clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
      • versions object [required]
        • flowr string [required] The version of the flowr server running in semver format.
        • r string [required] The version of the underlying R shell running in semver format.
        • engine string [required] The parser backend that is used to parse the R code.

  • Analysis Message (request-file-analysis)
    View Details. The server builds the dataflow graph for a given input file (or a set of files).
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-file-analysis
        alt
            Server-->>Client: response-file-analysis
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    The request allows the server to analyze a file and prepare it for slicing. The message can contain a filetoken, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).

    Please note!
    If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass the filetoken field. This will save the server a lot of memory allocation.

    Furthermore, the request must contain either a content field to directly pass the file's content or a filepath field which contains the path to the file (this path must be accessible for the server to be useful). If you add the id field, the answer will use the same id so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.

    Example of the request-file-analysis Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let' suppose you simply want to analyze the following script:

      x <- 1
      x + 1

      For this, you can send the following request:

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      The results field of the response effectively contains three keys of importance:

      • parse: which contains 1:1 the parse result in CSV format that we received from the RShell (i.e., the AST produced by the parser of the R interpreter).
      • normalize: which contains the normalized AST, including ids (see the info field and the Normalized AST wiki page).
      • dataflow: especially important is the graph field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8151-TMm25nXg1e2K-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8151-TMm25nXg1e2K-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
      

    The complete round-trip took 18.2 ms (including time required to validate the messages, start, and stop the internal mock server).

    You receive an error if, for whatever reason, the analysis fails (e.g., the message or code you sent contained syntax errors). It contains a human-readable description why the analysis failed (see the error message implementation for more details).

    Example Error Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filename": "sample.R",
        "content": "x <-"
      }
    3. error (response)
      Show Details
      {
        "id": "1",
        "type": "error",
        "fatal": false,
        "reason": "Error while analyzing file sample.R: GuardError: unable to parse R code (see the log for more information) for request {\"request\":\"file\",\"content\":\"/tmp/tmp-8151-jjAAvaC9EI2v-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.2.16%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D8151%2DjjAAvaC9EI2v%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A207%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A266%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09"
      }

    The complete round-trip took 7.9 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Including the Control Flow Graph

    While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add cfg: true to its list of options.

    Requesting a Control Flow Graph

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      The response looks basically the same as a response sent without the cfg flag. However, additionally it contains a cfg field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-condition","15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-name","25-exit",24,"24-before-value",23,"24-exit",26,29,"29-name","29-exit",28,"28-before-value",27,"28-exit","30-exit","31-head","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["15-condition"],"end":["15-exit"]}],["15-condition",{"id":"15-condition","kind":"condition","type":"mid","root":15}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":["31-head"]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":["25-name"],"end":["25-exit"]}],["25-name",{"id":"25-name","kind":"name","type":"mid","root":25}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":["24-before-value"],"end":["24-exit"]}],["24-before-value",{"id":"24-before-value","kind":"before-value","type":"mid","root":24}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":["29-name"],"end":["29-exit"]}],["29-name",{"id":"29-name","kind":"name","type":"mid","root":29}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":["28-before-value"],"end":["28-exit"]}],["28-before-value",{"id":"28-before-value","kind":"before-value","type":"mid","root":28}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-head",{"id":"31-head","type":"mid","root":31,"kind":"head"}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],["15-condition",[["2-exit",{"label":0}]]],[8,[["15-condition",{"label":1,"when":"TRUE","caused":15}]]],[14,[["15-condition",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],["25-name",[[22,{"label":0}]]],["24-before-value",[[24,{"label":0}]]],[23,[["24-before-value",{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[["25-name",{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],["29-name",[[26,{"label":0}]]],["28-before-value",[[28,{"label":0}]]],[27,[["28-before-value",{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[["29-name",{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],["31-head",[[16,{"label":0}]]],[30,[["31-head",{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[["31-head",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":2}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"rhs":{"location":[1,14,1,14],"lexeme":"0","info":{"fullRange":[1,14,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"},"type":"RNumber","content":{"num":0,"complexNumber":false,"markedAsInt":false}},"operator":">","lexeme":">","info":{"fullRange":[1,4,1,14],"additionalTokens":[],"id":2,"parent":15,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","role":"if-cond"}},"then":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,21,1,22],"lhs":{"type":"RSymbol","location":[1,19,1,19],"content":"x","lexeme":"x","info":{"fullRange":[1,19,1,19],"additionalTokens":[],"id":5,"parent":7,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"rhs":{"location":[1,24,1,24],"lexeme":"2","info":{"fullRange":[1,24,1,24],"additionalTokens":[],"id":6,"parent":7,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"},"type":"RNumber","content":{"num":2,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,19,1,24],"additionalTokens":[],"id":7,"parent":8,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,17,1,17],"content":"{","lexeme":"{","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":3,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},{"type":"RSymbol","location":[1,26,1,26],"content":"}","lexeme":"}","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":4,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":1,"role":"if-then"}},"location":[1,1,1,2],"lexeme":"if","info":{"fullRange":[1,1,1,42],"additionalTokens":[],"id":15,"parent":32,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":0,"role":"expr-list-child"},"otherwise":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,37,1,38],"lhs":{"type":"RSymbol","location":[1,35,1,35],"content":"x","lexeme":"x","info":{"fullRange":[1,35,1,35],"additionalTokens":[],"id":11,"parent":13,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"rhs":{"location":[1,40,1,40],"lexeme":"5","info":{"fullRange":[1,40,1,40],"additionalTokens":[],"id":12,"parent":13,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"},"type":"RNumber","content":{"num":5,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,35,1,40],"additionalTokens":[],"id":13,"parent":14,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,33,1,33],"content":"{","lexeme":"{","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":9,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},{"type":"RSymbol","location":[1,42,1,42],"content":"}","lexeme":"}","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":10,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"vector":{"type":"RBinaryOp","location":[2,11,2,11],"lhs":{"location":[2,10,2,10],"lexeme":"1","info":{"fullRange":[2,10,2,10],"additionalTokens":[],"id":17,"parent":19,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"rhs":{"type":"RSymbol","location":[2,12,2,12],"content":"x","lexeme":"x","info":{"fullRange":[2,12,2,12],"additionalTokens":[],"id":18,"parent":19,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"arguments":[{"type":"RArgument","location":[2,23,2,23],"lexeme":"x","value":{"type":"RSymbol","location":[2,23,2,23],"content":"x","lexeme":"x","info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":23,"parent":24,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,27,2,31],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,27,2,31],"content":"print","lexeme":"print","info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":26,"parent":29,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"arguments":[{"type":"RArgument","location":[2,33,2,33],"lexeme":"i","value":{"type":"RSymbol","location":[2,33,2,33],"content":"i","lexeme":"i","info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":1,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[2,15,2,15],"content":"{","lexeme":"{","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":20,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}},{"type":"RSymbol","location":[2,36,2,36],"content":"}","lexeme":"}","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":21,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8151-JjHRHeoKrYKJ-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8151-JjHRHeoKrYKJ-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
      

    The complete round-trip took 9.4 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Retrieve the Output as RDF N-Quads

    The default response is formatted as JSON. However, by specifying format: "n-quads", you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.

    Requesting RDF N-Quads

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "n-quads",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      Please note, that the base message format is still JSON. Only the individual results get converted. While the context is derived from the filename, we currently offer no way to customize other parts of the quads (please open a new issue if you require this).

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"n-quads","id":"1","cfg":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
      

    The complete round-trip took 6.2 ms (including time required to validate the messages, start, and stop the internal mock server).

    Retrieve the Output in a Compacted Form

    The default response is formatted as JSON. But this can get very big quickly. By specifying format: "compact", you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.

    Requesting Compacted Results

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "compact",
        "cfg": true
      }
    3. response-file-analysis (response)
      Show Details

      Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀஠洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾࿛⩬ᰡ暁∠ᰠ⵲䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ჈䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ๝吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭⵮埋ℜঋ殍ᯕ獺฀䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䀠猁ռᡠƈª゠༌ㅲ㺕)惠®愶ኴ‣Ⴝ㻐傔介㎔ᴩ̕ᰮ㏭᧎ьᓑ㕍旅㛌响㟩びᒍ䷋㞌嶯㙕緀灀⎡僄ᧀ℡Ꮬૠ㏋ូ倸๼ᓊ灍ࡅ೽˅ᇄ䎾灜塙獜⟜盝㞣皜澧眜羠ਣನ協䆪♑憼ʡ᫊㌼粥ᓲ䡅७⟜ࢀ᩶䧳࠭捐‧ኡ巚ƨ〢⇂䡍䤢‼盳亻ዠ≖め㧄吪ᱺఄ斥㋌㗔ྱ䐣㊌ⶼ㙃嶥ᘍ塙༼咞䵁䲶瀳㮨߽ಆ㌲扵燜瞳疝濇爝桟琢⡷੊಄噤஺偑䉖嗵ᠨൕdžピ嚴ǔ皳Ⴃ㇋偭༦恰灸ఄǙ儭懄㚭ၼ㙕欸晬窛䳬ִ档ኩ椠䖩㒪ᡬ⻣㭩摁ঁ५ᰧ㍪᥶Ⱡ䨮⩛䕝઼䲌瞽஫⭼䊞。㮤᥊䞤䣊劕ⶲ畢䲊䪐ॲ沏㔡却஻ᴼᎢ杶٣憕洠円ණ磿攉侒⹵⦉఍䯀琑㽦㠛浰ᦃ䈶ᬧ岏ࡋ儐疧⊜ᢳᖔ䧊犝ⱳ䵪䵻檆䬭媎䧃窈ђ㣑䪅♸ݓᚊ廓㙳႒乫䮒ᧇ䥲㹴Г器ɸ䅨⫡仹ὣ其෌筽ῢ䥱ச⒚⭃Ⳳࠛ⡎⪄粖琳⋨䭊ዥ瑦㊍⾲൳⨢᲋⨂Ꮐ᳭ᶇ܋㵮叴᤟㕣攟ု⾛溇᥸㱠祬㱊モ㤡斄奮㋪ᣯ棾㵊ëስ娘᳀庎៥Ҫ歅⸘祳桓傠氣冝䋑䃅᷋ᆜᒴ厠汖䱔᫜唯វㅕ䲫ᕼी珂淂૩䉆ቷ࡝០嫵箠㠘㺮ဣ羗⩸㘉௰契䂆ؕ㊋琼෧缇ⴜ橱ǹ喓睆獙ⴲ㈠Β灳Δध⑾䢈ᡄ䥇ʱ焱檠ۆᡈۂ೪#䲅㠲碹ቛ䢅歠姕晖┴捭䁀ٱ㨷√̘忑ŀ缔刬ƨೢ�䲁㪧啉ᄣ碀䚀瘭牣჌怀绪ᦩ။紧٥撇H䕂⣲䀱恁Ⴞߢㄨ⊦垲䑳ፀ䒫⃆ቑጴ凖᫃ᰧ̰ͦ㠶䙪੢磫犡㜿ᇢࣃ䅒揌≁╉₤ᶬ§଱ᐹᇲᭂᅑ⌂ⅆㄶԘ潂䉛៞䥣䦩ᴽΏ絓ፇ಄⚸奩䔉Ġࢤ䥂᪲⹊⏢㛇㉾◈刢ᓠ䫠ᚱ⦁ᵳ湎匰ׇ炕䖤౥梅݉愰䆮ሡ乕͚ⲅ㊉䛬糯ᒰߩ强㛬䬢堧㈶㝦⩡䓴䞫᳤亹⚶࣍᳓浝㉒㲆ᒃ枘懨ⱡ䳬侺ਚᗲ㝑厘‡精㢋㘳ی碭㳀⢹灷囪俙ɴ-ᇐ戥ヤᐢ剭ᝬ廤⥊≲報ਡ⫆౶晀㡏峾ྖ▹؞പ歝ᐁㅤj㋁ॅ⌚Ꭰ౵䕘垪㑠䩒ࢴ了〠庯ጋ䢹枃╀ԝ刾掬况᲌ᓒ曮瓳ࡵအ效屉棙昙㜵䡡䌪榥ધ盵䥵㨏ᗊ⃄ ઢஙਸ਼啺⛘䛈磇⩥乽攦妫᰻஭㼷穨圜揈峱䣅䵸䁮坋޹段⦵啧坦䞨⚿⯵㹯畦塋⛔ᯭ㱔㍹ᓺ效⛙⠠㵤樂ᕳ؎凒槂㋋㍕㦞園懌ڡ⥕㍷6奉䷄孹㓥⭼吠⅕㛚嶈瓗䳅燲涞建Ljᬓ⟕筶Ǯ愌窩伽㥰Ĝ৻ⷬ媻勑␗㺕孿ᚖ炊ઢ渍烶㶻壻⟞樽㯷楫嘾䪈㚳浑埾噹嚫ௗᯛ㜕垆㈞䣬ˍ汱㿷ᔠ௧̧岻痆㪃ℯ羋㞆债庵洣烾䎰㕋㛑ǰ沖ᄂ坄劋㬉樽䐪Ḅ㏋䣓ܠ猗ᝨเ⅏ܚᲭ⡔緆ᷦ狀Ę䢚䜁㨮䲐侾嘽㇎椭๖෧ᄝኑ窟ㄣӼ嘨ࢺ仑ᰃ䐩卲㋦᷍䜄玮ᔈ⤑儼勭ᨳ牞絴㷇櫗✤憮疓ഒ䲾弜澳䋶㍸ആᚔ媃㿬㔍䵊䶎↺ἳ㵒獬ペẗߜ漖紆㈨̾嫺ᵫ筰Äⳕ卧帛䒇ᙐ湍ഌ䳾扻ưɋ䉘ାᑶ狋ᜯᝌ⣫穮繽⇚媋拑㷅㨇⯜ᬺ秌唁ⶕ䍸㬆寓烚Ꭾ㫆妜㟚穮竢⺹煌晙娻瓕ఋ㶷ᒢ㛢淍㽧ⱬ噽涥屓◶⭾㋖拊坮曎棩汲⹻䫬憋а㭈㭧⾑䞝⟌⻿⸁牺悛媫䳧ᔦ䥕ᎃ睂睬⇹濙勿㈋增㢒ߐ眠皮Ⰰ᠑猁滱癟䎼槣⒐友㈠ԍུ悽ㇼ̞ᑧ䅃⎛ٱ୚㕯㔞伭Ⴟㄑ侵牜䪌㤇䚜᮴偎ഞ樥殣ᔭᅓ䠉㎹幃ঐ瑛䂆ट瞶璼漂嵫䁿搖㲷ᷣ⟟䖩ᒤ㳁琖㻴⾃營㤵㩇ẕ㬺焜圄溕狾樕崪᳊券ِル䜶篇弗滙繌䧯䶳傛篪㹃䤟㕏䏉媿溁畯揩ቇ淞珫怋ₚ倉籎㇗ổỴ㕇*ጃᯙ㹝扒⾅爿ऄ朽牰毢勛溾㟟⎵曣䑅ṿ箜澳碭㯯㷷嫛߄孇∛ū侾Ṓ㼑ϝⱳ➲⍘堉嫏䩼彃簦ผẎ玟⏦繲㷈爳啿ݞ彑办尘亗粝矤}⛽構箵᎝匐lj✏彋惎⥻緀⠛⿾滹獇䀘㿤㱓点ᠥ怰Ÿ瘗㰡㿲䙳㝟〘捧溁䁠倥㏰ຄ睠昤࿭Ȑ࿤㈛ᴽẇ瞋ⴸ㤠悙疓ॺ䟶纵㋀庙῵♬੏ᙚ缪¨උ㾚姡⺼ࢠ津绻㻜璏ᘠ怠⇍狇⒥敢8੯ἦ⥮⇳爰拻桔⇛炞㊥⑘䛺༧⠪㢡−瓅─㞳9甯̧䍴憦ࡀ䞨汀㒫瘁ଐ夿摒矓ԥ⋥憎ਛ:嗤℮瓰擃㱇⒖ࢹࡧ௮Ú䑊㮧ၓ憍犨冓ᗷ憎㏗㘤⫼᫧暨牤塚庩ొᙙ㥢䡄䎀ᆤ⿣抪䋄ㅦ䩂戕烰帙ᷨ充ৰ䣙ᩔ冒劤Հ㔬凈ऑ❧㩖刊న䍦┿免ভᣥ敡棲着幙⋺ㅸࠧ٥ǡㆁ౱˥♅䡴䗠┠穈看૸仦ᙝ⹡ૠ㓥ํ㇆᝘滦㙊䤞ϸ活♞熣ࠨ䠤滩爃ऑߥ恇ⳑວ⊦ࡗ煉ீ毤灓⹦ⓘ戠緧Ⲓ古㖀Ṋᚐ䨷⪧仴৫େቆ㹂㊸䮵ܐ䤷硘ᐘ漧ె᪘䡄䈠幆缕ೋ᥆॒ƪᗄ䈡敲¢䃄泤ϵ♌䭬㇥䟲噼䣄絆䱿䨖堄滥े缛਴䃁匬⧠丰啇ُ䧲䮠Ⳇ牒䫂俕ljㄣ⡐áɇ凱壺䷴佅ⱈ๺䧴廆⅜槦䶟డㄿ挚䵳᫃浃ц仄碋ᵁ榰䴔毅敻⳺⍯⏇ࣿ楰Ь敇Lय愬墆Տ折唬睦摎槺䚠Т㿭ⴂ䭿⽤♠⣺䫴⪇協ᆒ䭰婅秫Ù䥬緒ୋপ჌纅⭍ᡚ≬䟙总Ӂ྄䄙ᑎ榏玌密ᕜ᫙䨌䚆捐㤺昌率♍ṼȬ垅ㄲ㥮䊬㢇剌妹䗬紇❒ঋ䫸唅⌹姱䠸䞄Ń拙俼待幋↖䵜朆⽞ᦡ二唦䍔绿独擆့᤯䥄װ兟愪作擃彙梯䧌榨È悿䳴猳䱐祄俐搵佒ᦲ䊠ᰵⵎ֞䲼ᬒ㍅Ǐ䣄㨷惝ॗ㇢䭀ブᦤ⭾ῄ匱㧰⽈䓩㩓㑫䩸䬇ᤢ䗠Ⱁ㌴㩜㒵Հ冚マᇊ㉐⣂㣚䇼⹌橆罁ոࠂ悷ᡒ狔㒲圷浹ऒ䑴⯀磎㇚㑲䋀皾䕇स嘠㓙╢獴䲋瓇㒒儀⠙届䗹䱱㦴ధ懿䭨䌵䑓ᣖ⨐冴㱵敭䪐綱唱⣪狒氇䤳◩࢒暙᳔熹䈪德◶ᥱ⡈瞶獑㰤䋤ᬣ涯ᣊ⤄溥浉ᔰŪ婴Քᖶྔ做ዉ㲙⥙㘅ㄧᘅ⯬➙䫕ᔵ⠪活⫁嘉⤲倄⍟ԯ憊繴壇啇ᐔ湴夼䣼ྛㅇ⣑⊍䋤ヴ嬯֬⪺䳴⁝敔⨺䣶㕈䗣烪构捽ֻ⾊掴瓒四⪿ଷໞ㼖哺卵⋯㖥⯈羅ǯ㗫Ⲻ䧵敭䣋䞌琅ブ䚏⸼淵ُ祸Ț内Ổ扠濕͙⤠惼⫚溸⇊ඓ⺒矂ല෢⤦戡懝䄩⣄㜩㛈祙仦䉔⋟䠤泼䅖㯬䡓䦭រৗ▹䛆摇⧖ঠ⼢湔惛৬欜汻敓喬⤜搘擑़湏㈴懕☺䙢绵䋐疹ࢶ婗䗅㠷Ⳍ敔㱫刕䧆敺嗚L⳶垷ⱬĈLj棗ࣿⵕಶ具滌乆概嗕敠vॡ䲇殘屦箍㚚寣⬍ᣋ⎇婥 ➋⦇ቢ嗭ያॷ⭅ؠᲨஎ䱃卨㥱㸪炨対␯类᬴⼽乄➛媓悽៦侺᯳庠䴎㉫ᄥ̠൥ٸŦ峮៭冸k媊猉ቅ㫓妍笋ᝥ㪶唽乫㞃㮻坊أ櫋ᩆ媂ȍ㛖䮙Ḻ刊筷㮨敝筱丩灀म羌斅ᐷ凨䧃᭽模嵲ᛠ潫௷哝ᅫ➺タᲽ燎奰副囘爍᪅寏忭⣴牣箫愠戱㈴⃍呝䰌″凿娝Ή㝭洟奘=᭼嫿娣ᮎ禎匽庝९掦҂堕勬⎌ٸ庣㥳ى熵兒氼潪ݣ壥簸Ὦٚቱ䎉⾖欚ᅣ‸㽉ჸรᨌ劣ߺḅ 欀ᒸ䛹╮ຳ஛罾ዬ成斪≗ᔢ❠à岫䇥ࡨ殣剛㼂喳书剒抵ཨ滺ⶨ油ຸ固婛笀皩➻ࣷ冣Έ爳♝冮䔈掬瑚ᢶ᚛䅊ኮ搻൏㭨䂸∃ളⷦ⹙崇ೢ㯫㹓憽咘烦䝴Ӕ㓘瘋ᗷౄ甐Ω冇ᱶ惈ユ 䲸ʴ᎙寡⒅.ภℨ憸ܬ⾐沬㹀欖ᾰᖬʐ楄癆ⱻ⨅⁏嫤ᯰ㘼㜤揤ⵙ怼㟕░భ偖ƤΙ 娨ゴ忇͕棶揻唅┢䢊䴣叇嵖䛥俺嵠䯺榻෌氠᭒坾䱐ᲆ䍗䘸ਂćፗಉ东嚇獖❍䴌癓㝕樐㟌爇忺糲箌昆㵙扞䰬焆⍛扸઼碇䪡㦰Ƥଇᖎ秛䷃⨷ཕ䞇䷔檦磸儸B縼答ל〢攇㽖㦰⹽䚆獙⭴Ⲝ榇䱖䃔ⷪ䬥ⓓ㈊ⷼ簒ᣛ䘀⿦ᬶ瀩䘓䰲猆䓞൚⺜活㳝慙⬈ഷ⽛⎁Ⳳ瞇彟姆ⶂ灅泟䗯ᨲ笆㞎ᘈ⾲揥⫗؏ᝈѷ浑᤽ⱪ氆屯ᖶⷪ晶᳘嗎⽊战ۖ嗇眱囶嫝ㄠNJ疉௉浑⯎ඁ䭲奕滑䳤毀弥睍ǫ殖布⪹䎉歭᎕簬毊ᙂ婕俬⚙䯹⌹秌ᖏᩪ峋⊍凒䯾⡄Ӎ疑⊥必橮ᦅᮘ揞⁌㎂䡡墥碊䮏䰊墹ᎎ֛攱֭籯掗⚽引禎綖安姍斌ⶋ᭶峋ᾏ䎒晑劽璎硹䁎电呺ឆ溲桐ᔫ劥ၰ棙棒䪎ąὌ啭᤽Ꮉ᫾۶犕㠥ᡞ⠛ㆩǾ䓄➃Ю攫䚴潱㠱㥚儝䩡䕸,䐄梅垍෋岑獭ᓂė♽琛䄒ࠋ峽䰣㞋⣛奉吡䪇ਵᤝ時例ጷ審瘍઎筏悝朓ᾅ䣏尴㰏ྋ笵䈝戱羋搸䦣䃇ᚉ䞑皠ㅥ緎᭿⪫ః夆ᆐ㪠ᜌ瞓䮛嵣䈏儈箿廣稌瞲簙᱉渏紡ˤ㪝䰎䯢䜫䴝暾椗䤔㳋⼾ԟ䠙氃䇛㳀泣懑禾ѕᏥ䌳戎坊䟲㻩岿焑❋♳剦唌䠊㨊⚾㔻篟思碉ⴚ洮䔣卩ⴞ榐â熍Ռ᝱㹂砆洍߾璳嘼Ԭ篮㯣䊽㳬ᙊ㵃社紓ޚ怫崽̈ັ㳼ㄷĞ᝵㿕̠怠氲ᇑ䍽ᬓ㤐癫碾匁杲㣫举攛᝗巫縎㴀坞㳃嚾䬗⠅㭇⭽቙䝍山᳿ᬉ䷫欃珔㟨絊甋綾⪓筦؅Ơ岬ဴ䔂啮⊭ᨘ䊨ᕂ䍐㣜ᕏ⫐⬭Ⲙᅝ彼攇Ꭳ㡃势ڿដ㮝徼䬆䞡㢃縚㟙㍧段┩‣ʌ侕焖翊䉐礋缎眘坂䝥ᇼ怤瞇㪬׿ྠ惷㷛燃㴮←ʛ亰弍ᎏ㫫嘌猐䜾㲝壿缍࿺㸧敹∉ྰ䤇升㳌䠰㶧竼Ϙ䚜綣剼刂❝㺞ٟ༔瞸㯧嗼漞䈩䅇揿悢佊⊓渾樈㠔稛棽缃❌窻兀朆療硻緍翣䤗⋡䭁ᠬ᝖᢬㷜ⴛ㠂缋廽☐睒秧概⼀侪篛䫝䨍⼾÷畝㘞❚缛擃瘛柬竃歝䬄༯抗䡾⅕Ἦ紏ㄒ⭊巒爍檺ை▲ṧ嶼☃濏㣩罼㼛⽿㾓廞ᨀ潥㡯營ဴ濽⻯綆㯒潴椏熝恕Ӌ曲᪞挊ऻ憐䰁ࠁ濎絏篝刓⼣㧏宽猖ᾥ㢻羽ȉῤ嬿愝‭ῑ䨗ĝ࣒㼶㫡琣ࠎཟ欬᨝⠝啛㭏婜༙棾箷䕑縐佪翛楟䨔ἵ糫䒞崘㝂ᱷ眻䀾橚㠣厩廩筮ඟ௝ㆲ忷㽬緜勀崞䆚埉㽓傛禫损ؼ咔㿳ྌ㱿癊พě਀篐㻯㦧楿㯼⺓叺ὓ䐻环僾朘㠍᮴Ÿ̀᎟㡜ء׮⨽⇵ʣ啬㸧ⴋ筄⢎礀᯷ᔢ㔔䟶待簸ൿ吡䔚堹⬰䅌⣈ᖮ᪁㼱࿵䥰䱤ࣆౡ㓚者⾭ű秷挿Ტ‪ᯥ䃨Ωヰ⌦嬦㯣氫エ嫀ᵣө⮧┩悲籲眰㵎䤧耋₉䈔ұ棿ᬝėM侐槼౴౰㻊ᰳࡶ᱘䋘┭㊡ၧᣫ⃤䎧䋴Ձ杣䲋㿞䆲稸ᵠ柼䰑෼愘絆狐㗞㘦㌣&⇩ۄ᱙ᩕ㔪⑋Ⴆ䎕劉δ㭉⡣㇇⇀ᄶ■瞢ت可悥緄ै⠡㊥ᠱ⢘↻窄⪸ὢⱵ瑛儆◿捻寖湛⏊塷䅽㤘ᡰ咢-毬愀䌸એ媁ࠥ⨷撶憰䭘棷㷉汕⠠%ᔜ␗屉烸Ȧ৸⢁稛ⰆᢀĬ笼ὀ斢㌪⡜᩷䍘౻哤つ倍犣Ă䍜ᆟⰅガ恆果䏫瘸〞冤ื₆ム޴ởぃ嘬佮ࣸ˱剤ㄡ欲ԡ⺪ȋҍ暡ᠴὗ㱅ऌ˞༯匱¦搰ѥ䇬вᆐ碉ᒪ㝯㽆䐉਀㯪ム弭⑸権ᬉ䙈牃㨮ᔵࣙ絹ਘ⬱䂤焹ᢉ战䞼ះ㢈㊯ɛ弯ক຤㫤䌙帻侧䉢穲䊈东Ἥ⏱杅⎬র㓁乥然ࡶ再穪ֈ䥂Ⴌ″椐嶘⑏䉱欈㘰⿐磒䘘➟ⴜ皩ౙ⤖⊽ଓ倱湥崽⢊擁䘊ᄻℙ⦪ᩉ剁ͭ৑䝑步ᤸᡡ∈䔸ᱰ忣瘖㩊ロ≂ਧὑ⽧由᤽㆞䓢䈀壁㦨ࡐ㹘䍥ތ⽁晧ଽ硣刃ࠜἸ坂朩噂㹎抛୦䩁✦猾ᇛㅃ笞ϸ䷃砒䙃ࢸ扬ऄ⒑ᝥ䀴䲅Ⱬ䗆፛ިު晗䉿憟Ь⽞惧࣮㱸ㆎてᯐ䦂䔬⿼壃䏗ૌ㗱燤滫㲁燕ぬ䐘樂‧ṁ㢤⎈昢⃑㥤ἲ撔ㆣ䛞ᐰ簂᪬繖ダ㧠俌㵑䩲傼汳幀ⓘᲫ⦩塨䅜ᢥ⋷ൌ☑䎧悴枧燛䖞኿ᷜ厮穀䓠ዣʀᇾᙇ⠄ⱺᄣ䖶Ṥ嫃ᖬ⅚䔄ዩ暂ⰾل墴䲬®䉾Ẉ娣䞰⨲ⓢᐏโ≡痦悳抏湇ڤ၄䡂╳䥃⡡⏝୏ṩ䁆ሺ䖺㱲◤ↈ昘◳㽯⒥Ꮩ⊢㿑筧㢽䒚䤩䖮ᡄ弙噫ᥗ磪Ӝ䷒〩繥䀣侭䚡✥Ụ柣๩䅙擵⍼䴼㫑ཅᷯ⑸⨛祅᧿㷉䖢傸塝⇬䥮帾೅‥䪚�䟹ᓄ澢⩮䕋㣪ᐘ䱰ケₓ犸⪞䤭䓹⟰䍳撨䗾᝸⍌焊㯆ᗦ⌼劉য়׉ᮨ唲㕭牂垎卢瘾ର仇᥏்乘䎶ࡨރ檳䵍䠥卫書㛱织Ἰᩫ䧣❵ዿ㛃捪䵞㓥卆䡐Պ㗅亻ᩴ槨ၠ๸ᧂᙩ䥂㉨崎䢚㎉嗧㚿墌ㄳؑᧄ棲䝬孾᝗厬❚⫊縃溺٭椷⛎ॱଙ⁩⻸ങ₪ᄚ⿉㋄ڲ咅⥁шᢔ篂堥㵙ೊ䓡䶦┹甧‧ৄ则硋䁨Ⱑ⣬㹋䓒጖佴䀉岇ጸᑙᦖғ᤯ㄐ爱敂絷摳D౐拆䬪⩾戞ڎ᜸啲ⳬ呐ഀಙ丶⟩⣒ֻ晻⤫妊ࢗ㼕䭩䚬-㎽˶㟑ๆᔵઃᥑ⠍ፌ佂狨㼷Ⳮ㋖疬䛹綄∃Ƹ2ሓᕈ啘⻬渤̛⳱ം⧩厅ㆱ剮᧒昃፰柒ᤂ⭗♦嵽䭶␠卧涣Ⱕᥡ䛲ሂ㲓廡⓲ӑ㊿༚㉹忄Ⴑ㙾爁凇ᢼ䬵䗮愩卆䠭Ǜ䥪ⶩ勃ㆵ㤦䇩᎗‐瓮䅜咠狅仦⠱䌅䵊泃㤲❗ᄳ㟂෩坐㴙璲༇凾ਆሀ⫁ㄱ☛ኌ滲曮㍘ᳫ㍣䦱᪙梘⸎䉬㐱䎇捜爙㳀刭泊㉗扞㯹㴦綼㚛㥫昧ᜄ米婬ㇺ塦劗䤉崙夅ࡧᱜᇘ⒚梠⠒៯䩊粲ኖ䳦㏙ℇ㮳⊄償晧᫆㐫l䀸䉄狏८☉䠸㎴≰տ⑫ᤈ库勭⽇峫㓰⻖䢥溅母繭ᆶ⒘䊸ᤫಬ杓̔㉠⨚㢑㰴⁰䩳㲓䉦ڤ刂ፆ僓䌆护෎◙涄㱠ᅸ稁▍ტ互㡎ニ峤捀⫠ᑥ㬆ⅈ八㥸玹槀䉒凯⣕峨劏䴡㜥夷岸纆峺ᙢ⣷πŖ墾҅爀䒚㝉​Ⱳ幑̂᚝᥂瘪䎨噟ᴜఄ⧤㞴✵㰊繤撮ᛸ徊਀儡䀿ᥠ憤ⶍ䜰炶≻ṽզ朠啂䞪澩ノ⋖੄喩≅㜸᲍䦜╂䦥潮㎢ᑎ㵑≋ᶪ⧱↙㴵᡹熚╦ᛵᐬ焑ᕎ屈匙淠̫䈁䧡堪呇ぽ✯ײ䭀㵉ሯ劷૱伶ⶱ崄摾Ŧ◦᝻᧲睫㵏ᵐ㌁䬚⺦㝆症ᴡ䀾碪䏀ಀ⃡絈ᠣ㋥勳ݠޅǣ白怵◷撃᭲婫و㽑劻壌癙㓜厷乷奡旍ᜯ଒囪李⍓狋䯁䩤䤥楆尾⥸⹀坼岲箪灭煋拶ଆ⼮刵␅珍瑵买囝⌯Ȣ⼑࿥䢌⨠⢒㫅宵♷⥣敨╂堭Ŋぎᆿଃ綻ಎₐᐇ⼲゠ᖤ喇წ渒恏彂䫇䩱掅⚵噶癲ᒕ䒚晏☠ᙁ伱࿬⪭畅⺥⬥䦷⑶╬攭ᖭ᙮ೊ䯳䫙⋻㉅⿘䪂㍃ޥᖆ䗊㊐�䆡伴᭞㲻䬸ⵅ㼅ᕶṶ喛抆呺匫㏋挄㻹䪴ੱㄕ⻩冇桱ᥦ煪嗺只嚲糏玧櫎ଟ༕㎘ᅵᩪ㻗Ȅᙳዪ䓥ఠ⛖䊬લ⡵さ咴⢾█㖮埰檺䰓屉ᛨ嫸牓瑕⪙枛䵿ᕻ䖪唆弪絪໊孚㡛㳌熕↩㛵䌇啹享ᒬ奰ɡᚓ盓堡残⠭㕩⚅纽熆▹䍐ђ潫⏎屘㫱毨㛦叵䨶安⑑ᇢ҆喊䱋痋䋖ᒽ戡佾㮐淴ᲅ嶌㔫媣ᴲ䑊㯌⥟欌玁⨺▙䑵䍿䙭瘖散ḅᕀ咧⻌勳ট⾅㈕乷瑽ᥨ㕇坆ᐦ惊㇆䇐Әᨬƙ䒞і㺋檝᨞斒傂緋㳈ᛒ⠴᫩㊊〭㿵䌎榏疋ᤂ䖈┵䛉䞪䢒᫉Ӄⲕ⟴ི絴疏圁喠᤻倧凍塯泱唃⊭ṗ浫絪ヴᐞ帪儺⊉拞窲剠棣Ⱝ整⃺暅Ⳣ㗒Ն䬴⪍৖᳿氀4ᥰㅕ炸䁖䷜偩Ნ濊㻬曎嬌欯⽖㪕䩶㌤㎎䷆㙦学κ⚊廄�毼࿴ၥഴ羿߇䶦䎙噂旊቏ໂ唎⬂䧣◕๕⤥玄烡㘑嬶恻熋坜⍍㌷ࡖⴭ㜄䥴ඎ㗸㠆崶暁㾠᭍ං媽仑̑䓷Ꮁ嶌䛠㑹嘶䞒墌⧄ᴄ捊溓⩌㛗ᬰⒺ㲽䐉尜睺᪥痌曫琊檃⫭ᙔᅻᦛ略㗨䡖熊凍ᢠ㛁嬠俚⻪㻗戊孷稉呞婖栺睋旙囕玳೻㺍婐仵厍湸䍠¼搽䢌巚眏ㄸ毻㛵ϖ⋰⮚礡祽嵢⏻Ⴔ緁相僬剁ர倉ᴥࠬ焋㔟⛠ၚ℈䀬ໆ疦氡㞍㥗相浾㖰㙵䔮着ㄋ䏔盏ׁ横㘽炖掹䞐ᴤ瓸扮䱚侎⏅直㰒潧㱔ક䧹Ӄᵮ䏅ᾮ桚૵廔戶㮁洇⑍圴᫹䎘ඏ㟳坴筛㴍塶᤾㫂v倽Ⲕ৵࠶п⨙央磛ଊ歬㌔ᬷ侳㡕ᆕᓰ杺嵪瓑ⵎ凚猎ϝ嵘C䷥㪭䩰⧱㝵已㘚咮盚⤊Ễ㔝㫥櫧㻽岖瓧㞙㪶矙兮乁ℊᏚ溵㭿ሯ⑝碗㛳᎓嵕ᓳ圎䇲ⶈ揚ༀ笩溯⁅ዷ㧺佴㶡甇哔䤝ሊⵟ休䫦梽㦙噕⛾捫䬙眻孾姚儣⟆⻻ԫ濯㧝猨䯵垜㷙㛳墖䄪㞂៝廚竑檏㙽潊ߴ㝷ᵖ⇗奞枛妉嫇廤稫䨑㣈ᨔ㗵᝺縍ݘ⴮䦙䘥㉹⻲䯤溿⬽帗矵❫崩瓹囦慻Ⰹῇ打箹槿㼝⬻䟽ݷ丄痟堶稛师㛉㻻ᯆ淟㠽砖῵䞛絾焧䴯ћ⾶槑ཚ嬗⫭㳝㰅痼侘㑐๠㌦䞨核悽曚瑭攥⨉␖灓㵆嵣؀ᴟ㧽〗揽罠糨༟劾柖៵㽵㵗田㾺㗢ⲣ悞橙؆疑䱐Ḭ䡜ⱹ͸竫慡儢吹ၙ⽺٣矀窽䘮彼愚秼ཕ槙ἦ⮒⁞᪻಑ð恣㑥ѐ₈䐆⡋摯⒦怖䢒䂿篌澰畵ᰕ㑚䵫૖౐೸糽砿壍猩ৰ⧻㸣侙‌ჯ弒簛沁栝⬐偐⺽㭾湝⏽㊓᱒拔⌽৸㕞皦琌࢚⽿ܨ౐恃မЇℙ䍙㜟員疧⟏䒖᤭ۆᖌ䰝⨗悭䉄嵹㝄㘏⩦ؾၐᇌ䛬ᴨ痽粯᭾庅␅໦◱憥摔⇀⽣稬浄�䙕瑒ᄎẴസ㦱咦℻ៜᛆ宰ᩛ㋌ᆮᢩӊ捜筸䄞᫁⹐〧ㆽؿ煨罣䦭䑝ᣭφ෬メ幦嘸璘盝䛱ⱃ⸒箬䕉ై側䃉≟ᤪ漹⥩ᇽڮᢸ矾焭ᩛᤚ廍๿厑呻毪粝燣ᗱ⶘昳ឭ㪉\\ᩳ疜㲩炴㔻粎刃䜡᭘璡ம䅟ᤃⷢ瑤㊡䕽⼿⊚洪➽Ӧ佺ቢٔ䵷啷桄寚桻椖技ਟ߈ῤ硃䉭⹙ㄅ㴥ཆጌ眒娌․⧭⒪㟎⩳ή瀿磿䍳಄㺑潆䀒ኈ⺥᪶‏㾵䀩ⵅᓭᱴ䂡䕞簠ڹڶ⨝帅᭨燃᦬ग़唟ጳ㕖天孓ⶴ᪟㾇♣▰媤䴉⟽㭷叟฼㇩䋇✺⪇䨒̙ᶰ笃䅮湓䷇叙棑␉沆夅آᡋ䪭ᩬ牐༮揵烳ᄃฦ㺱睆☹⪆↫笄Წ燳批卒䴞縵䱷ᚘ瀁簼⹎娅ܝ᮴恓䭭ŝ㔁㍙౏儹擺䊿湑娖嵁᝜➣焺缪搰♖瓦亘礆㨭㊀⼖⚜᧤殳भɚ഍吁䰪㯹咇懆亍㓕೧᯼簼敩†䡕帬併倦戡盧濔稞㳦ᣔ懃盯ᕖ峱㌶࿺㚮摦㞆庑奻枀璩夓忮㙗ගᵿ磘㿬沴⁼㷣ᧇ㫓᡼缡乮ᕟ䴊珹ජ㉹圆於㛲ג㰾ᰩⓖⱍŸ৛焕攱㚉瞧災暊樇晰孴汃弖㕒彩䃳橜㣥傺䔒俄䃲៓ᢜ攃㳬坜椅挻俞㝮栆࿠熖ᤲ΍獞䢃怅ḏ㴋㎯丂べ䰆嶹ⓓ㦧⟾湬㙫甙渌⼱㢋ْ㍶榨☂㝮◥昰娬椫繍䍜⳯㐊⺫噮ㆶ≬㲑斲טऀ碣ማှ狻ϭ侺㽅伷ᑹښ䗛❇⽢捫䘨〽狮ஂ䶙㧡单࢏㢓∇⇂ᴂ渫爬˔糰⭍ೱ㛱䑇慿ڪ䄴垂噪煋⾑怬᪴⁉䂏ނ砶円愢嗊囷㓤翳㍌⣙䫲䯡⸩㨵嶶≻懜嗸䬺峯↍䍗站⫡䋭䟵㬲猰儧砪թ材ᴺ窋姎䳞⋻㎪⽁㶵䡶ᘋ֞斻奆宧⊰᧌㯷掂殴䄽㑆棷එᄦ掝囎弌֋瓎煜೧⮻ⶕ㷕佶撸䞲痚瘎帛㰋母䫑⬉ႋཁ婕灖Ⲽ碍䦼曶庚掋Ō泖勧玿⸍㘭䢰罺΄①㞂⡔ݳ傌⫓䜃帆㛡㴭䊷ヺ妝㦤㚤小▝緌৞厈殔涃㔰ᦀ磗䍜ặ᭦妆畖哌䧑䬚氄滞㮱扗䉾⎔◮㜞㈘攋્㧕ȳᰅ梷⌠㰢㝽ඞⶥ₵娆箫⟎Ⳓӥᮏ侕㒭狧⠹⮒㡕㟷檶悋ᎎᗕ嚳᭓䖪ೕ笷⍽宔⢛㞜孂爋旯œ㔀寽伫㵭䴊Ẍ㮋墷㟭媨৻旍᧔儀玘滤夽䑗ᦺ䎓⶯㙛Ṳ甫孌෕哿⬵⻧㽭嚗⨿㗩不ᅇɢ䍽植∨⻻ᄊ滛㗥羶嫻熇⸏㝴嫆纫羏盞⼑㯠殚᫽柇淸嶂嗖砀຦庋঱㯔⻠笯⿴㟭套痹⦙笝㙥屖格ሌ⯝J᪽溭㿽䬗㷽䓒挬敫姾翁㨄Ꮣ⻲㭴⻝㥭崖绻姀ᶪ堗姮箛紹㟽㼌☕䴯㣂㻷簺垍ᖩ瞋崖珓唎緜滵簏浖㈽䤆㿌ޕ墲䨬峜羋➏䟔崂க涛㍝猺៼ĀǸ໛௞瑛ⰽ᧑ᆭ࢈溷㾣硗灟ᦗ䗿癳姪簳勯狘弈毤᷃㹅累筈ᄑ䑜ຑ悖拋珦䢖欟᯳瀟㓽楆௺綋䎮ຸ㴱殛⢣伿❒䍤ᷳ䈝獶ⶽ㖆ญ㞰㠱洧ℼ㏑掝ࠒᲠ盝梮㉟果Ϊ垭ᥕ᥻ጽ嵔欁簓伓㐝犗ᵿᾝ瘔皉峚狧⇌㧑㇩后⅓㭡禯俺翧䎵ະ㰞檧㑌㻜ᇪᬵ⼘纭羯ྔ䤉渓坘㶩ⅇណᒗ猒䟄滈爳囶䠼椅措噲㹚罧撽㬾㫳ᮿ敄⠃拚䪤唃⸃眰㣁懧㶍ᲟỶ䠖㚭ㅳ刘ㅞ唒ᡃ礅徸㯁Ⓗ䛓∢憕ᲄ祝噯ᑙ攂ᛜ乻奶悇༎ṟ嫲憯瀍ㅺ䵷滩䞱㗎檃榢椛熽沚㼜ᯭἄ缎棗᧺䶇㐗༊廹竕䤿ᣄ᧣枿滸犝噷䝚ஐ⏓乂㬶懋㩋䒐ᬆ桬渐㵸⣫◾̓㱠佒㸩檇㟎五侗朷ᶣ婾я嵟̍㌃ྂ⥱㟭楏糺᫶ឰ屬紫卮὘椋珖亿媨ἷ溿熔曶偏濓㎓䕶瓚㚍Ꮧ㟟嶙昋瞼緙稜᠄怍㳫愇罜匌Ћਖ崼Ý堎úᬘ圤帼眓疶❙䴌䰜亃彥ᬧ᥽᧓;qΈ㩽囎㫚ᒕ䰊瘮㤅渻ռ䦒樅笸ṽ㷋扦⇿欄冬⿢⯈゛پϩ㫫埒庺灍䨯掍጗䮵⾽㦈㬧暦㈹ሎ垲岭㐭懏噝ៅ玦倌㭞煷䖮暔Ǹ᭥ಧ㤋棎ၞ䑙渔ƹ巴Ḩ㧍嶚卆ްửほ叼Ḋᬋ綤์婅楗୽憜彼朥ᴧ㾻䥰䗞愌ᶮ漫㣠ቧ僩䌡఻᭘崟⭭䥀䏙粆尘瀋㲉燗湿綒淺㠘汮籛瘯ϛ⼓⯪౫㫹擧压➘仢㝧Ὰ烛族桞埂䯍⹣㮁字ʾ㌱娉秐㙛㾛城䟟䬗ⷆ溵㠭痗撼徝槠ㅺ㚓よ؃⼺唕ᕺ㣞ᶝ皗䓽㦘漂砟瑾翕砾₞㛩㏀Ṁ紣獷㓣瓑㳱緗⾁甧礮゙Ἆߓ潳㻕擧ɟ㪚擆ᱮ必夻绷ᦍ䜑碹溨繝搗叿ᮐ䏭綬㷻ሽ缔䃜刾淐⺤绍禯刮ྜྷЛ༭滯㙧狎㿘ᶘḂ伴粐圗沌䣚⻫ஃọ㔫崏ゝ䨋䠋穞梆撫ⅼ壔朗珛汑热爇Ҝ֓䮲Ḭ笝榗੟㇛㐗➶㻌穕欦㞏ẙˣᛃ㶩⟯ῗẙᏻဏ峩窣岿忞⼈᠏វ绡硏�ᶚ惵⟉㾉缍導ຘ爔䟣Ḵ᪣㯯潎ጔⰍ᝗檷㇌杕ॎᎌ᠛ử㧫槯ᓿ攛అ᝗椪煷緮ଡ଼國寧佚納翗೟妕䯽⾱㸚紷䮿࢟䴄㏊ࣚ耋桷ᖼ朚右⒋Ჷ㶇䕷ᗸ἞叉Ṃ縕焣束㤜㏺澆潉瓍祯瓝༚Ʈ临㼳盃፽ܓ瘚䞃䀍灷䕶ᡀ羄᷷廴᭳烧彂护᨜温㰭睻硿妙ท㟦庂經簏�֟簃涒氿ᤓ䉟↜渘ခ庖硸撳⛞∙ẗ➳敓㥩僮Ԟ␖矍幡罧碳൯䤑ᯥ⭤粧㥩繟炸粕㟘廚つ瀿㈾欟㰈➉滔砻瑇ዾ⨟促⃗㿇G↿疝਑὚㸲矇掾军昏姃㜗㴷湇機㖛燭寅ᱶ矷熏枘礄叨ຮ塻滯盍刐篢忻䷰盻懟嬛眈叔῍緭棿ᶟ抒噊幵Ḍ常㯟洝焊㷕࿙砡檿Ṟᷖ砐㻽座畳Ɩ崶Ⴄ幟ỡ⡓㗛椞儆壴徹㺳皏䂞㳟ธ῞皳綯笧␀搖懬ؤ䀳桕䡳☛ක喳㼘䀗窇炟㐞庛ᦅ羭㧬䮟嘛ፀ佘ອ᳏篟唞ܞ俷―纃焯䘏丙愒ϖ繇緭籼䬟⛞毯㿮䀽㋷敾玻䜆埳㺧綥澏⍝妷Ό欫糅ᓟ紞殤砙䀁ὃ㼿榋ㅝ⬟娔徒嶳纏伟禙塘翓嚴粘欟砞᜛慘翰䡙ੈċ֞☝耛ⴢ3矨Ꮜ徚弒綿穋爧ࠟ卨!瀢䠘ਅ>ᨨy罜䰤ᲂ੏灇䖠⒃ི毜墸䨕␅忱接弬ᜐ͋簀ഐ⚂媠箢ȣ㐙᠖焋䁊⎸䜭幄͙簐瓯漧垟ⰞʘⰤ倫〴恀体ࠥ繺ؗ硲џ懠㼟㟎渣䐚⨒搆ῲ₁罁⊏糄ڿ煏沟䬇〡儢㨤‭樌⏺�漪ǔᶐᇯ矰ᑀ㶇ࢡ暌ዸ䞖䄄㽼㾬孍ᔝ粡禐௏淟䇟᏾縣㘦姒倌灕根置⁤數ܤ๤䑠○ⲡ㯝爦㰩ဈ濯㾲罐䅳粲ֿ瞻挏喠婡㮜㘙縖攋ࡑ₈缻笃絒ն犿汰⯗᨞㐣$】漂ᜲ必⃤从ə窏熨Ṡ㘠旞猢…ါ1翷׉䐤Ř䂰ާ㋰၀㝧ᒖ䰝ᘛ⒒帋㿦掦罺给ͺ֘ఀ៨䊀棡六䍻䠔䰹篩刱₥仚Φ㦔ၞ浐㶟ਫ਼眣猧᎓䐽灙ひ缵仅Ζֿ甴෿䉠匞ޢ塘఩䰄ごྦᾜ䈑ʜӜಿ杠㨀尮ઢ崧倯࠾ᡓ偠惐DzɂՈ犨ᡟ䗀秡澣ᜥ⠨䈴䁕ₗ冞䆈䍔ѲᏈረ⽗ỡ䪣⥘愯┇є䁢ჯ溫ɿ祼ൠឨ⟀壆䱣嚡ة戲[⮪し呶䃳ơ㓹歰▰壶癢涢㤮搹᧸䯇བ䆴ɚۀ඄ᬁਠ㎀Ţ⟠Ĭ䨷摆⡧Ⴓ炇紪㬻疀Ỉ㵀捡徝䊧枕昆ᑌ悆屾繺綛㢴ࡴᵟ䧡㏞Ⲣᔦ㶕〺෥ম僨Ŀϩ篊㗷␿䧟ᵡ㭢䈤ᴭ劍塄梙㝽㸮Ȭ殯爍摈⇗㺾ᠣᒥ怨䨹㑎淝彾䅰䠣܆犄 ⦟త䀹Ⱔ㌯漌⑍䮻䄆䄾ȶѼ੸ከ₾㚁⨝斤⨮漇埲渽₼慧ɸ竬২ጫ䣐剁ዣㆥ⾐娵㷬羣ܰ㜀䈤Ӑ煁朐∟ڞԣ溥ᐬᐱᡐ㢃ݕģ䏋°獟棩ྀ匁懢爦ବ∾᱀傇僅繋䊤Վ୴᪈⾀慮烢倦㸨吉屇炕ი慵ȳ߲๬ᖈ㕐瀞䬝䈑ᯇ䀧塅硸W懋䏂ߎࣄᱸ⪰榁㌌ᖢ弫ⰿ䜹碐࣯慠ⲿۂ໔h⼰䨁ᝢ倛⌯㐼㑆Ҙ桉纵ʌԖ烴ᔐ⯟㮎ൢ亦మ䨊瑖䖿綖懈⌐䘦ࡂ᭘㬐淞ኢ栛ᢣ永扛碜ჿ懂䎰䞪ࣂᲠ⚨挱恣壛̭罏桁ґࣄሟ䊃֑຤䆤⣨աῌ爘ࡑط⡖⒐䤍廂⋻Сऌᓄ⯐励ك⊙᢭椲扌䡻ࢣℼ⊭مᝰᝨ㶀撡䟢⬑㤬㼅碻℡䣳䅍䉗ޤゼ᧱䇨佦㴨א㖳戨坣䆰ーợಜ䗠Вὢᇨ䆁㎢羥咯ि↸ᒈ⣻懣ⳁ傥ުᨲ么杁߽䧉穃┵尹⒃缾Ư㷨䛥๪Ẵ⇦㙱畠ᴱ抮⾧枪䚭₩䒵⍉͵෪ᩘ⽀䘁摢攁ክ礵⩃䡏ඏ∽≢䖕ຼ䅴㥈冐⩠媠㊪㊁挮ᑨ棑六⋨әூ戈㥑ά᤽⍧⺕榬婚㒓ㅞ兖᧖䞥ஸᴄ⩈歱䋃⌳ʭᔺ瘨㒏䤌ᄃ∢筍૚᭔㲰笱ㅂ⡥બ崼煸冼⣛儷≢䝗ኡ栴㠙ⷱ箁Фᬨ䨂㡂ᑡ棧凱⎾䒽๪ᐔⴈ旱䂃⥧ኬ⼨爧㑼⤄㇃ᔨ䟜लᾴ㓠滶ែⅧ冫䌰♚Zឋ࣫⏻憦ℿ乬㵮⋀Ʃᣤ䜫䴸㩕摶烅冑≉䗳୦䵬ⳜḄ潃䍤屧嬣லᮦ椞㄰IJ猆๕橨⧨䣁捂佦㢯挽篿⡈壂ㄪ戥䙃ฒᲀὺᛪ咃䥤㖪╧໯㎬惰㈛⏅䑕疶᪄㨸竑䶃岳噓䔻噋ⱷ棈䀰煫挿۶ᰄ⧸旼篂䙦䶬䌷ᙂ汨⤗ㅎ抍䝅࠮ᔤ⑰߱͡㽧純庀َ0ᣕ纭䊭䝖ॖᔸ⳸幑㾃Ԓ掮⬽⹽嬹ᣘ冂䕽䒥࿮។⥘绁澂䝧咩嶬婈岛椄则戽䒎掀ඌ⪸婱挡෧疪ᎇ㿭῁䣨儰揫䓥཮ჼ㫸䶑彃Ϧ䎮ⴳ眺དྷ籋ổ⋒䝅ࢾᆢઘ懡礂⃦㠫̼乄悁僔焲⤂䟯౾᳌㞘䒨䠌禹㵄ំ羫楝ᣕ慝抅䔛བᖠᤘ毄暔柦絇࿈૪㻘⾂熚䍃ҏ॒ᗜ◪Ⱁ⦕Ź䳃㿢簾氮཈照甓ᢠ䯖⍀⯘哑匂⧤澭缱㋪ɳ䭤憰፠⟵悛䋷ତ䠑࣢猛㾭✻櫿ᠮӸ搬Ð⠗≎࿤〈籜㈲ᓲ灭Ḳ≗ᖭ݄৔ኧ䩜㖁ᾊᑰษመ居摄笵㹌岓ᣫ慠熘╧䖬䩂㎤攩ᬸ居桨弳籀≢Ӟ煰拐è䮁ᢸ㕤磘רⅧ朇䝮䀪ഴ₞℻䣔ঈ伛毂㽤憩ⵙ拦殒㐼㙞ɡӤ।ኊࢸ䧱ၘ᳤狁䅔晋ᱨ䢦ㅋ⠡䔗ণ⊀ジ䴍渲嬯ⶱ䳂ፁ䯂瀢੘ቭྈᘽ挭䛏ෑᘜⰿ℩玽戱ɬᜂृ๔⮕䄹ቋƄ䴜ᧂ⩄壶ݠ倢਄㘯ⓦ䐱唹焱ቬ⑱⎄๲㧐㪀୴いࠖ眾ٚ籲䓿㈉Ꭺ⟴䭉᳼䧄啩స畆㡷璿㘰㉭㕌㡆ጵĒҏ⵸ጅࡲ榳岣窯䲱岮⊋ࢥਖዚ⛿ઑᱲ⚄䫩䍀歅ᨲⲻ᥃䡁擽撡᎚⚐嚻泸˽᎑䰜⍄ᴡ岶吿溰磶䨙䊲⠀䥩ᄂⵄ滩础╅稵ނ祀栰礃䥷ኾ▴䷙ᬒ㑘摩羲組旰〻⁘折ᒦ䥔ʐߌ侉Ờ㰄盩␳ツ䊯䊶䕀䛂ボ⤠勪☲䩉‒㡄䈐癡榣➩嘵๯ኇ�㜎ᦉ╏ದ悲㉸嬑㬳壅ѫ㔹圱䪓ᒺ⤺愶㬲䠵ᵪ⓴᫐⦳䕅㠥歋ݬ牢擃♆ኅ⠆⎹Ẓ㾤䝩䄲୥岫㍄啓䁌哵⤪吗猊俵Ὂ⁄䕂Ų͆⩮崹㳤䪐⓫⦃䈈♁০᧜㇤祘୳捅⵮಼⥎橧哑恲吞⠌䴮旌ㅴ廩斲䇅幪墺揮ʒⓏ䅘卽⒲䰭៌⯴䂉ヲ䧇絮䒹䥈䉍湕₀甶➚䳭ᱢ�ຉㄳ潄汩ᜳ൜碏ᔃ兝ፉ␶仭ጠ᝔枩糳祅㍪ᚰ浏湚㓈䀬�㦲βᬁ弼঩滳⒡嫅ᚻ呏ʑ䂾⥺剹䜲搽ᏺⷊᡉ羲䏆筨劽兂≊栣⥦ሾ✴侻仚㓴斩悂㞚㥬粱ᵖ᩵㒪煮烜⚎׽᫒⟈栞䯳碡䴠溱㥜檔哝⥊厸䋀䏭‒㥴窚੡ῆᵮ挶᱌窟㢺楁⊟␽㠝ᒊ㘔绉࿳線㭯䊽之窞ᓱ䤹挃䟒乘ᢲ㳔埩史叇ѭ恨祁劂ೆ榐剰晁侣ᶒⲄ䕩ݳ䣄䣨䊸楓橠ವᇮ功䟦䡃ᵗ廴值ౢ沆⣨䲲嵔抋䓿३剣⠜䦑ែぬ炉౳凇レ嚻䍏䩥甍槾ሤ枦䴢ᦎἔ侩敒粇慭䒽⥞䩵ᰢᦅᏔ柊䫥ᎦⲨ稉纑窄੩䀡浮穪ᒣᧁኛ⣞䷃ჲ㗔淩䛲㒇ჭᒽ⧾媃㓩᥼剋◚ร᳂〄䞹杓׆峫ࢰ嵄ᙹⒷ᧥匘昦䶣ဴ㰤䢁Ꮃצ⤤䆺ᵙ梀ಶ冡㏚✥伩☺⅌犉Ⴣ熅勫䆹㥉暛೿⥔∌ݰ䨞䉪㻄敹⩓喅೮犲㍝凎ⳗ⥈区摬䶤掆⋌伹⭳䌛䫭⺵⮩♾瓄᨜㋤敞䦋 㒨筹ᶳᶄ䓬⦵᭜㚑ಱ姱㣦擾䰃ᰲ♌䎉Ϩ密歩㚶େ᩽᢬奤⊸攡䶳ᵺ⽌仹插箅૪瘅獍媅⮍妹፶柙䲛᫖㟬爉㏢ƅ⻫ᦺ͓癶法奠狵➱䴓ᯖ☌点⣒來峭ᶹ൉墇礉ᦟ㍬撡䯫Ἢ㈼䝑⹓㚆懩ᶺ筟ቴᒰ⦝厊塒亍ᓪゼ繀眂⎋⬔✴䝄穬䳴㥡㌶撆䡇ᰪ㊼䏹悲ᔇ㥄皸䵍亝撺䥈塲攢䯙ᕮㄽ൙䱒甆绫䶷䫷ੰ峎㥊㍩擆䶹὎㼼卉䋓儆ữ⮽筋ڝᲴ㨓㎅斳䢣᭗剌曙勒䀛᧬㶹ݑ᚜㽡ᄢ勍擭乧ᵎ㦤欹䎓眄䇭嶽獜溝Ⲫᦢ剅␿倲Ἧ᯼崹煳Ⳅᷭ殴睇㖫崞姞獣撣䢋ᙲ⑜烉䵒⢅巨綱䝎皈㭐祲犸♧丙ᆎ㵜柙ߒ؇Ừ箻ᵏⲐ甂㧼䋰ᆷ䫹ⅾ⭜挩樽㨄ᆔν浜庒環㧍王李䨇ᘺ㲴䛙䃲縇㗬䮰潌Ꮣ䞟㘩厛時佥኎ₜ唙ᴃ嬥哪⦷潃皈䴝ণ狮斃ࣛᶶ䀌婙ஓⰆ籬ྲ㝟㹢ᔔ悾ҙ柤向ᭈ㎔䃙㺣卄⿨墿⽕⑼㓜礩吏栘䷝ᩊ⾄尙Ⱃ俄៨⦺ᭊ㙪岭㧧犠ᔯ伽ᶾ㇜确牼Ⓞ䁋现坏⚟粭妠଀ᛋ䳟ღ䍼灩ࠓಅ犬嶸权嚍哬䥸ી昽䪅ᄞ㏔怡㬒ᬄ⡏㞶Á䉳粼夫㉩❰⾽ᶮ䀄猥ᡲᚅか➲䍈䅦粦ㄯ⍚⑐⡗ᔆⳄ儥᎓烅䡎඿䭖㉷ʣ姥㋣✐⡧᭮㰢䤙ẜ囙䠒ஶვ䆜䊹؏玳旱䷙ᰭ䑞ۙ礓䌅ైᣠ㵘䁱璽㤰୧朓眿ᷦⳢ徎ᅳ璦᱌᡼烏䙨ˎ稉⡷杍俱᛾⒔劥঒⨷桉澴杆ſ䌑ᦉ䅈ᜰ⽻Ệ⁂䜥桒⫇៫䡵࠼ښ糀䗶஧暤⯠壡㣴牥㨒྇剌ᑾ݁劌⒩奺㍢♟亃᪲㧜穙ᑓ攵揨㑵⣓媘ೀԿ㋺ᓀ⻠峴㗐琙㪪ᜆ㩉ழ⣍窌ᴵ㦽卙朦䤛ᅑ≔斥䢣ぅ糬㮳佊Ū索Ԥ牄撻亸墱㆔揑㠡壉㼨綽浀栾拱㥤唆ᗔ䪳Ḿ⦂夙ⰌⓆํ汾缾Ţ屹楧ਾᛀ⤃ႀی剹宓܇幏лᣖ࢜抿姊ଣ箊䦽ᐑ⫌䟥ຓ᥆繋䖺䵛憅㳛ᇕ፣❋侤嵱㜢给⤒㨷ম䑳⃆㹼ኼ◕⣄ᘠഈ⥨ᣠ⠨ゲ፥ᡏ氺ⓜ䥺ግ秙தᒥไ媸ڲ弚ߓ䲴࢔ᤫⓔ冔潦䗼ଈ晔ⷀ唊㴲䳙䱪Æ祊呴检⥫⋉ؐ叼ស慐劦㹲熥Ⅺ妆穊ࡶᓎ⦗⠯ղ䨺❊ⲵᭉ⟼沥ᰒ傲᱌⡿磄䢀ኻנ䫓秩体ᗶ㑢庥嵫厚⑌㦴擙⚅ʯ妠Ȳᗲ⽴嘱㼢䦩潫⢴䇪ٰⓋ㆚洕樍୲ᔎ䲝ᨡ⾢昑൳੄㕉㾿㵒᥷⋸䗿㳳ᔬ⨄崶⍜咘繫Æ⇩ᚹ䣊榖⊺䕟ᐚᔧ䱌垹⣜俙⋪粅婎ٱ棄ㅧ劺ؑ䰄♆⫹Ჹ㋒繥冫䆴㍌㙶೙ẇዒ▛瑯枀ಮᎎぜ䣩ᇫ撷䝌〽棑䲏㤎旰ઇណԼ僺ㄜ皥橪岵䝏ኾᣓቸ〣″稝曵䶜䫑⵼爅ଫ䯦཭ᙲࣜ奿⋵斦犯ᝥ撈ⷙ㡄䰅Ꮺ熄⿩⑲㓕繻䚙旔͵ᖏ䰔僩Ⱳ乪ॡw⟮湱˄ᒞ狣▾㋃ᘞ⣓᜹ⓒ秥֫᜶⁎屰ê妄ᔔ昂વᓀ⧬宮㼌担㩓ᤆ絏䴶˅ᥣ劲ᕰ牓ᚸ⣂姺♒搵快㪅Ṍ⁾嵃ᅥ勜憅勫ᒪ⺗፥⦌嘉䟲宵竨䙺ዄ兢ૠ⥺䄩ံ⺻歅│嚒⣲ᡶ汋⡾㷰傃䋥ᗕ䬈枉⺂失⣼痙祃強ӊⁿ克⺛㊭䦽䭇❱⨌墡㵬囙␒ٶ૭ᑶ⥛╹દ䨎⮠唀⿄冩⡪䱙⽊Ѷ㳫極ზծ犭攳㋢咲ⷼ圲㪼枑瑊䂴牋祷㋀ᩥ紈唱⩡敥⦄匵㽢疅䌒ṷ✓㮽狇兵଄啯䯃攵⨪垵ⓜ汅妳楶楏瞶൞啻ዥ攢୕⛹⽊喩㱊䍵೫LJ᫉嚏佅ڛ泴䘐勞晹⳥᫶↼奵ᖪᚅ㻪啶⥜㚋⊶敢㎻᠊䨳ᱵ⦒悥罪礵ቋ発՛㦀猐敱ĠѨ⌀䅖┊撤囊廥ፎ浸擘疘╫唹䩎喽⽟ဥ㵼䟹ナᙵ僈粽㓉ᖈ匟ᖑᓾ喻䢛ᨕ㠺侙ṡᅷᙬ兴晖疘ૈ㖹⫁囙⦯ᒾ⏪䊙ᙲ⣴㛋㕳㫃啬檼㦩玒௭⹦匞䷲楉䭓ἵ❋喱㍖ቿ抻敶ଏᗰ⢜務㜺䢥㊊㩵䩍Ҵ᭄䶀㒹⺭⮆┓⳦嶕⯒汕�峵喐⍷曍⯙ˣᘇ⯅啽⳹ᎅ㪊䎥抳&᳎湲囌൱ጁ㧰劅囁⨂兌㺺烅彋罴勏㩺Ä溗勂ᕲ௠栕⢻ᶍ㭊䙵Ƌ狵嫮᭹櫍ᅫ㊻㕀猍囮⮄備㽄䟕⦫᥄㷌㭽㋙涀䪳㖯㊣和Ⱞ徍㮲咥ᙋ䢇㷈剰௢ᅨ䫨ᕡ毦呼⭲利㪔彂哫࿆⏎湿໛啯嬉ᔲ䯒┉䠯ᥭ㚪憹㦊⇵⛉㭼曄ᙹ㫯懶㍟杧䱓ᱥ⟲䅵䡳綴㏍⥳㓗䁠ᴚ䔦ఛᕵ⧙᪩㢪儹祊捆㎭坼㍞嵸㫷㗆ન摑⨗ᙦ⩢瞉殨ᎆ㟌ᱫᒯ嶂⫦㗢毣唏⻸䫉ᮒ䨕⎩᷆寪瑰㣋⵱ᴈ㗫䪯四⻞呑⏜帕皒䣷緉൲䍝ᶗ櫞ᘗ䨤啗䩾吝♚䭵嘋Ẅ淌皴嘣⺔܀瘓欕摗⩶怒㘦䧙▀勴幋‣ᛃͷ烘ඳ⨰㙏Ⲏ徕㬦揥ᆑƴ癎ᱻ䫛噵咪疇䨧⛱⾘勲〚変ڋWᙊ⃴滀㚓ⓖ㕴᫘㕃⬎偹⟚儅㨊硔⏫ン㣅ֈ笍斒䩇坩ⰱ傩㱄惙Დ歷矍絸㻇ඛ۲㘋⬩嗆䣾屽⥚䷉姳㿵痎墼懐消૥㘂᮪➖䡎幅⯔庭䨺୷Ǯ佽᭘⎌泋䘖ୌ㝧䮺啃⟼拵⤪㻅᫩囁䃚।ዦ෦ᩴ吿ⶁ嶥⍢硅䂻ⷶ屍䓱᥁晿粲׈㉆攚䶾宣ⷦ嘵༺㡷嵬擵ໟኚ窲㗆௉呴⨗ᙳ㗦拥᲻樶㓎坱曛䍽䴌䦼橲㒐涶崃Ⰺ硭䒒U෈ჱ凔憊嫻ണᩕ咴楣ἕ㰚枹亻㓵义絿拗印ۢฐ匦㗗⦧ጅ㙦紹瓡擷೎乳䝆ॵ⛬ᖖஊ㕗烓៓㰦愹ࡪⵖ耓㡹ᣂ㎀ᔅ൬᭒撡ⵊ墣㏦孭ⴺ㹔䟎玿燓ኞ勳敿ખ㛄渙儝⮊窭垻྅Ə㮳秛⦗繄㘏௪㚙䮥忓⭚淅毓ʹᆈ䉶曓䎗䝘甦⫟坁⿒哆⣦瓭jॶ咊䓻䧆ᎉ䬕ᥖ᩶㙭俱ᤣ㑊䅪缒䳕㊎哸㧃░曏秙ᕒ吴嘖哪㷪䂕粲年咋䳾㇅獾⛣㦡⯿ᚄ䤪剭㹚䓹祺䣔߈ᔴỏ㹺瓕၀琅㜱⮂好㴒接湋䓖ⵍዺᗙ獿⛐ⷆ૤囲棕啅Ⓔ糙᜺ᾅ涋൰秜癯䫑ⶆ婅㠜䲕尮⍒埍ん彗物櫻⇕⚁岣⸈㈳䜤⦁当ⱦ䟍ᚒ䳆ⶈ⓺䧞թ᫠Ż櫈៳䗾尫㷊䖭᣻睶厊㵾䷔綇䌕ⶰ⯦㠂浒廚⪆墍ᘂ头窋㫰姃⍱㬅䴩婄咶椹嫳㩢橹㿲ᠡ剋ୱ竀噹岾淜兓㞃⻭奫⯊䉹䇻䘉煍䲱᷃⯆媵嗉ୣᕉⲝℳⲶ咍梺畕塈榲ೃ♵笖䷉௛♶澮懪⃺嫅卻痕䆌Ỽۍ絺曎㔷犰埑ⵁ嗫㈪滕䍻㱶䲋ỳ۔୮㛐喆檀埾泖婓⺬栅㩳㫕梎䞲ύ䪑皬ᥕ孃㗶溭噛㱲奩䡛ൕ䇲幸绶熖盻瘗᫚㝈⮣庛℮服Ⴣḇ盍売⏈畽因渟᫋嚚殠唥⴬琽烻ゕ䲈ᇱ巓䮍ັ㨔㨾晱槕廻⠔淕ᆫ䏕׎绸䏟䞇嫡ᶜ孌擰滃埋ー䶕噺ݗ哌ⴶӕ᎜仢䵬剛埌楣媭⴮氅⡚ۤ愍Ỵ秋箈盂᷄比疼湣座㔢缭咫᬴扉ૻⷕ䝥ᛓḖ㮑ᝪ歸呙㘊搵懊旗૨徴痗ݤ㚶ᵆ㯥㙁欪布㛦䑽ⷓ䑵熌㻽⽖䕱ᛊ淗䮭㕙洫弋ㄮ榥᩻䷕ᄏ壴嫟⪑匘崵ছᗀ⤑Ⴧ㤶愕帒Ⓡ䃪桻㇆坾䌝ᔠੱᬘ⪋冩姶朙坻井ຉ檰◌♣洝禜㏛⚽⻕ᤀ㚔烽⅚૵䌋᧴ᯑ畩岹嵏Ⱍ㒉梉尳㽄敭狛䫖熫ੳख़㝦㌍巭ᬘ撚䦊刖ㄎ汵㆓煶暋◸组❹亳崯㎎砈╏朠ɀ⪊瘹痨禳☬篑懋滅⶟⩒瓿咼ग㐎䆠濛ㆰȊ泄ߕ瞘ᱮࡐ碲˽望剟ð≢ᢚ焔✍ݱ㷀ǂỚ⫐稧£沩䴯⸠㙝琡ᄖʇ揸⟕⁔卄㴤箎玳樛囃㓮笒䲛䤔ܡ叺ߔ侕ứ⚴笩瑳櫧囥嶎濽璚៚ᨊ叶੕侇Ể㳼擾儊灮⿃⤝ᭁᥢ北⬥᷺㣄䭥漜ḉ㨥瓿厷徻䣠⋝䖥劧㘎䯼⼿⾘▊憀㮵䬻洌៯⺾哽瘄嬔下毹៛増䩛㵮䃘ፃឤ䕞䗾撬瞚㓷ጋ卺䯍⽵漚㷩䓝痛汴ȏ㙒⢝乢⒣慀䯿៟㡐⡃ᘝ叭癫桯字凮悝ၻ䈗娆᯶俁ᒍ౛㶙窭盇毲揰坞榝媛擗㬉柲⿄斷Ẓ絆ⴃ砆牻⽧䓲川᜛假嬏灸ᛒ㝿滻㷦穛盀䬴滿㚍➀ŝ众ญ厠啄㼽廉綋ቓ璥樯厏⑞攝स ࠍ⿰奉彼擐ऴ樥䬻檃搷㦮栍☚縔堌䯲⭻梽弑緶ᄍ疰养替㣾縝絛煆ഈ߸忋ᾒ纺縒箿瑛樟夸᫻ԝచ䍒嶒ᗳ慠罨Ǵ㴫橕砗渠㫍သ纎ׅ瀯㠈窽㽌Ă䑛㷈ࠗ◞濶弟┞栝㐛怗玒恐䂑汥ⓓ⥑够⟝澱兔㫐⭀䟚倯炉䁜㭪䃣Dz㔔ࠍ䖃℀㫸ዋἚ㭈呄攋᷊悆㑁歪ࢢ䆦剐ᴱ囧□眣㣡㰯䐻⢶ᓮ䄛滙΂࠘ඐ㘰㏠珯⮬䴦爯㐼埾巅枂䍽Ϫ䃨౟儼䊀焋㚣天ᘬ砉桛႔愁纼͆ᬾ㚕潷塧㣡䎣䏍᠖Ṗ⡚⿮⃭绪;ث㚲л⍏⃭ᾣᄦℬ竲⯼勛历㻌浿稧ዸẸ䨰珐๩℧䄮刹䑞Ṧ⢛籉犙މ䠸ᾣ嵀狌Ҁ䊦᤭⋧ᑞ窠㖏甭䙗ⵁ僖ů惟㼡扣䈧⠺ᨽಋ筳儑㾋࠮ĵ疉ℿ俰握ᔎ⼚ষ悊䡔゙ᣐ憣ᑌ⢆ູ✒䱐罗┩ᛡ愮羲ⱓᇤ㕌↵渑ٟ痔Ẁ㥶΁䫣Ὄ棱฽伯䴮⨦懜⥖ᣎඈ䲰㼃㫞碈宦充昺〭ⰿᯕ懏㢒ᆁ䣽㜘㽈⫾喝๺傉縼员༤ࣼ㱰ঀ畇ឌ樞䊢⨱緣᪺䂯甄䉖న䩸単⏈䛵䜵三撿Ⓖ弴Ḃ㢬ᄿ㋼发嬡ᇂ焙竂掯ౄㄌ⭰㻹፫䭦椺ቔ叔উሄ冬䚣䜙಄ㄌㆠ㈐♲疐ቓ䔳撌伴₞⌠䜬๜ᨧ೔⡱彃棙䫧┹ਜ਼ᒁ污硡㈔䜂䝊᪄㶽⼬斑㕧㊬㤾䒸咗䲏䣸績箻䝅๔㰏ㆮ疍⍚渮倈ᱚ撈椕䕾妩䏉䔿ዤ㔰᝚ⷔ̃溬怤穜⢋坲ማ⍁≝ཋฬㄌ→ᵃ琧♃䦪瀯݈羕冲嘎ݪฦ᳊挸祸碃㝧⠡㴼晗璑ᣴ憵䚑⏓༯पᦸ懸坈҂ʯካᙑ!䝡仆ḑ䝖堌ᤐ㫬㋑汑㵦㌊憨㬱ቴ幈㈾ℙ巄瘏液䙨稠㋩㻦᪬再⫵⒛壨熹圛戠ഖἍ岳㞤ᓃء㲭㴾䩖Გ坳ᴅ揋䛻࿎ἄ㇪ڊ㼢卧㹤恆⨨㲐䶼⪳涘ެ盺᪌㾸祈樃噠䅱嚯扐粀礓燗⏭籅㫊ᮾ᩿壝ୣ᯦Э洼䩓幏礞磐ጮ捻癦ᲺᲴ⧡忝ᦻ翴ሹ໴䢄Ԍ৞ờ⍊䞵厭⛈撰౜⢉䑁䔢䑪婋椞灜ፚ䃘ኪɂ㍔❑渃ⓧ⡮粭ᅟ䐼䔁ৎ⣴⚫శ獂つ犩欳ⷃʯ弾甮璇⡟ᴈ፲䠘个в㋸ᦖ棺嗺⛖猸䩞橏䓹爇挲❨睚ᱲ㔘恩檘⾻㧦殨ਣ₆瑾㣝ጻ䙵㜏䫎ᒄ淑嘜㟢䪬ూ╨ᢈⱺ冻ፂެ亍毯᳔⍉✰❆涯岽奘ࡐ椗棢瑚䣝໥咔ැ穩滣嚧䡯娿兟犄ᓶ㢠匣⮶䙠ܙ䠓ₑ敃˧漯⽏䅒埑Ӿ懨叠☴佅੪㼕᥸关ͪ㩮粪癜Თ壷凪吓䚏筘ᦲ㦗⠩布擧㕬䜽乕Ლ唗亰兢旌⬸Ҫ冞㟉潈细㑯᪻兟䍙筯⨎ۣ♡嘭Ẻ㾔唢楳ᓆギ攍⓴媙擫咠㗡᏶乢濩Ổ築獉ᕧ偯罌䅾咔㔃㈑吜卆丽ᶺ〥㵱焵祧粯᲌㵛和⣩⇜揙殈哝ị䈓〴石ܻᓘ⌻᯸坍厛ᇗ吞䙩࿠૲單⢆俙⹧஖㿃奣⩘瓠哪璟ᰠ䳺ᬺ㈔樹懙㒇氖牭捔䚍熈⚽⼓♦个檅უ㒹弦ᧇ杭犹㕓䚕፵ᧁ匫➖乳᥆㋬翉䇳瓧䳔É獞ڎⓠ㇦㐞㬙仆ᨅ婌玠⊄҆徯劌撳ᚎ䴐伌綿❴疡ᮆ㈲⦘S亇烖Ū歐嚗從⧋叱玕䶼溻旌癎棩㴍㢭⯮ᗸ䯂泲⊚卹⚭㛋淪㣌攩䓳椒絆ⶽ⇹皞洎⫛᤺暔矫ᠶ㭤笹篓ᢒ䇮৉䭐窌ⓨ漄奿⚃䲍ᦃိ㓢搃珧⢖厸繙Ꮗ䳥ᦴ掲朳仴ⶖ尲㾹窽崆勬䧈ӱᥚ䳿⧹㍥ᩁᕷ᷆㰼欹粳䎇㇔㚉儯⺕䴎溰䶡ᩛ䶓ᲅ埬縨౜摼囮ᅌ⣺䫀㴝持琙晋ᛛ⪪塜沾㯣密槷枺佔䛇㓠䛯琹♿百ᮟ崌扉毓⣆懮䧉浙㏓㴒⦠㐋枎㝭煞ㆬ慑䢓朇犇⏩ὖỌ办樕䶬⠐䱱᫂㬼擪䱙ဇ䱯㢾ᅗ嚍ལᧃ琐吟䶑἞㦫⎩匳䠶㱭綾穛璃㴐㈀௰ݠⳗᵆ劢甙梃缇ၷ斸統㽈ᴍ禦搔李也ᤶ㞢畹潵䈶ၮ䯏璿છⴛದைᚸ࿀彁㮷㡉恳杫瑎押罺ǁ媎妭琝⮛佯Ნ壓␦投ᄷ㪵䩮ࣖ㚁ച熵嵬刴⹗ᣚ㨼挥灩收◭眿㽛咃㳹榵௄ᛴ⿐弡㬔為緳ᱻ⧷૭⭒毁窅֠猦ᘯ䰻ᾁ㑽≙憕拺噌㖸ᵐ㮠べḡ匠⯜⸂۠㤌縖殣㰆䷭ֺὖીጏ䘑㎰⯂⼟䫙厮づ淭㊳䛯ࡺ捸熍䌝劶㗦朩嗨娣僲⟹杚ℶ盭秷ⓓ濄˹،䭐犪⹫呆孲瓜懙ڶ㗭᥮㓒憒ャ稊䬱歪ⷴ夓嫲柅捫看噍⾿筐␴⋳ᬞ䴵᫈ⳟὶ㙒牮䨫ᴆ塏䩺㭶䆊匀ᴀ䥸ᙫ䴀塉㵗孙䣫匇捍῏ࣗ⍘崏槽䯉䞨呠嬞㼢篚䰫倆Ɑx㣟嚋ጀᳳշᘾⷑᦹ㼒瀥䳱䥛沬玻͜妎嶋ו䭗㊅㓣᷅尲㸹帍㺆䘛䑦Ỡ↖଒㾘⭡ᝍ೅毾㠤略杫䂒兵慼眄废੾ᗢ滈ఞ么孎拘硱棃⁶ጬḸ䓞冓኉ᗎ琙ᐞ䵃⮊㵴灙崃盇济楼䍖Ɓ冇ᘖ⯇曹ⶵ䡉㙲Ⅵ䜓攷哌䒉狒撘ⴉ᫭௟⛥Ⱳ塩㚫〉狋䘶䫌眺㳙⦈拷▴琊埘⾲嵼㥇㥅徽䟒楍䘸癳░एᘚⰙ᎒⸔失㱥⼹䛋䒇森⵺好㖘䤌嗞⮔㉽⸺妕㬷㫐ᘨ坶亠⤡۝斆櫯喬୹㮣⵮歙㍂湕䈫暆擯㖺拾㕪⌖嗵䯚坾⺱䤆㪺穥宓೷祏宍ᓰᖟ埓䜁⬮曱〛棥㦬欵嵋挶ᕗ䭸剒ڗ᝵㖠㍉嚉仓ẑ嗺站撋潶㧵敾⽿䶛嫨榳㐉堜Ś塦㘺払亓姷羬㵸䵽䧐㫶刖୥暳ⷋ᡽ア翵䜓罶姌䅹曜ề办痢㖡埶㚲墵㳊慱壑㣧垯歼ᣝ䖘笆嗪⯆᜵ⴺ嶝㙥̕䊓ᵚ᧯㪤᳝㯝䝬᳟氜կ䲡庌↙ⳛဋᴇ悌ú⭗ᖃ⋯痆⭪ᘳ乩漙㔢沵稻᮶ߌ㩼㛕榊䪎৸௷᜾ⲷ᫣㱤犚嶓卶⣯梌凐ⶇ۬嗁毞圡⟜Ⳮ㍒断䦋䒷刅亾㣿冊⫪瘆⎬㚃ⴛ俱㘒惱棋ζ㪗离燖旀⛺痝⭟櫥亿Ὤ㚦睥嶽䲳㲍᝼東寓㔘㫊⦏垌㘉嬝㹼稲猫ᴇᱎ䊿஼㿓ଃ痜ᰋᙬ滥᭶㺆愥翫ᒷí惻㭔᎘ᕤᖼ帐叁⺶嵃᪆痭去Ƿ㊍浍曐䗙䌉秇ᮿ歗⴨峽㽦橕悻⛶ၗ拿哔䶖஍ෑ殉嚫⺆庳㣇㍱塻柶㦌ᵽ䍞䗇峧ණ㥑ቻⳔ弩⵶摍䅻呻ႌ㭻⭑涋ᴟ׉ఓ基決寝㝺汅䎋孷每⏌䣒⮒૰渕斓䩊浶⺻惒羅勫䵗緷稉㳜㶚㛯凴᷻ᚶ秷ᰉ᎕厍棩睗߭监淚⥝⛁渟ᄀง䑴偂܍㤹灓勼ျげᓉ㮅作淨丂䞌濹叛㆖槐ᗻ畔ᾌỺ緙䎺ೂ畯䚁㤷⡅嵽㡶揅ㄐ傖㖑⇼໊㾳䐴ͺᡷ砱汃噷唌杉缓枷⃌摧㱓睵♒᷂包咀त椿传巕ỻ✷倩⓷䓼᫬众㖙瓞炉乃嫈㣮縨ᰦ珚ᤏ⳼擝䞖∰睖㬸ഐ㋓増⑆噍⫑癍⌍ᖭ█Ҁ㛾ഩ㭟⚶㧫媙乄禽汔楩ῲ凸狊箆⻹払㮘瞨愙杷㠤䴕⟻ሆ੕⌼廇箚嬍㈙笁៕溆ٗ㦎挕ᬊ䞗㍨਀ᄥ橭滳わ窢服沔唗㫺玲ㆨ㒪弎忣Ẏ璔ᥐ䦻寢磣沠䲲㸎缙寻䯀㈌⏹ჳ഼潘㷘篁砙烆᳎䕢Ὡ昆甖亢珸ᨯྖ演㖧炥皷傎慏㸉ౝ军欗⇦圠悭咪廾㶻౭登漷媲㬥婽禛ཥ㬶㯸㟛ࡹ弝㷖笮ֻ洬啗吻㝬ޛ䨗☏竻矕䀶㼃ځ篳⡷淪䀠ţㆫ㻦㲊筢㢰炩擋Ϟ癒᜛䶩ච沀㨮㾅⸶次䢇㩅玀ɉ९੃ୀⰖ㴸忿᮹㾟ᯑ⸱粿矞潿定殞懩Лಠ倏幇㿗羍缃わ孔瀬Þ՗㥩㼰ᰧ碐㠌㈡⇤ⱸȉ䁰ݮ焰ᰧ塷Ρ籼㹀ⱡ瀠⭼怈℘䇵州⁈༺ǿ弋䆡渠ᘧ纐搾ⷵ悒ᜩ䇨嗆䠱䇰͢ṯ嵈䬘ඃ䨮>偙傑䨱绹⇞ܧ槤ᶹ⍺☒僝㒧䫭徱⡛夤Ĕ⇣ᵙ߀䝴揭ၙ⦐籕簔刱咆⎔Ⴋ儌揟緧ຠဒৰ㢀矅ݣ䤨振ㆲౙ増畑ㄞ␻䏮ཅ㌏啼ਜ਼ᥰᾦ䙉㬵๮穋焅⬄࠾䋮䈇泹帗㐱殾ࡧⲑ燱ӁՃआ䅕漫ߤ娂ỏ㔟抱牳Ἓ業᤾矿䇨䎹ܮ呖¢ⅈ䈏偝䌠ႅ㈐㥅໣⹤⢢Փ㭕噤ᔘ䄊Ἂ㓨绀亐֞㚮⬀䩙㤮⤆岵␗ࡈ壶毴㼰䡑溠孧嚮⻩堧偞椂ㇴ揮䠐ǚṮÈ煄促粨Ʈ玠䩂䲓ぽ㈄搖婱擶梌㪂⺪ᐷ⒎៪ဠㆮ繡吰刍ၒ䍧ฯ勼㰔伱䒞✀䜭焂⹜ठ倣⴦㞏⋯ྻઠʿ⠑摪╸n棲䀢控桰ᱶ䆐⟂獉Ϙ㮠ਁ玳ᦧㅘ愢⌥⼡爡けᙈ✸ᥑᷪ䘁՞圳筴㰤湣ᬠ咒爹‸ઈゾ⇣␂㭦䯢ܳ湇ሙ堣煞繨┓䐺㲙⃄俩ḩӄ琮ᆳ䬴幮狀!ჸ戴狎ֳ煇癮〡䥜Ǩሱ䔨司摢伅†1壬唔⧦Ṃ➌亀�㺴瑃Р⫇壩䪾忢俘ႊᙓ∣ᢵロỦ⚈䒉笫㺛␔┲浛ᶡ㔀簫䀶ᐮ佽ᶵ㈞㮫䌑犺㟂❹᱐伏㘽ѥ⍠某⏭ᾦ䉎ҙⱓ佦僯桥∎痃⾁ུ缂ࡴ犮卆㧏㫯⅓梑ダ␑䊧㕦ඓ‼]瀦慎熸献䀴૴㟂䃁炀沁䖧ᑠ姱㎨狅倔䉑⍫จ儬௸僐⚴䣢㪞ധ娄ሾ栂⑱䮚㓲䈰₳场籡⻒䍆䵛唛䱸珜泃低㓢䕏।秨⌇眖௮坙㤧پมኁ炐ƴʂ㱫ඹ䊓䆠⧮㈔榽檚尥㨄䒕本楗Ỿ㧼燆ݓ撎䄠禿㽁箬熻㧱≒柗瘻ἶ㺖ሴई⌴㟯ᖾṕƟ㔸⁄䰱籰、惠؃䘠ᄓ唨㊹ᱢ㮁抬₸秷瘪₥丠彖㸢碭ᘫ摄塎狁⃞䆙෴䗼஭ㇺ⇟ᵴ☜瑁縫匔⑎皒僝ẛ㴤坖௦杅侯䇱㩆䅥梫悸畑幰#ᄩ㧑䉅縼⦘⹡层ヘҕᐷ栠�ے磡౳䓜䉮ጎ⩈䯉窺⿺剩㺲箞癫䊷╏㪿㓛⍪ጎ⨠?㦷ᬹᙼⓘ䀥ግ䘝�䢒⺀ɉ㴇΄ᴳ碈᭏Ⴐ泘妝㌖昝䮹ᝮ⼬巙㼄癮૫瞷筱晽䣙᩵ଗ姰ᱸ埾⼤彸䋫ࡆྌ৅ᓎ䎀兄喡䬅䔮⯓ᒖϩ栵㼬睴䣋哚ˎ狀栥〢ᾲ嗼⯒㡕⽁ჵ㼱䙩㉝甛啐箼晋确欋圪璙ᝍ䃕IJ㬾࿘始檛揥䍿䗧䁢ᣬȽ厰愳⹻ŭ㷼籕砢⽷⢈Ϳ㢧༧摶㗦癵ᐔ䍖忭㫡䗵燾Ƿᖐ嵽ᛛ疚嬝㠹⇃垐Ю嵨㹺㏡捣綴ス⨼屎උ㎲⦤倰䝳瑁戽旊瘙䌼࿷嵬὿ᬵ➧汄楨᯴栁凡峑⊦疿ם䉋䣽ױ懝⋜ᐢ嬡⮨〻惚忢㫜狨ऻ彴᲎纑敢戥楼焁ර౤潣Ⴍ╆祋᣶ᄌ璎ᒢ㇛⎛㾑峄〸㲎⁢͸㹴ٹ揭πⰙ㮳䍧᎒✓佌㈡㞴溱爳㫖හϤ䤜Ⱡዾԇ俰ᶦ䷶ᯚ㜬漜ځ㺆秠ᖻ䕀皎姆㧟椭朅䡏ᯁ䞹䂅弪䭋嚭ӻ掄䅕〃ծ労㸺㘏禟磖滚ካ䣦籕楻減瓹炾䆃仁ᐰ澯㈤爣⁝჻㱞഍淳炗橀⻦㯤Ꮭ意ऀ粈砐煽怎㾖瑁画櫗櫸㣑㷜狭䐥䶱寵䤑渹叧㪸倚摓栻Ⳏᆿ௙䚞⩙潯ⅿ圯懜漭㍎㷐㼰◴刮ἴ仁⮯紉娗ఝၧႉ䥽ཛྷ獙緫婀筀朽怣⳪ᐵⰣ䮮⃂䀠h‡䏮倭䠤⥦ᐨा傂ຎ猕ئ㹀ᵘ欮Ϯ澞漟ᨕ〼᝽溠彻șɈᔓ䄗䯮䏼砡ྜྷ氼㸄篬៳漇屏㩾羇֛缗珈晊㿝⨵开恗〸矶時⠂!笑椛朷䁎斾篜徜Ა㷱搮℗濋๟㷟㴝纛夗㠎ጐ㿟羐⧝㸖࠙租籠㻧೔䗀傧检䭩߼㣝憝漈瑔ࠔជ侀㽿㾡穝戛慨ℯ⡞忘ᨮ缍͉ࠒ཭Ҙ㰰㻼૴ࣳ㹀㶸恞⢙ᾕȜ緿㯩本Ὢ䅐籡煝疧甧瘿桞㢜愝成␋⽞ྺḫà㯹䱣痛纯ㄿ䟽㣝ᾖ䔘㸔䠚࿳伸㾿㡡癝椧劯㭀⩞៛⤝殫ϱ䠏睚ἕრ㧨➕癛欧匜䘣ಘ䄗䌌緥䞸࿶ἄ㻸纁焃檛疃᠏⩟៘椛爃̴硓ಯ涵ƂҀ୕ઝ♯沾ឯ犬ㅧ䨏ㆫ燺⨴䃒㲴缷ੈ໲ㅯᲾ娫⪞䵮⨟ᐒϡݤ梀T緉穳摼ݯ⚿ᕟ᥀㿽ʐ壢䏶俔棈䌰咞淠䂇咛ᘸ䍞劄⢒声备ᢲ捐᤿ゥᕹ犁秇ଗ疿簒嚝⻊ᐷ㑵ᣍ櫛⏺召糢涭ᤇ村⎿❦㬾㣌㲘噻椁俆༱厯ఔ熤溘焤磮牀ഡ澙\"਄㞀ṿἀĜ礖ᇓ拷⌴~⦿Ɯܹ䴐௴៰熿省㱿徟㢫琷樎䙈ࣝ⟥紒ᬈዒ៬⼾掄ᆸ捬䗈Է䤜Ფ䓜写ᴒᨇᭁ᠍‴弓ヲ繅瞫牛䉴ј䳟淘淊昞㸶ា佯῜㊒羴෫笒≏⌎冿䚢啪ᐾ簥緸柂䇥㹪絥穧崷瓏奾䉈捝ଓᘋ䈄堋㠌摋Ƃؙ秸ι⼗ ᒣ㖜瀫嘍ᥞ堒牜彖㹃♕灨ݷ廏;懼䶛ᬘ᭱毶埛⿷㝺弫杪ȋ櫷塏᭾㻝刃⍫㘀༏Ṡ潥ᬚ弧䊿∻扗呔⣿ᓞ禝ഓฒ䴄㞨姾䖳㽽敭羊͗紺䑔籇⎟ܒ丏ᰑ㋙⋇ạ愆窈㾻櫳憏䳿䗟㎙圐庶≀浻侱屓㹖繐೻惇妏倨ො嬢㜝氫叺㷾漦ț㲜笭犋橀ᔨ佾⚾瓠朕ḏ毺ហ漳怇㾚⇍罛緷䠌嫾㙐⮚眕☈ᷤ矼潮幝㶎磽竗⌤᛭篏廜➝橡㒘⡗㟓㱕序㴾糽甛甗卉槁叞劽伓⸃篢瞥⽫徯㼞絽煛砗小䖕瀁油ᩱ丏ㅫ䃧俶庩卡碣灏刃∿堠ଯⱣ嬶䰳㴋埫⽳畐缶ὕ礋繷沾䙉碟ㄘ嬟碍ഹྦྷ⾶帩㰲̀䤻䲷䉧勾篜䫀㌗೽䠎቟榭⥃㢏م౧橏⤿湞ⰶṓ爐᪻攮⪖簖ᜀ耚穆䥇憺➫य़䑃㕀揮昇絓えJ㼮犫保緵᥯翚疫庨㔚標悘棑Ѫ囊㿻澹硓燵淬⺿ཥ嚞ⴘ㍨琛⠝吰惩䣕Ʉហ瀷巯庄⽞翜䤜⍫琛⡟俨ⓡ㽜絿ߕǜᏮඬ棟孜攜⼔⚮៪᝸擩㽩䕔䖦֨ࡾ祚Ϡ妟爈ؘᐑെ「忬疒羅筒䙷烰༿፫䖝⬜Ѳ搑᯦ᵪ怜㻅歕缳綂ፏ甪䀿⏯㧵昕氀堈潦ᒽ㼇ǂᶚ矷撏穲峞㆝循丟ఎ㐋࿒㢹㿆绕羢ݙជ礚峟歓䩔៉尛㍗⌤怟庩劅竻篲爃ㇿ㷞紻㖀㔛㚨嗨繿ὗ㼜Щ簻琷笏楷㒉瞟䫞祭䀥秩匏忺冎傊㣈焅溓座ᩁ㚢粣奨瘯᧽䞶࿚伞縒㻌瘗戫幇撞寲șἩ䌄࿩咐䀖慁簥ڧ猳照屟咞㒼⃛劓簚ԃᐗ柉ᠭ⏃稍ྤᆓ癟朸໠⭜戣ࠖᐙ㏬恴绠幆༇羊િ䕟榾㇀؟縓⠝娽 㾬翳ă禇状¿䊯搿ࣰ䘛犝簑ပ䐾碢绝㹲䃷穏湱ⵟ噮䄞㈚䰖࠙俾ᾴ壺凹紳紇皆ؠẇ㒈㬜⻂侬䠉燳怊㾚翥簻磧箞欿瓟原繡昘尘⠑⿱ᨭ㾖翞ớ窞๭ᯜᏟհ␑柧䨦砏慞怑⠔耙̻硐͏泿搐㚞䈞Ნ喯ဖ濯ῑ☥绵絔䅏秏暗䆜㉡∞瘚⠑砅 忘㉬繁耛竨ཏ继嗟䙉昝ఞඍ瀋䇚➩湳⼫绘怿筂Ꮀ抟咩瘞㕜㠓紗濫㿈㾡縵縇砼䩟梟墟弧Ⱏ䠜䠐䪳㿢㾪罿彴挘簿繟抟䥸ঞ䜝ᰛ倛䠕怊Ύ㿡罦㴿笿矟柟姺帟㜞䰝炫爟㿪槷罦ů紕䝟眗睯瓯營瑿焏矟盅琟熟灭䝩焟砄֠༟瓝牰䁠ා璿璌Рਰ爗煗瞿矧猠ට盗猟睿瑬ᑀ໿痟准ᑠထ熭ޏࠟ瑻àເ狠࣯琗灿燯牿痴盀ຠஏ݀ീई❀ࣀਡ烠㘀ൠୟ甗畯炀ठધ瞏矠ಂ䛀ੀ฿吰༦䒾㘿烈摰ী౓π௒̰઀ඇ獖ׯ痴煾㉰ਈ慰ༀ࿛䅰ఀ਋睦䕐ਰࠠरি痂狟疷玏珠इ睥瓐ন斐࿰䇾Ư玛唐྿հࡧݰࢇ瓟盠ໟ皀ৰ඀໗獚䁯焀൳Ҩ฿焐৏眐ࡨ෈䀨୯爨ಀৠ࠯熀༠๿獔䃺䂯畚䏨ฐ஠ࣂ䂗甗咬Ո୧燐ࣟ疿瘨࢐ರຐ౦䅈ଐ࿏唀�眆█࿨ୈईੈૐවૈਠ୨༰෠૨રಈ཈ഈಯ圸ਈ༾⌀獐ୗ㑠Ԁ甴А๯皿盈ௐ෈૯矈ഏ瑦䑸ධ෇㐀玠෸ஸࢺቘจ୰ဈೠภ૰೨ନ໨෴畘ࢰ疸஠࿐痶燂٘ࠫ憘ധ灐ٸિ瑗瀸ৈཨन໰௞珘໗甘ॕϸසܤཬژआ猘ທ灐玤ࢤਘའࣘ࿀૘ࣨಐस࢈੆䚤஘ತફϤ༘஠೰眀ޘ೜敄ࡐࠧ獤ࣰࣤਤབྷ盤໸ਜ਼獰灄ทↄ๐డ✊ស疯璭擄൧盄࢏獸ଘਸ৘तസຄ྄иŇ眔␄஠࠴睄੟➴୘တૈਖ਼Ӱ೤૸ࢠ༭ɴং䇴ఴ灤॔垴।འݟ獴௄ை೴২େɔຨใǔ࿕Ѵ灴ࡓ⒔๴ॸ౗獔స໘໯痘༴ഹ熔ং䠔ੴ灔ຢ㒔๔ൔཞ睴࿄૤ਔ৤ఔິಘ攬ീೇ䏤Ѩ❢ၬ؁͞䓻ٙ䎡۬恡ƙݵςYǢϡˑӇ䅾ペ犄ڎ◶☴׋㙢砍晷䔎ٮˊծֶզӮƈĠҽ烕悎Ⱦ͜盲Ԩョ熰ۀ޺Ɉ̔ۥ╞䎒Ӱ珦҄灀ل£䋠ɌౌÂߡڰۀμల߹ֱ玠ذ͹�ȷɷ䜾ԸޞÞ烼ࠨჄӲ≷䝮甪۵ٴ̉䓰ࠈ癲瓠࿟ㄞԹؼƞpΞƜણӂޜมʄ΄̅ɟٷ䛈焢䝯甯䔐ɰݼૠň牼੠Ę甐Аʢ೬ѼಎȐż໠وɢ๊ϐნ఼ࠚ͇!לഴߜ൸璜࿀ຜ೽Ț؜಄̜ૉކۂडԬ䜃♇䄢ਔ₦➚⅌ࡁݠۢҼະ皼໠ШƼ๜ൺ،Աݢ୼๩،̀Мกճ̪ߑ،шڹԐۀȲࡲ໘牜ིඞٲະɰ҄炲ल๒Dz࣢ະ۠Ңಲ੠ـɲࡢา୔Բ໒ऀ癃ޖ˲໒ൌॲݬܺ�≋斞ʄߩ猒ഀ恬̫ü6䂒໤Ϥ̹ㆾٿɈ砝䈠  "}
      

    The complete round-trip took 45.4 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-file-analysis)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-analysis.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-file-analysis'
      • id string [optional] You may pass an id to link requests with responses (they get the same id).
      • filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
      • filename string [optional] A human-readable name of the file, only for debugging purposes.
      • content string [optional] The content of the file or an R expression (either give this or the filepath).
      • filepath alternatives [optional] The path to the file(s) on the local machine (either give this or the content).
        • . string
        • . array Valid item types:
          • . string
      • cfg boolean [optional] If you want to extract the control flow information of the file.
      • format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
    Message schema (response-file-analysis)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-analysis.ts.

    • . alternatives [required] The response to a file analysis request (based on the format field).
      • . object The response in JSON format.
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in json format. Allows only the values: 'json'
        • results object [required] The results of the analysis (one field per step).
        • cfg object [optional] The control flow information of the file, only present if requested.
      • . object The response as n-quads.
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
        • results object [required] The results of the analysis (one field per step). Quads are presented as string.
        • cfg string [optional] The control flow information of the file, only present if requested.
      • . object
        • type string [required] The type of the message. Allows only the values: 'response-file-analysis'
        • id string [optional] The id of the message, if you passed one in the request.
        • format string [required] The format of the results in bson format. Allows only the values: 'bson'
        • results string [required] The results of the analysis (one field per step).
        • cfg string [optional] The control flow information of the file, only present if requested.

  • Slice Message (request-slice)
    View Details. (deprecated) The server slices a file based on the given criteria.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-slice
    
        alt
            Server-->>Client: response-slice
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    We deprecated the slice request in favor of the static-slice Query.

    To slice, you have to send a file analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using ;, you can simply pass separate array elements). See the implementation of the request-slice message for more information.

    Additionally, you may pass "noMagicComments": true to disable the automatic selection of elements based on magic comments (see below).

    Example of the request-slice Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's assume you want to slice the following script:

      x <- 1
      x + 1

      For this we first request the analysis, using a filetoken of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8151-DKRZaj9ccNK3-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8151-DKRZaj9ccNK3-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-slice (request)
      Show Details

      Of course, the second slice criterion 2:1 is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.

      {
        "type": "request-slice",
        "id": "2",
        "filetoken": "x",
        "criterion": [
          "2@x",
          "2:1"
        ]
      }
    5. response-slice (response)
      Show Details

      The results field of the response contains two keys of importance:

      • slice: which contains the result of the slicing (e.g., the ids included in the slice in result).
      • reconstruct: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
      {
        "type": "response-slice",
        "id": "2",
        "results": {
          "slice": {
            "timesHitThreshold": 0,
            "result": [
              3,
              0,
              1,
              2,
              "built-in:<-"
            ],
            "decodedCriteria": [
              {
                "criterion": "2@x",
                "id": 3
              },
              {
                "criterion": "2:1",
                "id": 3
              }
            ],
            ".meta": {
              "timing": 2
            }
          },
          "reconstruct": {
            "code": "x <- 1\nx",
            "linesWithAutoSelected": 0,
            ".meta": {
              "timing": 1
            }
          }
        }
      }

    The complete round-trip took 14.1 ms (including time required to validate the messages, start, and stop the internal mock server).

    The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the filetoken is unknown, flowR will respond with an error.

     

    Magic Comments

    Within a document that is to be sliced, you can use magic comments to influence the slicing process:

    • # flowr@include_next_line will cause the next line to be included, independent of if it is important for the slice.
    • # flowr@include_this_line will cause the current line to be included, independent of if it is important for the slice.
    • # flowr@include_start and # flowr@include_end will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.

    Message schema (request-slice)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-slice.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-slice'
      • id string [optional] The id of the message, if you passed one in the request.
      • filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
      • criterion array [required] The slicing criteria to use. Valid item types:
        • . string
    Message schema (response-slice)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-slice.ts.

    • . object The response to a slice request.
      • type string [required] The type of the message. Allows only the values: 'response-slice'
      • id string [optional] The id of the message, if you passed one in the request.
      • results object [required] The results of the slice (one field per step slicing step).

  • REPL Message (request-repl-execution)
    View Details. Access the read evaluate print loop of flowR.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-repl-execution
    
        alt
            Server-->>Client: error
        else
    
        loop
            Server-->>Client: response-repl-execution
        end
            Server-->>Client: end-repl-execution
    
        end
    
        deactivate  Server
    	
    
    Loading

    [!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with --r-session-access. Please be aware that this introduces a security risk.

    The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the expression field. Furthermore, you can set the ansi field to true if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of the id field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.

    [!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use --r-session-access if you are unsure).

    The answer on such a request is different from the other messages as the response-repl-execution message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving the end-repl-execution message.

    The semantics of the error message are similar to that of the other messages.

    Example of the request-slice Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-repl-execution (request)
      Show Details
      {
        "type": "request-repl-execution",
        "id": "1",
        "expression": ":help"
      }
    3. response-repl-execution (response)
      Show Details

      The stream field (either stdout or stderr) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.

      Pretty-Printed Result
      If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:
      R> 1 + 1
      [1] 2
      
      Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. 
      There are the following basic commands:
        :controlflow[*]     Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)
        :controlflowbb[*]   Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)
        :dataflow[*]        Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)
        :dataflowsimple[*]  Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)
        :execute            Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)
        :help               Show help information (aliases: :h, :?)
        :lineage            Get the lineage of an R object (alias: :lin)
        :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)
        :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)
        :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)
        :quit               End the repl (aliases: :q, :exit)
        :version            Prints the version of flowR as well as the current version of R
      
      Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.
        :benchmark          Benchmark the static backwards slicer
        :export-quads       Export quads of the normalized AST of a given R code file
        :slicer             Static backwards executable slicer for R
        :stats              Generate usage Statistics for R scripts
        :summarizer         Summarize the results of the benchmark
      
      You can combine commands by separating them with a semicolon ;.
      
      {
        "type": "response-repl-execution",
        "id": "1",
        "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n  :controlflow[*]     Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n  :controlflowbb[*]   Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n  :dataflow[*]        Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n  :dataflowsimple[*]  Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n  :execute            Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n  :help               Show help information (aliases: :h, :?)\n  :lineage            Get the lineage of an R object (alias: :lin)\n  :normalize[*]       Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n  :parse              Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n  :query[*]           Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n  :quit               End the repl (aliases: :q, :exit)\n  :version            Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n  :benchmark          Benchmark the static backwards slicer\n  :export-quads       Export quads of the normalized AST of a given R code file\n  :slicer             Static backwards executable slicer for R\n  :stats              Generate usage Statistics for R scripts\n  :summarizer         Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n",
        "stream": "stdout"
      }
    4. end-repl-execution (response)
      Show Details
      {
        "type": "end-repl-execution",
        "id": "1"
      }

    The complete round-trip took 1.3 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.
      • ansi boolean [optional] Should ansi formatting be enabled for the response? Is false by default.
      • expression string [required] The expression to execute.
    Message schema (response-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'response-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.
      • stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
      • result string [required] The output of the execution.
    Message schema (end-repl-execution)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-repl.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'end-repl-execution'
      • id string [optional] The id of the message, will be the same for the request.

  • Query Message (request-query)
    View Details. Query an analysis result for specific information.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-query
    
        alt
            Server-->>Client: response-query
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    To send queries, you have to send an analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.

    Example of the request-query Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details

      Let's assume you want to query the following script:

      library(ggplot)
      library(dplyr)
      library(readr)
      
      # read data with read_csv
      data <- read_csv('data.csv')
      data2 <- read_csv('data2.csv')
      
      m <- mean(data$x) 
      print(m)
      
      data %>%
      	ggplot(aes(x = x, y = y)) +
      	geom_point()
      	
      plot(data2$x, data2$y)
      points(data2$x, data2$y)
      	
      print(mean(data2$k))

      .

      For this we first request the analysis, using a dummy filetoken of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[1,9,1,14],"lexeme":"ggplot","value":{"type":"RSymbol","location":[1,9,1,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,1,2,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[2,1,2,7],"content":"library","lexeme":"library","info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":4,"parent":7,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[2,9,2,13],"lexeme":"dplyr","value":{"type":"RSymbol","location":[2,9,2,13],"content":"dplyr","lexeme":"dplyr","info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":5,"parent":6,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[3,1,3,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[3,1,3,7],"content":"library","lexeme":"library","info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":8,"parent":11,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[3,9,3,13],"lexeme":"readr","value":{"type":"RSymbol","location":[3,9,3,13],"content":"readr","lexeme":"readr","info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":9,"parent":10,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":2,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[6,6,6,7],"lhs":{"type":"RSymbol","location":[6,1,6,4],"content":"data","lexeme":"data","info":{"fullRange":[6,1,6,4],"additionalTokens":[],"id":12,"parent":17,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[6,9,6,16],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[6,9,6,16],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":13,"parent":16,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[6,18,6,27],"lexeme":"'data.csv'","value":{"type":"RString","location":[6,18,6,27],"content":{"str":"data.csv","quotes":"'"},"lexeme":"'data.csv'","info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":14,"parent":15,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"content":" read data with read_csv","lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":3,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[7,7,7,8],"lhs":{"type":"RSymbol","location":[7,1,7,5],"content":"data2","lexeme":"data2","info":{"fullRange":[7,1,7,5],"additionalTokens":[],"id":18,"parent":23,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[7,10,7,17],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[7,10,7,17],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":19,"parent":22,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[7,19,7,29],"lexeme":"'data2.csv'","value":{"type":"RString","location":[7,19,7,29],"content":{"str":"data2.csv","quotes":"'"},"lexeme":"'data2.csv'","info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":20,"parent":21,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":4,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[9,3,9,4],"lhs":{"type":"RSymbol","location":[9,1,9,1],"content":"m","lexeme":"m","info":{"fullRange":[9,1,9,1],"additionalTokens":[],"id":24,"parent":32,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[9,6,9,9],"lexeme":"mean","functionName":{"type":"RSymbol","location":[9,6,9,9],"content":"mean","lexeme":"mean","info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":25,"parent":31,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[9,11,9,16],"lexeme":"data$x","value":{"type":"RAccess","location":[9,15,9,15],"lexeme":"$","accessed":{"type":"RSymbol","location":[9,11,9,14],"content":"data","lexeme":"data","info":{"fullRange":[9,11,9,14],"additionalTokens":[],"id":26,"parent":29,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"operator":"$","access":[{"type":"RArgument","location":[9,16,9,16],"lexeme":"x","value":{"type":"RSymbol","location":[9,16,9,16],"content":"x","lexeme":"x","info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":5,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[10,1,10,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[10,1,10,5],"content":"print","lexeme":"print","info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":33,"parent":36,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[10,7,10,7],"lexeme":"m","value":{"type":"RSymbol","location":[10,7,10,7],"content":"m","lexeme":"m","info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":34,"parent":35,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":6,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[13,35,13,35],"lhs":{"type":"RFunctionCall","named":true,"infixSpecial":true,"lexeme":"data %>%\n\tggplot(aes(x = x, y = y))","location":[12,6,12,8],"functionName":{"type":"RSymbol","location":[12,6,12,8],"lexeme":"%>%","content":"%>%","info":{"id":37,"parent":52,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[12,1,12,4],"value":{"type":"RSymbol","location":[12,1,12,4],"content":"data","lexeme":"data","info":{"fullRange":[12,1,12,4],"additionalTokens":[],"id":38,"parent":39,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[13,16,13,32],"lexeme":"aes(x = x, y = y)","value":{"type":"RFunctionCall","named":true,"location":[13,16,13,18],"lexeme":"aes","functionName":{"type":"RSymbol","location":[13,16,13,18],"content":"aes","lexeme":"aes","info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":41,"parent":48,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[13,20,13,20],"lexeme":"x","name":{"type":"RSymbol","location":[13,20,13,20],"content":"x","lexeme":"x","info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":42,"parent":44,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"value":{"type":"RSymbol","location":[13,24,13,24],"content":"x","lexeme":"x","info":{"fullRange":[13,24,13,24],"additionalTokens":[],"id":43,"parent":44,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"value":{"type":"RSymbol","location":[13,31,13,31],"content":"y","lexeme":"y","info":{"fullRange":[13,31,13,31],"additionalTokens":[],"id":46,"parent":47,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","role":"binop-lhs"}},"rhs":{"type":"RFunctionCall","named":true,"location":[14,9,14,18],"lexeme":"geom_point","functionName":{"type":"RSymbol","location":[14,9,14,18],"content":"geom_point","lexeme":"geom_point","info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":53,"parent":54,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":7,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[16,1,16,4],"lexeme":"plot","functionName":{"type":"RSymbol","location":[16,1,16,4],"content":"plot","lexeme":"plot","info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":56,"parent":67,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[16,6,16,12],"lexeme":"data2$x","value":{"type":"RAccess","location":[16,11,16,11],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,6,16,10],"content":"data2","lexeme":"data2","info":{"fullRange":[16,6,16,10],"additionalTokens":[],"id":57,"parent":60,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,12,16,12],"lexeme":"x","value":{"type":"RSymbol","location":[16,12,16,12],"content":"x","lexeme":"x","info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":58,"parent":59,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,21,16,21],"lexeme":"y","value":{"type":"RSymbol","location":[16,21,16,21],"content":"y","lexeme":"y","info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":63,"parent":64,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":8,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[17,1,17,6],"lexeme":"points","functionName":{"type":"RSymbol","location":[17,1,17,6],"content":"points","lexeme":"points","info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":68,"parent":79,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[17,8,17,14],"lexeme":"data2$x","value":{"type":"RAccess","location":[17,13,17,13],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,8,17,12],"content":"data2","lexeme":"data2","info":{"fullRange":[17,8,17,12],"additionalTokens":[],"id":69,"parent":72,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,14,17,14],"lexeme":"x","value":{"type":"RSymbol","location":[17,14,17,14],"content":"x","lexeme":"x","info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":70,"parent":71,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,23,17,23],"lexeme":"y","value":{"type":"RSymbol","location":[17,23,17,23],"content":"y","lexeme":"y","info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":75,"parent":76,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":9,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[19,1,19,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[19,1,19,5],"content":"print","lexeme":"print","info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":80,"parent":89,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[19,7,19,19],"lexeme":"mean(data2$k)","value":{"type":"RFunctionCall","named":true,"location":[19,7,19,10],"lexeme":"mean","functionName":{"type":"RSymbol","location":[19,7,19,10],"content":"mean","lexeme":"mean","info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":81,"parent":87,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"arguments":[{"type":"RArgument","location":[19,12,19,18],"lexeme":"data2$k","value":{"type":"RAccess","location":[19,17,19,17],"lexeme":"$","accessed":{"type":"RSymbol","location":[19,12,19,16],"content":"data2","lexeme":"data2","info":{"fullRange":[19,12,19,16],"additionalTokens":[],"id":82,"parent":85,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"operator":"$","access":[{"type":"RArgument","location":[19,18,19,18],"lexeme":"k","value":{"type":"RSymbol","location":[19,18,19,18],"content":"k","lexeme":"k","info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":83,"parent":84,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8151-kkbFIutVMy2E-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8151-kkbFIutVMy2E-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
      
    4. request-query (request)
      Show Details
      {
        "type": "request-query",
        "id": "2",
        "filetoken": "x",
        "query": [
          {
            "type": "compound",
            "query": "call-context",
            "commonArguments": {
              "kind": "visualize",
              "subkind": "text",
              "callTargets": "global"
            },
            "arguments": [
              {
                "callName": "^mean$"
              },
              {
                "callName": "^print$",
                "callTargets": "local"
              }
            ]
          }
        ]
      }
    5. response-query (response)
      Show Details
      {
        "type": "response-query",
        "id": "2",
        "results": {
          "call-context": {
            ".meta": {
              "timing": 1
            },
            "kinds": {
              "visualize": {
                "subkinds": {
                  "text": [
                    {
                      "id": 31,
                      "name": "mean",
                      "calls": [
                        "built-in"
                      ]
                    },
                    {
                      "id": 87,
                      "name": "mean",
                      "calls": [
                        "built-in"
                      ]
                    }
                  ]
                }
              }
            }
          },
          ".meta": {
            "timing": 1
          }
        }
      }

    The complete round-trip took 26.1 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-query)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-query.ts.

    • . object Request a query to be run on the file analysis information.
      • type string [required] The type of the message. Allows only the values: 'request-query'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • query array [required] The query to run on the file analysis information. Valid item types:
        • . alternatives Any query
          • . alternatives Supported queries
            • . object Call context query used to find calls in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'call-context'
              • callName string [required] Regex regarding the function name!
              • callNameExact boolean [optional] Should we automatically add the ^ and $ anchors to the regex to make it an exact match?
              • kind string [optional] The kind of the call, this can be used to group calls together (e.g., linking plot to visualize). Defaults to .
              • subkind string [optional] The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking ggplot to plot). Defaults to .
              • callTargets string [optional] Call targets the function may have. This defaults to any. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any'
              • ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
              • includeAliases boolean [optional] Consider a case like f <- function_of_interest, do you want uses of f to be included in the results?
              • fileFilter object [optional] Filter that, when set, a node's file attribute must match to be considered
                • fileFilter string [required] Regex that a node's file attribute must match to be considered
                • includeUndefinedFiles boolean [optional] If fileFilter is set, but a nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • linkTo alternatives [optional] Links the current call to the last call of the given kind. This way, you can link a call like points to the latest graphics plot etc.
                • . object
                  • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                  • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                  • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                  • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                  • attachLinkInfo object [optional] Additional information to attach to the link.
                • . array Valid item types:
                  • . object
                    • type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
                    • callName string [required] Regex regarding the function name of the last call. Similar to callName, strings are interpreted as a regular expression.
                    • ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
                    • cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
                    • attachLinkInfo object [optional] Additional information to attach to the link.
            • . object The config query retrieves the current configuration of the flowR instance.
              • type string [required] The type of the query. Allows only the values: 'config'
            • . object The control flow query provides the control flow graph of the analysis, optionally simplified.
              • type string [required] The type of the query. Allows only the values: 'control-flow'
              • config object [optional] Optional configuration for the control flow query.
                • simplificationPasses array The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used. Valid item types:
                  • . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
            • . object The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'dataflow'
            • . object The dataflow-lens query returns a simplified view on the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'dataflow-lens'
            • . object The id map query retrieves the id map from the normalized AST.
              • type string [required] The type of the query. Allows only the values: 'id-map'
            • . object The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
              • type string [required] The type of the query. Allows only the values: 'normalized-ast'
            • . object The cluster query calculates and returns all clusters in the dataflow graph.
              • type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
            • . object Slice query used to slice the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'static-slice'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
              • noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
              • noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
            • . object Lineage query used to find the lineage of a node in the dataflow graph
              • type string [required] The type of the query. Allows only the values: 'lineage'
              • criterion string [required] The slicing criterion of the node to get the lineage of.
            • . object The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
              • type string [required] The type of the query. Allows only the values: 'dependencies'
              • ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
              • libraryFunctions array [optional] The set of library functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • sourceFunctions array [optional] The set of source functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • readFunctions array [optional] The set of data reading functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
              • writeFunctions array [optional] The set of data writing functions to search for. Valid item types:
                • . object
                  • name string [required] The name of the library function.
                  • package string [optional] The package name of the library function
                  • argIdx number [optional] The index of the argument that contains the library name.
                  • argName string [optional] The name of the argument that contains the library name.
            • . object The location map query retrieves the location of every id in the ast.
              • type string [required] The type of the query. Allows only the values: 'location-map'
            • . object The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
              • type string [required] The type of the query. Allows only the values: 'search'
              • search object [required] The search query to execute.
            • . object Happens-Before tracks whether a always happens before b.
              • type string [required] The type of the query. Allows only the values: 'happens-before'
              • a string [required] The first slicing criterion.
              • b string [required] The second slicing criterion.
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'resolve-value'
              • criteria array [required] The slicing criteria to use. Valid item types:
                • . string
            • . object The project query provides information on the analyzed project.
              • type string [required] The type of the query. Allows only the values: 'project'
            • . object The resolve value query used to get definitions of an identifier
              • type string [required] The type of the query. Allows only the values: 'origin'
              • criterion string [required] The slicing criteria to use
            • . object The linter query lints for the given set of rules and returns the result.
              • type string [required] The type of the query. Allows only the values: 'linter'
              • rules array The rules to lint for. If unset, all rules will be included. Valid item types:
                • . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention'
                • . object
                  • name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention'
                  • config object
          • . alternatives Virtual queries (used for structure)
            • . object Compound query used to combine queries of the same type
              • type string [required] The type of the query. Allows only the values: 'compound'
              • query string [required] The query to run on the file analysis information.
              • commonArguments object [required] Common arguments for all queries.
              • arguments array [required] Arguments for each query. Valid item types:
                • . object
    Message schema (response-query)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-query.ts.

    • . object The response to a query request.
      • type string [required] Allows only the values: 'response-query'
      • id string [optional] The id of the message, will be the same for the request.
      • results object [required] The results of the query.

  • Lineage Message (request-lineage)
    View Details. (deprecated) Obtain the lineage of a given slicing criterion.
    sequenceDiagram
        autonumber
        participant Client
        participant Server
    
        
        Client->>+Server: request-lineage
    
        alt
            Server-->>Client: response-lineage
        else
            Server-->>Client: error
        end
        deactivate  Server
    	
    
    Loading

    We deprecated the lineage request in favor of the lineage Query.

    In order to retrieve the lineage of an object, you have to send a file analysis request first. The filetoken you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.

    Example of the request-query Message

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.16",
          "r": "4.5.0",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. response-file-analysis (response)
      Show Details

      See above for the general structure of the response.

      As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):

      {"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8151-Su2Ndzx53vbG-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-8151-Su2Ndzx53vbG-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-lineage (request)
      Show Details
      {
        "type": "request-lineage",
        "id": "2",
        "filetoken": "x",
        "criterion": "2@x"
      }
    5. response-lineage (response)
      Show Details

      The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).

      {
        "type": "response-lineage",
        "id": "2",
        "lineage": [
          3,
          0,
          1,
          2,
          "built-in:<-"
        ]
      }

    The complete round-trip took 8.0 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-lineage'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • criterion string [required] The criterion to start the lineage from.
    Message schema (response-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] Allows only the values: 'response-lineage'
      • id string [optional] The id of the message, will be the same for the request.
      • lineage array [required] The lineage of the given criterion. Valid item types:
        • . string

📡 Ways of Connecting

If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.

  1. Using Netcat
    Without Websocket

    Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):

    docker run -p1042:1042 -it --rm eagleoutice/flowr --server

    Now, using a tool like netcat to connect:

    nc 127.0.0.1 1042

    Within the started session, type the following message (as a single line) and press enter to see the response:

    {"type":"request-file-analysis","content":"x <- 1","id":"1"}
  2. Using Python
    Without Websocket

    In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:

    import socket
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect(('127.0.0.1', 1042))
        print(s.recv(4096))  # for the hello message
    
        s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n')
    
        print(s.recv(65536))  # for the response (please use a more sophisticated mechanism)

💻 Using the REPL

Note

To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access. Please be aware that this introduces a security risk and note that this relies on the r-shell engine.

Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).

The read-eval-print loop (REPL) works relatively simple. You can submit an expression (using enter), which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:). The best command to get started with the REPL is :help. Besides, you can leave the REPL either with the command :quit or by pressing CTRL+C twice.

Available Commands

We currently offer the following commands (this with a [*] suffix are available with and without the star):

Command Description
:quit End the repl (aliases: :q, :exit)
:execute Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r)
:controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)
:controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)
:dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)
:normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)
:dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)
:lineage Get the lineage of an R object (alias: :lin)
:parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)
:version Prints the version of flowR as well as the current version of R
:query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)
:help Show help information (aliases: :h, :?)

Example: Retrieving the Dataflow Graph

To retrieve a URL to the mermaid diagram of the dataflow of a given expression, use :dataflow* (or :dataflow to get the mermaid code in the cli):

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.2.16, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=

Retrieve the dataflow graph of the expression y <- 1 + x. It looks like this:

flowchart LR
    1{{"`#91;RNumber#93; 1
      (1)
      *1.6*`"}}
    2(["`#91;RSymbol#93; x
      (2)
      *1.10*`"])
    3[["`#91;RBinaryOp#93; #43;
      (3)
      *1.6-10*
    (1, 2)`"]]
    built-in:_["`Built-In:
#43;`"]
    style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
    0["`#91;RSymbol#93; y
      (0)
      *1.1*`"]
    4[["`#91;RBinaryOp#93; #60;#45;
      (4)
      *1.1-10*
    (0, 3)`"]]
    built-in:_-["`Built-In:
#60;#45;`"]
    style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
    3 -->|"reads, argument"| 1
    3 -->|"reads, argument"| 2
    3 -.->|"reads, calls"| built-in:_
    linkStyle 2 stroke:gray;
    0 -->|"defined-by"| 3
    0 -->|"defined-by"| 4
    4 -->|"argument"| 3
    4 -->|"returns, argument"| 0
    4 -.->|"reads, calls"| built-in:_-
    linkStyle 7 stroke:gray;
Loading
R Code of the Dataflow Graph

The analysis required 1.7 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.

y <- 1 + x

For the slicing with :slicer, you have access to the same magic comments as with the slice request.

Example: Interfacing with the File System

Many commands that allow for an R-expression (like :dataflow*) allow for a file as well if the argument starts with file://. If you are working from the root directory of the flowR repository, the following gives you the parsed AST of the example file using the :parse command:

$ docker run -it --rm eagleoutice/flowr # or npm run flowr 
flowR repl using flowR v2.2.16, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│   ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│   ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│   ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│   ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │   ├ ( "(" (6:13)
│ │ │   ├ expr
│ │ │   │ ├ expr
│ │ │   │ │ ╰ SYMBOL "N" (6:14)
│ │ │   │ ├ - "-" (6:15)
│ │ │   │ ╰ expr
│ │ │   │   ╰ NUM_CONST "1" (6:16)
│ │ │   ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│   ├ { "{" (6:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "sum" (7:3─5)
│   │ ├ LEFT_ASSIGN "<-" (7:7─8)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ├ expr
│   │   │ │ ╰ SYMBOL "sum" (7:10─12)
│   │   │ ├ + "+" (7:14)
│   │   │ ╰ expr
│   │   │   ╰ SYMBOL "i" (7:16)
│   │   ├ + "+" (7:18)
│   │   ╰ expr
│   │     ╰ SYMBOL "w" (7:20)
│   ├ expr
│   │ ├ expr
│   │ │ ╰ SYMBOL "product" (8:3─9)
│   │ ├ LEFT_ASSIGN "<-" (8:11─12)
│   │ ╰ expr
│   │   ├ expr
│   │   │ ╰ SYMBOL "product" (8:14─20)
│   │   ├ * "*" (8:22)
│   │   ╰ expr
│   │     ╰ SYMBOL "i" (8:24)
│   ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
  ├ expr
  │ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
  ├ ( "(" (12:4)
  ├ expr
  │ ╰ STR_CONST "\"Product:\"" (12:5─14)
  ├ , "," (12:15)
  ├ expr
  │ ╰ SYMBOL "product" (12:17─23)
  ├ , "," (12:24)
  ├ expr
  │ ╰ STR_CONST "\"\\n\"" (12:26─29)
  ╰ ) ")" (12:30)

Retrieve the parsed AST of the example file.

File Content
sum <- 0
product <- 1
w <- 7
N <- 10

for (i in 1:(N-1)) {
  sum <- sum + i + w
  product <- product * i
}

cat("Sum:", sum, "\n")
cat("Product:", product, "\n")

As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.

⚙️ Configuring FlowR

When running flowR, you may want to specify some behaviors with a dedicated configuration file. By default, flowR looks for a file named flowr.json in the current working directory (or any higher directory). You can also specify a different file with --config-file or pass the configuration inline using --config-json. To inspect the current configuration, you can run flowr with the --verbose flag, or use the config Query. Within the REPL this works by running the following:

:query @config

The following summarizes the configuration options:

  • ignoreSourceCalls: If set to true, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files.
  • semantics: allows to configure the way flowR handles R, although we currently only support semantics/environment/overwriteBuiltIns. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information.
  • solver: allows to configure how flowR resolves variables and their values (currently we support: disabled, alias, builtin), as well as if pointer analysis should be active.
  • engines: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information.
  • defaultEngine: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used.

So you can configure flowR by adding a file like the following:

Example Configuration File
{
  "ignoreSourceCalls": true,
  "semantics": {
    "environment": {
      "overwriteBuiltIns": {
        "definitions": [
          {
            "type": "function",
            "names": [
              "foo"
            ],
            "processor": "builtin:assignment",
            "config": {}
          }
        ]
      }
    }
  },
  "engines": [
    {
      "type": "r-shell"
    }
  ],
  "solver": {
    "variables": "alias",
    "evalStrings": true,
    "pointerTracking": true,
    "resolveSource": {
      "dropPaths": "no",
      "ignoreCapitalization": true,
      "inferWorkingDirectory": "active-script",
      "searchPath": []
    },
    "slicer": {
      "threshold": 50
    }
  }
}
Configure Built-In Semantics

semantics/environment/overwriteBuiltins accepts two keys:

  • loadDefaults (boolean, initially true): If set to true, the default built-in definitions are loaded before applying the custom definitions. Setting this flag to false explicitly disables the loading of the default definitions.

  • definitions (array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have a type which is one of the below. Furthermore, they may define a string array of names which specifies the identifiers to bind the definitions to. You may use assumePrimitive to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).

    Type Description Example
    constant Additionally allows for a value this should resolve to. { type: 'constant', names: ['NULL', 'NA'], value: null }
    function Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts or open a new issue. { type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
    replacement A comfortable way to specify replacement functions like $<- or names<-. suffixes describes the... suffixes to attach automatically. { type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
  • . object The configuration file format for flowR.
    • ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
    • semantics object Configure language semantics and how flowR handles them.
      • environment object [optional] Semantics regarding how to handle the R environment.
        • overwriteBuiltIns object [optional] Do you want to overwrite (parts) of the builtin definition?
          • loadDefaults boolean [optional] Should the default configuration still be loaded?
          • definitions array [optional] The definitions to load/overwrite. Valid item types:
            • . object
    • engines array The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used. Valid item types:
      • . alternatives
        • . object The configuration for the tree sitter engine.
          • type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
          • wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
          • treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
          • lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
        • . object The configuration for the R shell engine.
          • type string [required] Use the R shell engine. Allows only the values: 'r-shell'
          • rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
    • defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
    • solver object How to resolve constants, constraints, cells, ...
      • variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
      • evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
      • pointerTracking alternatives Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
        • . boolean
        • . object
          • maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
      • resolveSource object [optional] If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if ignoreSourceCalls is set to false.
        • dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
        • ignoreCapitalization boolean Search for filenames matching in the lowercase.
        • inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
        • searchPath array Additionally search in these paths. Valid item types:
          • . string
        • repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
        • applyReplacements array Provide name replacements for loaded files Valid item types:
          • . object
      • slicer object [optional] The configuration for the slicer.
        • threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.

⚒️ Writing Code

flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).

Using the RShell to Interact with R

The RShell class allows interfacing with the R ecosystem installed on the host system. Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor).

Important

Each RShell controls a new instance of the R interpreter, make sure to call RShell::close() when you are done.

You can start a new "session" simply by constructing a new object with new RShell().

However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).

With a shell object (let's call it shell), you can execute R code by using RShell::sendCommand, for example shell.sendCommand("1 + 1"). However, this does not return anything, so if you want to collect the output of your command, use RShell::sendCommandWithOutput instead.

Besides that, the command tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.

The Pipeline Executor

Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices. However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part. With this, we restructured flowR's originally hardcoded pipeline to be far more flexible. Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps. In short, if you still "just want to slice" you can do it like this with the PipelineExecutor:

const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
  parser:    new RShell(),
  request:   requestFromInput('x <- 1\nx + 1'),
  criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information

If you compare this, with what you would have done with the old (and removed) SteppingSlicer, this essentially just requires you to replace the SteppingSlicer with the PipelineExecutor and to pass the DEFAULT_SLICING_PIPELINE as the first argument. The PipelineExecutor...

  1. Provides structures to investigate the results of all intermediate steps
  2. Can be executed step-by-step
  3. Can repeat steps (e.g., to calculate multiple slices on the same input)

See the in-code documentation for more information.

Generate Statistics

Adding a New Feature to Extract

In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).

  1. Create a new file in src/statistics/features/supported
    Create the file example.ts, and add its export to the index.ts file in the same directory (if not done automatically).

  2. Create the basic structure
    To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):

    const initialExampleInfo = {
        /* whatever start value is good for you */
        someCounter: 0
    }
    
    export type ExampleInfo = Writable<typeof initialExampleInfo>
    
    export const example: Feature<ExampleInfo> = {
     name:        'Example Feature',
     description: 'A longer example description',
    
     process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo {
       /* perform analysis on the input */
       return existing
     },
    
     initialValue: initialExampleInfo
    }

    The initialExampleInfo type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resulting ExampleInfo type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).

    Every new feature must be of the Feature<Info> type, with Info referring to a FeatureInfo (like ExampleInfo in this example). Next to a name and a description, each Feature must provide:

    • a processor that extracts the information from the input, adding it to the existing information.
    • a function returning the initial value of the information (in this case, initialExampleInfo).
  3. Add it to the feature-mapping
    Now, in the feature.ts file in src/statistics/features, add your feature to the ALL_FEATURES object.

Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT tokens. So we define a corresponding XPath query:

const commentQuery: Query = xpath.parse('//COMMENT')

Within our feature's process function, running the query is as simple as:

const comments = commentQuery.select({ node: input.parsedRAst })

Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:

appendStatisticsFile(example.name, 'comments', comments, input.filepath)

We use example.name to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output. 'comments' refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).

Clone this wiki locally