Skip to content

Interface

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

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-07-17, 13:48:31 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-8066-9i67VbS2FwIv-.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-8066-9i67VbS2FwIv-.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-8066-9i67VbS2FwIv-.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-8066-9i67VbS2FwIv-.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-8066-9i67VbS2FwIv-.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-8066-9i67VbS2FwIv-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8066-9i67VbS2FwIv-.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-8066-9i67VbS2FwIv-.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.5 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-8066-RkYPqSu33sY6-.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%2D8066%2DRkYPqSu33sY6%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 8.6 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":3}},"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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8066-Zbmfuhm1vZB8-.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-8066-Zbmfuhm1vZB8-.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 10.8 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 7.4 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䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ㄂侶䧴䜉䮂疲䀾䂁拠ᏹ籀Yᒂ᢬ጰ灼ଙ泠भ㊣䐠溄カ઴䀦ⓩⁿⱈᵇ⫹崮䉡㵮ι獬殢ପⱺ䮒楻⭊⭻爸ᓪᮆ櫻孎揻ඞ桘࠱悈⤬慙❘ᖢ杶⃘䄅戢垕梠⣍桊⤺⑛督斠⾓檘᜻枘὇挙弯渚羟栥ᤠ溈劃ู恈৊卑柨⥕ᒠ⢴暙悦ે哭ᢠ湓Ƞ㥈෻倸䜛⣄օ°མ㔇⛩〱ම᡼楊粵护䭞♸⭊捹ℙౠᭆ拹捂᷸⥾涡䤑擪倽ᩣᦍ毥眰�棬汇ԋ殛潧洚得樘罟性˕恻磩浙や⣙唣ృ㕽⦡ó⠺㌫▉※➉ᦐᬺ崤椐㘥ଦ䃞ⳅ̰渺⎈愥掃⻑䚄淇ᳬ恹✘᥈他ስ储妦歝塡抢ᢶ㠮沶匔墡ᑪᏇ੖屴䁦὚ᝰᓴ㣭架睶呷ཱᙷ䓪啄櫹ὴᓗዥ䂸椥曮䜪惓喡ᄀ媥䌔ᤵヽ厬♧傷ᕄ剥笵桙粏咖绚ፙ枆ሮ⼆傅ᦎᏙ礁洭Ӹ㩇䪩ᕷ⓺坄᫥቉䵀暅䌭ᗇ⢽ᨡ璼⟬䁃ᘠ䴅㫎ⲥ䓪洛ᤄቃ嬆ᦗᅉ⁏ᆄ䁅䠄ˌ഍ৰ娣䊬ᔷ㈑䧳⧢጗ࢴ婦ᧄక㋃厴؜售Ҳ噎⾘㥇⪹᝷擦召㢪Ử㫾䗶վ叉畠ᝫ筋埫為㛻ϗ嘽壡挼⇁ぇ绲幌叉㒬㏙㰧嫬敘奁⨬嫪܆熜⡨囒✿䞻㺣ᴨ۠ᴠ༌ᖬՉ浹⬑Ⓟᰦ恔懁嘅Ι▭⛒擷ɨ᱇ᮀ䋒ォ䕶戯焹☝㼧⿿㽅㯐垦尒稶♐ೢ㓬䖜瀦簪䠛獓穋∦㍕恜ⷠ牔ⓨ徫䅬෰⑙㥒⇂縲⊼੧䑧⨠᪸惀ન㍈.ƶ㹬唼券渥➨㢭䥥ᣳ〨ƴ⺥梞䌡᠌₨ႝᒣ�͐Ǒ䌊ུ剤ȁ㸾䆸ᯨ穢娙䈠῜䚂⭄缦኱丣ᄴ䝃┷䌠䉢㱗Ӥ㼪ൾ∱♤䇂᪣㩚⎤ᙤ剅䙈朢惤ű並儺ἃ恇⍓౑瑡䗨斯នࢨ⥪⡁փ翦掤㤥䑤䒤玭䤈䶩䱡䆾ᯨ傺撀㍒㉼⠓Ъ䄀䴩᜸㇥᪂兞ጤ⥄Ი䕘纪哤¨沴全ྲ繒⡚㓅ʄ䟄畭唉Ġィࣚೀ╀␀㛤䁝䓀獨唁䱠঵᥅ሠ㥋拌埅ず杬嚫ᓡ戹嚻ᄧᜳᅌ㋢ễ暃╌橬唓䴉岲牆泩橒⢎₆⁩旄姬ᢻ䫙⸰�宼᫻֘癄∾◅䉸ᕒઁℲ␂倠㒭䌰ᖦჀ઱哚㌖㹩孢䤠Ѹয়ᜪ浌஡⧻䆏ቢ瑎ⓧॹx䂟撪޵େภㅶᔂ幎儢⣨≹禎撓͟狢㧻⥳筨㖨ᦟʥֳՉᅫ㉆⮕奰㦐参䎵狼⥁̨ᗆొ࿽⯔㲷᥸╟㕈Jⵏ䫥ⱹᕹ㖍ឋ࣓⩱㭷㦎嚐㙏欜⼉ⅷ妹䜊擜卮ⱅ涕ᔾ㷌焥⢅⚸秋ጻ滙୙❶㆏嘒䇊᫘ŕ揦ᔶ儺浆ᯉ‡疃㺵ᖃᝌ熍䢪浭⵷搹埋糐欣㣷ͨV墋糇䱑૽┠ࡩ⸑嵻৕⬬⒖ᮇ坖矌曟⮍峿䵸൛㷒㬰җ⥠В䞃坊卋団෽᧾专嫺㧃嬓⯔侚瓚沭滻⮕妱փ唋߂⭽㑗妌痂稊期⠵⯲嵁娻曜᭟㙤浴㖸壨~᰻溤涥篸ㄨ㛌䷏窙‭ថඖ稹粨‍䐮䏣墧㋁ሽ㤯ᵱ皎礸櫔欕汘嶷墡Ӌ媧㺯䃿㛌朽೎ࠠ㹄Ἵᑛ⍢㪚䲇橸恕声㒜䐗৛欳繕䣢㼛㗒ܬだㄏ疒猾暹ᾃ祘થ呧⭛⟉䣫痲專ậṃ⭓厇忇�宄珗೶ř愹熶⪓橸ჶ㝊營㪋⥔奰⽙撸⺣ᨣཝ㵾㦸冗晗⩏⥠ʰ㋺俹䑻ӌ庫㧺珘ザ₄*畎儂5智Ẍ壃᠅⸊㞶浃ᜊ烍ヴ䷥箺ᨂ⮋竔厺㵷涓ᚍ㻌泵಩䴺ඬ嬻໗卽㜇䯋宆悏㣦盍䪸旪✻ე毙㇖㮞㙻✮夏Ⲫ暆涪⍻掸㯷㋇ᦡ堀㾏䋦癝䌼憥嶫◗䍩㖡ᖖ䝓᪴ൄ桭桾冯湃ႜ㰟嵇熜瘿娼ǰ潣畏䀠ґ旷嫋ಓߥ㚖犘䮑礿ऎ᷃尧⏈䎢⍤篏嘶Ꮗ้檾ാṍ䥸⏩⃧暓➣㩮䴚乴殽㡒僲ⵝ娚㴳⇔ᜮ䯘ኈ囹悾㳱ᵓ烝䯾㵹榒អ煮墲䡧䰼廣ự䙝氇Ꮇ仝簌确ងm潾䳿䶤州㦊⫄ᠬめ䖮䜈㛽揾娅幋找ዿ㴗ኚ奁狇⯧⧕௾☑൧䥁䠓㬛௸㏶焜ਉ῵斶㏶僉䛄瀡♼Η㏸筦؈思畟戚㹪֘⨧㣽笗瓴峸㢧綫澎䰗弱官矊絛㔔坖矿ὕ䗶櫎䟾თ氺焒⇇጑៳㱧琀㼁柎毶ˏ墙㋵绅๢㪫焮ຕ㈯涟㬒渝娙濐䭟橷场⼠ᪿ⻛榞∊摟娦䀓稛動涿甞ሆ枸␠ᜠ瀓⎧帀̞䩗δ淿拪瞓شʟ斎成㽂ΰ᎞㚰悞ၴ懨̢➱紀ኞ帖㨶㲟⌆֒ྰ㲍澡ⴐ俍ഈើ㒗⎴ǀ᣶漓䞦嵸ᐡ਩䗕㱗暡云炃㲑扁橰䀲΃泞喴䢋घ὎Ė偹ⴄᩁ婕⢐ᶠⅨ䰣௄涺懚⧤漮䉞毆Ꮧ⿅綩⢁洫⡪᳔ၔ娔ᔣ凜䯁堯桵ⱷ䋨朩ᢅʴ፾K性䋜ს⇔҆䧉⊜嵧攫䌭旡ᙰ䒇Âḁ縬྿䊈ᄜ碬⒐⎨憱巣⎪ᑉɨ㘦䢜ʽ澱䊩₀㳪棈⩠ᑱ⋐ᭂ檭呪䳁Ũ൦ᑩˢ⋱㚮➹䉏氖扲瑭䎨桑橰㩈岨ᜁ婓౥⎴ᗺ榯咁䗆ᩑᙢ剎ň໱ᛕ䢸拶ፑ咫ᗖ揶ბ䐠ᱪ䳦 ඨ溹掖ᡁ㒬䨵抮ᖑ࠮歔⍘ፁЯ椯⎁柱䀓緛嶾ᰡ氯楞緙⃞堖ῆ挬➨櫦履䎈ሩ↭῜Ꮙ⧜ቧ⎶Ѿ᜞ຫ㒪ዱႠ侯揌挞掩瑨ʌ䖩Ⴀ橴䁀儑ᅑϒ喵ዳ̩纩宣጑ᩩ䌵㉪䵹ᢑ婫ឰ淙ᓩᾮአ劮၉悖窶ၕ̠⿠屵ⲕ⥉楬੧᳐ཉ⥩䩱捵ᣉ簑䀶ႜ⭉婓⩎台䓉且晁匕ᒑ獮᪕ᓕ䇄䔗橰涍ᔠ筯扵̖ᗺ❩㪛Ꮬ➪杫㑤䊕᷈栠䁓絵䆩灨溠充ᗈ惭چ䥽ᰁᮩ⢀㊃ᾌ㣨≫ᓃᐹ㓫☸∼ᔹࠒ慜㎙᏾天檁㋣ᒱ䔨ࢌሿ䁹疂ᙦ㋢⽹㓤㙠㋑ّ䔒瀣厨改仪㨴〳፹晫噮君᷹⎫癪招ᔸ盬窗≫ᬱ曩檜牭 䳢䚊獇ዙ彯媛㐐ᴉ䐓ʑɁᢠ⣨ṩ၎䃁஖๰劍溙杤ṳ㋺ℙ⌤幪䳀ࣤᴬ⹻拢⨙嗣⺍扵ᘙ柭䣟珌ᎉ⧧⽘㉯ᇚ੢䆀૪漥ᙦ䆗厰廜᭩♀犟ቱ㚵㒆梧኱ⓨ究ୠ墂籍乣䊬ੈ䪣ၾ㲀契⇖再ਨὥ⫩幱஋᥈晋兹஄捥幎勒ህࣈ坠ㅽᎈ汅ա流௬቙䥢䦈䪙斱喴⥮槉⇠栖㡮૑ᭂ䵈ᠷ䏏ኾ乏䥠≣ႅ磮窞䯜俞㕤⩌岔媙牦䥺岬寱怖⪆ㆼ待冖窗䰒仹䘀ሶჸྌ㳧ॿ᎛Ꮙ⃈䀨⫢囩㝊籧䭭Ῠ棊⼼⩥ⷙⱡ䕦⬓૾瓍ֆ⬼凚᳌ᖘ⯸岅㥋幣祪張㹍啨咍ᬵᙧቛξ欑屍䢻パ˵ᛤⅧ厺嫵㹎疏⪥ু布ྯ㍶┥缕䦗捜围ৎ便આ奕⛎ⵤ⭫ዪ姈喛䭰ᐥ䳡浪䯖囕ܫ㈺熫Კ䙎ᇙ歋ᢵɯ㩿涎妅揋ӓ歮ᢈ⩠ᡝப啶檒絻ఎ圉手緟毞埥ゎゞ㉉Ǣ䷊⹫犁念㿖噌ᯝክᕓ㞴橹⦭㧎▚父♨竌᎞紿Ἑ㢍繻⑏ᖙཱ碍父啭㹈㎘≠幭仌ᢦ偹寕Ⓩ浹ⱙ倥⎫獤਼᫱哪捸⑥崠⒎ኤ婾宖⫑䭷Ᏸݱ忍冸µ啍ᙯ⮈叵嵪\"塪ᲂ坱዁尋⸡㹴ۤ斑⬡⛻狷嗔䛺岰狃㙥㖄怪犺㝄⫊୶盻㗫㕻㤰烵狎ԫḃ¸䑳㙤䇽傰璋⍝䇺庑稛⢌凾䀸癲▱ʣ-⍚Ⱐ海✨柲⍛ۍ亲⌇㙛ኦB疇❚䀷㛹੷㍚◶⼊⡐୵⳻勣૗㏵㣳曎榗㟻拌⎞瓉嚑➡p㭛⮊慊Ắ≭஺ི܂⣯㲚籼廛≲ㅜ榤㳐璕⏛ࠦm矎ߛᔵ洣皦⌈痱擣琶᱂ဨℶⅤൻ䫹Ἐ㛨䧱矸绍㟯㠺囹䲗畮ᐚ甽生瑟⨛̅籣㔏㌳➽ᔓ㒛㫒♽⫮㡠澫げồ憫ⷄ憡䈃瘲⦚㡝甌࿏⪫Լ终ష㚭⒦恀౻⺺⥵⇀๿ⶭ⑒匠�瀰䱊樻㬮঻綶浒暀碏䕢ễᩇ†恼䓡沩䒍䆲ᷡ揷०⌲ᰂ劮⒏ⵍ䗬咮౷ⴺᯚ簬㣋浉⧱䆢㒈燦ᳱ畉珜⸴᪂禕〶嵩游䪻䟃⓯ଁ澅涿燔ᱡ䋴岝䢜Ⱁ盓ǭ捏梮憫粜溅ォ矇粚䬓䖌⢔㡚̻垩岃摟⍀Ƭ䰢䨫㱛惄㊠ܮAہ堤湟㢌䅞Ὴ笿䠵䞶ㅊ劙⢩氾櫨᪔᱄欠㻒懝揇眾杯曽䐬۰ᬡ䈳㳯燺⭰羨㍃ᶈ殃埿㋅Ũᵮ桗厼զ匮柏叴坰૭㪔ᎌ池㛬㪕㐝Ự挡⚔㍸擼⟫了㎑䎹暁䈡㍫ᢞ⇭窈燏ṙ棤皋⏧༙犘چ玃ᶺᜳ⺘㌷ᯙ睻暑㐛ఙ矆௨猼፧`㪁ǐ婒䁍䆖珠帉⁎暒ଯ᪙啦憉䍐ܙ畈ちୟᣅ寬⫃௳ᨥ粀䆏ࣘ墥容↙玲䛅燭๋䮨墐溣ᆏ㎛栵敏纔玣᳥䍌疲㎲寥孌চ୽儵䵍ᢙ⮿ᢐ犢֜䏐⫋⛎䖖䰂妅癏೨欴䟙磪ঋ媚奵掮噺氊彑!哕㒳ᬾᇓ堕㺫䍽䬘暹㜠卿ᬃ朵㠖ཹ嬓♹⨻ݻಫ基岳⫓⋦✉㸫姃彈᠉㝋㛷㋪䐕㓣㉺公㠓友䨸✃ങһⱿ䙊㞹㐋敤܅圞恨᳽嫫ᔻ㧓ܨ䐡㟌㑻⇐眇圳㸋瓿೵㠝㍻㍿拥垣㱪廻۱㒛㞻猶そ巻媙䗻᮷ᨬŢᓁ⑗氎㱌઻䀵⛐נ䇬擠傒㷜ᑏ攁➪㢜栕瘨ⷝ२仦ࠡ䬷HỀ๩睟㊰௖#ც櫛ܿ۸┠瞡ᅈ䁙ᦷ㇚樕ጄ࿷㧛ᠦ滶冗㹳⠤哮ᗊ㲛䱢攙眒び㗡弉⠏㌡䟺漫癹ܛ⌄缆冯㐛у绻䦩⌧࡛㊚柠繬橵⽔*ᔍ浾嶊擘甠ṛ䄉㜟⇛⅜⇮砑㟛㑘Ủຯ㭳♡戎❏㾧⊹ᓽ砝༢剞㼋眫敧ⱜ⋍ྟ䀛⻴ਐ优庇È㢞妧䐓孝灦➫େ䏸溂佯㶳ᕝ漺伨秇ᗆ槢⋨矇矽畁侕䲇穝᧿氼知ᣜ剣倬௉㠦䅪ᙠ炷ⓝⅱ䮼级㞐⧩瞴熛潞廦俼愛䃝槥န爛マ绩伸狩瓚湊સㄇ೙⦣�࿌儱糧⻚痘秖旼侒眇糛ỷ仏でዞᇫ碔繧䩞嘛侊礷竘㽏⼢竧曻Һ濚绳᾽你瀗㬇᪹ự䇙₀䝃Хᆈ孳チڞჂը杬ืԫ拌૥⬮Ҵ癗䋘业侏㩷቟ᗼ滊稷䗘䘏း癶線Პ濢ᅢ⿡剰坯Ṣ⠠⏡湼罇ᇞ㽚ᗮ猠䯞巴ㆎ犜̠㷳澭จ䤫䁛潔䨗ཝ戊侪耗様׳瞡爷橚᧥ㄈ焯⣞ኪự灍碘剣䋩˧᾽௼໒碗䲞ḖỮ熗⯚懱‎礗娰☥Ỿ眤᪙嬡⼐磯≚樐榆簷͛ϷἊ癶ঘ渐໺▏ሉ㈳2琓ࣤ㯽侳桗⏛؉澽Ïʝᘽ湩竏柘毵ổ爀ᶞ緾彆瓯䎛岋ṭ烗⿿ϱᆙ玎យ䗱揳甏圖བ㋌㟁掍矎㽳ᤇ兜ᕔ徦筏⿜积溜畗多怰ḳ稯┟ᰒ滪檽噏झ⮫緿ࠩ℺硔䆿哜ɠ繰呟➟㯥㽐缇嶘㐔㸭耇⎚㠅⿹獷攞⁊㿰᧜༭⼤绽縉瞓࿾绀ܷܫٔƧ璯෰怉罇煵ྙ䯷庑簏▚笠㽩盏ៜ吕ΰ絿窚ᗡ㽟ᳪ瞯喞厚尉恗ṉ磍捘☝砒ヶ罓緬⟠䬞㹚ః榡䀹硟浟Ṽ猑篯ཥ㲎瞟墾倛Њ篈㸿㡧捿ᒜ羔⿤À峠౯䚮㜘稃v糮䆀ồܣ娐㡧⢕⃀狋ྡ匚㻨翅㺁㧯栠洣䀬ϴę屻皀㈡ங㭤ၿ੊׃䚸࡬栩㭡ĭϱ燫䚞凛⠿ᾴ䄠磭拟Ტᴗץ䄈ˊᗰ⤂橩ʀ為灉⃖௓ᚢ右㒹惥⃥ϰ⢎̧ㄉ࿑䇞㪸ዯ̢ᘯ⿺惭糸೬௡圧櫃氼ↈ燐䱜ᛁ䨠䄴挱簺ᙨ㰊㒧ᴪ㇖ĸ禨᭟⁣ሮљ侅綄ध勡◚堵⣖⇉߄᥹्甭摄捵㇢ᕬᠤ䯋尺绛᪽Ѱ䰀柝䔪ᡔ儚粷环䱁⪤∸傛㹽兂䂅â˷瑏ᤥ洿悾䟁セ矆墀慯第ဠ濼攨㟳ᢓˆୗ䚁媦俍墈勻ݲ䫣⪠ ⩯榰憨眬㱀罉㴪တ䀞燙氃࿘憭穴ᛟ᧢倪䑌噷䐀೻䷄灥洂滘偯ݿ敶̠炯㱉朼ˑ眘㛞綛␶むሀшረ摜緶≈ݹ沧噄ぼ㟩ຆ矓憨ȪνᘢἯ桗¬⊈ౘ䀁掦焴悇ἇӸᗺᵃ◴灒ࢦ䕉੠Ⲅモ垪䂋国嬱么䍃⢬籙䣚㲞૤⑁દ☴ѤĤ䖏捘ӂႩ寶≹⊘དᏞ㞧琊烚Ǹ欯ઈ仢䔬ᡟヿ䌈র㵱㱧㤵咔Åᅺៈ楃⭁ᩈ棑䥛璴㙖㝸紼Ḽ内窨ᘐ勃ᢪU⢩䉊眨㠱┥绠౷円㉺ᦠ忂层࡚梡Έ曬㼞䙥簸呤䄧֬ὠ粃✬橉ᤂ⨓࡟䦦嫥䛄灢ↂ䄆፨汢ⶨᙞ⣆⏱બ㖱㋥ᴱⱦ刘䝶቞㎃⊡晛榖揧೬␠璒嬰䒍ಓ䚖Ḹ婂嘕癈ᄞ抑ດ⮱⬤示ѷ㑫䗶ᑈ憩ެ㙜抔㧱搬ブ繘奡㱸ㅂێṀ䥣▫籜壖㱽෼ⷱ㋑漺䲃岍ᄞጨ䎤ឯ乃ㄝ䶠乼∑դ笲Ᵽ凸䚤ᡘ䠂㔭牏皐ኯ࿴┑叧渀怨ॲ䓾ᵝϜᎬᙈホ⎵ব㳁㣧弳屲ਛ䘝䌏Ԃࠨᅆ㣐悸ڗ䖩⨙₶屬ॊ䞱ဨ眃爭㩄㢧熸䮾䄡ᙄ̓C偷䖖枤䰄ત䥂ӽᡃ์㨑塆挻扢ॴ⒏桨牔牨樰⤔ዯᗲ㑱㨐㏇㺾䨐䚡៝ᬩⓔ➾磥ጿ௸㒩ጤ碱摿৵։᷈圙♭套礈ᷜ佒〩猳礶>㹟ᬥᨴ笳嶬煅┎ኮ๗冡繆㼸ኇᲴ䑥ᢟ⩲☑⦸堪ফϴ੩̛㐶ॖ⥰̅Ạᶳ᳂⥚Ҹ勨䮪━⇤һ᡿泥⚵ῄ矂Ⳇ㕒ᡒ劇උ䤱筛匋檄⥥䕵ቐ䰃ສ湃ⓤ又仲㡲绅嚌㲞竓▒⺷㎼㢧ᘰ䡼搙ᙺⶰ嗆௣㒄ㅼ⓵Ứ籲প噑咹厧䄪安㗆挅媛ჷ⟥憔刨ဧᘬ椐瘖㖋䨉ៅ皼剨槊ⓙᲔ斃䎫ᵁ坧刯䚚㽤ᯆ䆱怷椯♅曘⍤絭́ೡ厨䠨㠉壅ື⪂ा⟚ሔ糁礴䍎ജ㊊Ⴤ㨠䒹̽ᑦ尤䋠ด烳皨捍礆緼䲨㪉ᮒԦ⚊۴擯亂઀ңؿᔓ〉䮉ឹ䤫䪺Ⱓ䥄❦ᴄ浳Წ䵇೾㖧䔶㟩⫐䖿暗⥺䆽洯ൂ怠歙梈㰪પ⨑璆ຸ晢⧬明᫬䐐㫬歅㵱▕䬾墦⃄࿅尠妏☏⧷⢨拫ԢⳔ㐉䥖ₑ䩅斲暇䦹䂛ጌ狓䜆㭎�በՔ㻸᫣䦽㱥冁ᇧᮔ㩬⮨煈泟㏅䳦㙹玅㼵浊㤩昑⑼嘱峫ಠ桧層典䱊Ὰ⮰㐼䦯㯈䭬瑳䛩杔河务䣘「笇⮴溟扬ᬗ᣼涓哀䘷ὁ㶽甐䂢਄冻墄妝䛞ြ卓匨᝖䓉琙盗䷉籇䞺䟐廨Ң⬌演买ὁ⒪劝䦄⎑䘇䚸ພ㧩▏䊜娲寬卡糓拦⁁Ẑ୆炼乻┏斛ᘌ㨓殭ొ紘኏䥾⼙䳢羱๰沰ᘥᙒ␡ф❚┏琋叞䚹娆活癳䦌䒗ᠬ䍳差ੵˆ䲿䥡℥紓朩ౕᄫ䔭䊸▕⟯୓᳧ዅ仡⦙㎅䁼ښ⌄ᕠ嶱✫お晛吺玻䣺㢬ℤѵ熷ㅣ⛗ᶼ猫埮⽑ᤖ୅ı㿙唧硴兺᳖㪈ᘜ僒ഷ⣅峌狐⳼␥夶亿䅻ᥚ៸Ꮒ棥峁⼷Ł୶⎢ᦘ㡃п㉣ؓ晿ᙔ憫ⱋ䣄抧爌⻑⒱㓥䉫熃䗭ं԰ఠㆴض抶浢⼩◦崶ᡰ庛䖊䑭ᮜ粫癑䓂ይ爢⮉ᔐザ㉴媐硴燘ᧂ䞣痰◨匘䭼⨡⥅੅౵溒ਇ⒳淫㟄ຐ哖ഛ䋇΀ᕰ仢ᆰ〧╌䆔剨ཫ桏浚唖牸ⴎ⼥ڴ䆷榇◽ᘳῲ惪㵍䍀匽厽àᾘ䕣倬぀惝ᛌ囔媁栤泀㠽䯘Ӊ㌥☴౼䦈վᝬ喌䉽筌ឰ猃䯖ⷹ㑲޵䤠㥦昘曜嚒汒債ܪዔ嶧䀥㵙䡆ධ䥻䖐❼坲哪㑬㓔ૢ㌱⮩䄾㰚⡹㊉牌䋂堜禜⹈峑ገ⮊ⴑ㣥㮶┥䖞缞ᘞᭂ㥊棍㽋䈦爧ў⹖婐᥵橪ᄹ摢啲棳ӏ⥆犲Ⰱ⧗ᖵ囇㉶ʯ救査᭝ᙁ朲ˍ利⯧劵㴅ఇ⩳斋䥉ᗐ市䊪㛫!⫃䔅⻵㴂冫ಬṔ啔䚐Ҋ䆡勈ᭂ⋝୎⸡☵扷橰ᕯ䘆噺哣᧊ຐ᫁憛ᕛʅ㡑Щᾃ䖅⦲᠈垊克ፊ╍ደ爣⬁⍼棶硲ᑃ9䟂割潢沄⛐᪠ਮ伹♥ݵ慹㚗ଉ哦勻↋燊柸櫩獽烕ㅵ䀷㥶劊喜噚徺䌰༐竕㴶樲甕↖㦵ٹ⠢№㮖姸⾋嗊曚⊯௣⪺⑙瀠ݴᶈ勳嘖妃╁撩䫖∽悷⫕㔹╶歿究ᦺ✧Ἀ欋䋊勐戣毚䢦㦕๩佾嵼稘啢坺䁓畨䛃⫌ȕ䓅⎔៴哥␵პ噳ዪ⠊᧋拓㫟劅䮒㵵創〧統㖁ၡ强琺ئ狦䣸ᮺ⩂㬕䁔ᦱᦎ֯喡妸∺獨᥇گ櫉۹䜴⭣ヅ↑ಿ唱啨ऻ䏋೔㬛⯧⾶⯔੗‥⎍㢜⭑屦嬻⼂別ᡪয়⦲㙤俶磻╭ඍ旱嘺䘺Ꮟ㩈⛖⁤橘䙭㹔朹綜\"䍊࿦爫ن⧛䨩቉ࠝ㎵᯷ᕷ㵮畡摻ᥚ嚻⪍槒ۖ䧬槳♙俷᰿呈䕟᯹墈⎺䩉ೇ瓉૎⢳∕⥕䫢玖䉳䏙帉z溉཈Ӎ㋨浹ᴼ綇ჱ䆊พ攆僦弋徯歉䌸婷唱嵭ⴴ伷厕喰嘹巚库₊㫒⡫拌溱䙙㑪Ꮳ疇礴搩劘咨᪥嗝䬐Ⱂ欅⠭崄䃻㦉⵸͵島戊ᯇ病囚ⰙġЙ擷櫱卹猃㘅凚䶋ᶉ惗曦᮱喻⋍䌳Ằ㊽䵯㦂ഠ㲓႐⇇㛝宎䔳⯭僶祻ֆෝ㞁咖攨➏䧖眝嬗䬹චȱ㤨纳偱ˮබ楫م㷛䠯婀̛㓚㨷㶰͢消㕅奆䫻䓇緝皰务漛㶍䭁廸ސᵑ旣堮俭ᤈ⏔皰檊⣛㝕⯕᭹䰮ᵮ䈑♮慀᩵⏁່䈙凄㊽㪗ⱁ獽ᨘ瓊徚癒⦊皱伞㓌凇㐍K⧰ލᴸ᎔ኺ曣഍௏໻⨩濍㌍㽗㧿杰ᵲ甼⥎擔䌏㷚嵘ǃ䯋⥙᳔凰ݶ嵚盕崂纺঎曌㬈㫙檊㔽⎖۾烍巹残冮橚㢤緉໩嬕減⃽矕巸䝨ᵆ疿Ḯ䤋庌Ꮩᛳ᯽೧⿽璗ᇵྛ崡皭圾竲഍㯜亶㮣⦷㶽捖剴綉᷉矍៮䁚缊敟Ệ㯟ካ㷉化秷ஈ斂㚧坎党ଉ寈庡㮹汏㟽圗汎ㄲ㵱Ë劾䮛䬌䭽ẻ⨩⩓㣍Ổ䧸⩉㵊矗唰㒚匈毊ဢ禬ۄ䱽⧗痹䞒緋睫婞养嶏狒㻭筜⛿㕽咕㟱ㆣ䊸瑙嶮橛堎࿀囍殠歵⊝䧵⿺獥ᷗ矟左篙⤑緕ᬅᰁ玻┭࢖ዹ㞒淶眧䰎〛䤈�Ș歋号ᄥˇ㷰䃰ഗ璽挟Ģ编⯰ὒ㷵着㠞媘䏾㭣㸁盏᱉ୁ࠽䗲䇀ᡄጬᶎᾺ⑀愚Θ܃澯ᰝՠ翨ᾒ㰨ᬯ䢣婗毱枎由瓈⽡睽Ꮃ࢟垝磗喚⤙桘摝⶗庌ะᡯㄢ⬓悛罭㵈བྷ㱭ㄕⷲჷ㑘䁈㌯ʧ⌵ࢩǡ㏝潻䰵厗嫺愋繤ڐ㉠眧砹翯䇊ˮ涷⡣ፗ䡓㝕䌰殸㳱⊊㽖ᢊ笘婥Ӡ綣䜮㓎僷繁稰㈁孚搏濑嫩止᪁哣ܩ悥䉓᷆喻⼞䬦䩤䒅∟㶼ᣰ繃眬瑘ᄖ㵅㙯嶱䅦烗撈ⶓ३Σㄾ౴㝪椝ࢥ౤㽏ᘦ᰹䒗ǘ䞘Ự搣஗棿儏䌯憔㖲刋䱓㒙挦õҀ榃ᬭ϶㞏␘դ㫁厧ㄻ၍懱䞨ᬐ曃᠗崱J挡᡼㺽⫬咣ॻ⳨慥ט枼ᬖᔴ僣䍛ฬ㩠伦ܾ毪冲ߜ᧯⬭瀠Ṕ礕͗໚එ磁亡絢庰᰾Რ᰺ậ幟椔⍼ྴ㉑濦挽梔䇩䟠⸤疆ѭ壂毜Ᏸ䶒≨㭧挏㵜䧥ުỠ浣↯癕儆፧ඇ幞䈛Ꮘὶ㇗毉ἴ尜珶ဠ㐿ᎁ๦Ჩ盧┻沛燆✟狤竃㙮剞璀叏嗪⩳㛘咤庿䨘õᠭळ婬ٖ䔐损ཪ㋩牧倏㊝棭⟵ᱟ䳺䯰⑉ℬ㬜不徉烇⼽檕৒䘭᪴羣㬗繒㣹半৺ソlƿᝋ䈸ţ¬അ൯䍙఺搔ᒌ㩉䥦㠺粕懯✲ᳯ⓳۵獹ᵸ㌻≦㢟㒆罊ŝຆډࣜ㦣杬笰䳽Ꮫ౒㥉䔣䲸ࢇ槙⛓ᾔⳓ焯㵆泴䍥仒ij⦇椁皌⊮⬌ᩈ濃ㅭፒ焆䐕䴺㣹燧䶾Ꮢ㪫戧ᥱ忓淄㽎綦䠩��汆浇嬵㻭曥燴璓䓯楜䴄猩ผ㭙䩦ⶺ䓽㧈/ᮣ備㯬὜筷ӄ䐋П֦滭ṽ禢ރᬧ㹓坬㹟唃፳䶚㨁歇垿亟㪰㭟ᰂ堓㡏Ǭいڴ丏⊀ࢼ涏䷊姝⟽ᴢ挓ᥭ᭕˳㶶ୁ㋕⤷⼃᏿䨎گ᫸攓᫭佑⤁捓乡㪉糇續冄ᛒ㵧䢗䋕ᩯཝⴇ挳乑ヹ矆垽ㆆ秎桽玍✚ܨ௪⺯暒ⷯ⌑斆䁿ખ妴曠孬瞝⠖㍝̏ᨩࢩὔ抶砰灆䈖標ᥠⳫ翯羾ޖஎ䱪㇅縷䚻濜◝ᜬᵒ檣ᢘ㳛⃣䌘ఘㆅ珁繸嚍㣛ហ巢滓❏ᣑ䴜嵐睌朦恦广䖛䐯欀Ɗ䦝⴪摜敯峉⺤劸✐乏Ⲙ㧭䞴ᠲ搫࣎⩐⋸䯚⼱㎎ᘰ楻斍㭆ഊ巪捋ᓍ勘戴℞η凱啹䵾ς䡮垬ᙲ摋問䝞䔁吀ⵄ㌅畷ㅸ㼯單囚徃❋绎ۖ櫬▵殖ആ狷ᶖᄯ䗺ᝪ弪燫૏᳓勬⬰໵㷕䛶岽疒痽坽智環溬ჰ笀䡔ⲵ㎥䎷枾ᶊᘉ囮塐瀌㻎ờ㬍ಠ温ྕ婷઺涂ඵ⛾徘浫ٌㅝᴈ䭌Ⳮ㺕峷䭼䎞⚬㙵ἦ瑅㋠⮅۾ᯩ孜㹂嘷⍽Ẉ◤㝆彬砋䜖曙ᐿⰘ浪断婶䳼䄷ළ竇t᜞䊎㧑京\\滣㊩塷὾উඨែ密活ڏᛝ仟ᮢ沥孍坖˿⯁慞囇౺檫旌㗔ᬉᯠລ㼭敖፺榖竺㛨ᯤ絻㇦㗘固⭚淍㔰ጧ戾㶍ᗧ㠚父沓એ䛚䴅獈渝㕑䳖⻼䢘ฌ圣墀掻ു✩粰緮溤儽孀૾඙羞ᙞ彲氋♏ᇙ᜙宱咠ߵ岖函䭯܅圓娆籛㭯珓ӯ⭀洷㙽渝ó殜ᆣ㛦夔獫ᾎ㏛䔖㯙泷㴠ᅇ獬瞒᷺砍彑䱒ᤍ∤ἅ䪩濙棽柗䷼䖃ᷓ㟻巯❛旍䟔嫺⭋沓㉹伇ʎ⶜妩癐Ṯ绫唍䗝✖䭽㛙㍵穖楿ᚉ喽皖獶筻㇦秕᱾氏⸿キ燗ⷿ侜ȟ垣悞旡ἤ姚ও笼涨浤⯶⏽Ĉභ省媎漫濍柚㫴孟汽㚵搯⽹宔ዔဈ䄡猼ⶎ傛䈐⭩瀍㊽簗廼喗淄ဝ弣㦋௦埙䈆᱘ᵳ䔍圗᪉儒乽砋头粻積ූ⇩殇滃㲣昗瑚ㄍ涬ໂÜ㑧埭៖䫥厃䈀猲症牜ᄒ㸎༤嬖旛爽寝绵߸㞍㓃捷㷿椋⦷㨏嫞栞庌࡝Ȑ宦沈筝䓖忼珈⎠睢⫑瀧⪐ⲑ更燋ⱈ田㞯囻澞憻ྀ㽊絛ܾ႕伂箶瀟㩈ྯ扟礋廑䤚從ぎ庌办㹛宔⿈獝簯慘ए涫㞶彩祪⌽勜⨝尓֔ᯭ敯଩⤟㸂໿币獧總ᛴ爎䝒᳕㵤ᕯ湙唅ツ侶孍㍋㽵⃰ᨛ㖡痦㑵唖㱛夗Ꮙ噂㡾栳种䚔哵㰍⽌煳䄴⏽ᅳᎣ坥嫆擻䋗暓刁⠕ⰱ⹃椴᳿傚墁䩧嫙殘欼㷝᧮➁ᷬ羳攮❝ӎ琁䯤㬙绻䔶殻爟枢ᗴ琳揯奛䄅玺㚮㮉搇⢡Ɛẉ⟁២砓朗ᗹމமວᭆ愛ᆍ࿟娇篰弨㻳彶媦徑௘⻣孑瑅凣Ᏺ戂�Ⳳ焓噮敺ᶒ௳睺㩅瘷䙿岘旧᭐ǐ԰ㆦ⏿猐Ⰰ䚖㥁槇笾庑旯䏐岪纱祏狞ҏ䰚䎙妠ᕷ煾᪓᧻ំ渲筋䞗學欜␕⻇䪦峤䂍䖒Ἀ⎡Ხン湏⑞㔇痝⼡ớ⏇兼ᠢ娚᠎庭崳瞣⊢疊၂儀䜊甫只続灠㝡岀ӫ滮磘羋⏧ཙ㡕盻⮏倨ฎ僡巰砃檏槟㷱Ꮞच应䱐࣢䅆䘙സ沲౻墴⃝嬕縛⽅㶹樷㞾⊘姥㝵岴硽䑗ᗙ᜞渞⻵㧁厧ᝬ熛㈓杂⸄獋䯏ᐋ疏尗༛㬑瑑嶕ၿ垚嬫徬瀥擮橙㌍᷑濅㽣㤇擽�帇堅廻㒛緗ⅰ厶䌂䯷漗ㆻ͢⼰磬㜲徊珛厎Ꮭ和朅噏㢝秅ᰎ姟㷵矝巆໐梎ᯆ优߇滕㴽类巽⇿巴⟻ⱡ筛䐾᳼䗌尐禶嶫゗ᕏޒ਋៏忒矛䱎ߛ俖洑ཱྀ狅翋䶎溙␠⟸㲭㮧甖იሗⰆ渶㶕纋婟ే縇杼㿻㺥潖ʜ欞宷満箝梯⓼ᄑ܉ఎᰩ燭弆ᤫ匐寛杀礳稯ᐎ夞縉搞㒃㋇沾⪘玕ǃȎ椾棯⟖唒ḓྂ㸱眧焾劝ӌ栛寤㲓橈䍝䳛曱伶㸁緛疿᪘䨟ⰛἿ垓緧作㧑嚖竀㳽㚵硾庚㈔ᎶἮ㮃縯囿⌔㻘䝑㲓㯳溏᧝礋ៈ澕嫥罻䷾໓珦侩㶉砉医㋾ⱛ᠈溚㧋罏箎כ㧰絕張㌣屿碝稜堟὇㴝緋囜礕箊将崴窫摿⭝Ӌ硬⽐婋熯➽ⴖⰃ絩㷹犷哾擜眝㟛睦竞瑤獞粞寞澍㵬縫籿嶞⸂埖ᛊ緻殐⏝ܘ㯩涹㳯ᗓ䴓䞞ᘏ㐘湺㸋搗楖旚篰漻査㡩䞿Ⓘ਒染庶类㰏浟⼐琈΅㺲㜇硇◘下毋潡ᬧ篯搌ຑ㰔᾵㰣㳕穟嗚จ促ℙ㠵淧慼⨑㈆᾽㺵环呟㚜䨍㟐䯉箛䭗ᅽⲕ燸熣⻵爻丏耋羏毾㼺緇憏࢜ᨙݸϋ㲑瑏殢⌘朎堘亙粭煿糽嶝妘ズ祟㛄㆏∕䘜⿎彁窷抃擞昛㜎忺翘秏廟㕗ޕ兢ࠫ惄恿䶦珐矺໽ෝ罗槾䜜䰔dz㺅窽棛瞝ḕ丑碮羀瘊䅀┐㖈㎿檽暯絋糌ณ砝ἤ峍糯每泩䠕嘛̳綯璹ኛῑ唂㿥綛瞋硟㼟⠒瞩ឞᕏ爛㴟ᴭ䷬➥糍㌷䦞丘疝怒缋㳏浟ӿᶓ簍䆽繲ܫ婾ⓔ⠋怕懴ि悋橝榝俪殔㸵烽篾燛焉殬縢稤熟׏㤟᪎翃繍㍟䥜缵夶Ꮶტ䱯洟正竒俶矸罷瞯嗾瘚㠆耑儏粏生㕃倗㿩羔睘ᖈ涛䯽⪊䘝Ց䂐ă濣埁從繿㲹箏狯梿尠倡亄丛ာ⑅࿩忍ܮ繄秐ՠษ杯刟Ğ⸜綛䵔⠇䁂㾶¦ຸɩ牑ޏ捨償Հ漜㛛嬐ဳH䁼ĉ㺹絇橐༏楠㚠敀೜㐥㻷ⴃ䁄₅㖛繅㱘ڏ燏朅嘟ⴡ儣楪㰗ⴏ翭䶬䨦Ʃ糴ݶ熀ኗ䈟㹎戣㈤⿑╄濫⁧㞂દᄷ窸ඏ槨ҹᢡᬢ⓸堒焍矯₇漹ǯ綋礳䑯澀㔠䥜漣耙猓Ⰵ㿩徠⃜溲ɞ碏灡扠⢟ὂ紜කȪ耎䫫厥ў㻍緿竤瞿溧䝡ᰞ”㠛᠕上忹恴䄝Ƽȣ箐໬涟䝀䠞殍簥䉴吾䡝⿂罩༃㱽簌撈ợ巓ມ㘜໙▗ਏT䂐罼ȍˤ㣴ઈᷗ䲄⌞庼䄤琒␾Ỿ䞱ݾ繸綪טఈᴰ㹠扡֤׻䰭剋ࡆる㽱⃥籔՗矸ჿ张塎ᜢᄧ䞗㠷ၓ恱惒繕ήӗ砟暰ⲟѾᚣ滨⨩戫翹䁼惵ລϢٚ璨ᢀ㺻ᘠ䘝伥砨 硋炔羁Ɖɒۃ畇न㫰ṡ嬭壘Ⱄⰺ灐ࡵ惃ŀ䌱ޭۈᄨ㭀柡③ധ【ଂ䰼电偔恿䴄ᤃ䕄ẵ䊰宀⩢愧堐ȹ㡅ぬὕ䅂巩ՠڌࣨ㔘ɡ⹣Ḱ礬刺㸿羢✴䆂ϥګ畘ᳫ䣀䙁㙢尤ဩ瀿⿦Ꭲ彰䄩˅ؤઘᇋ儀樞⍽ᴥ縩㈳框柂儞䅑˿示燈ኋ䕁⮞㮍ኦ厖㈽桑宩僲䅪䏪՗珔ᓀ⣟ρ耜怱㗅樵࠯桠睧ţ峱ذ੸ᦨ㶰繞ᮢ┑̩砸ృ⠮娸ↄᨁճ᎟永㽀厡ャ氤⌨⨺瑌梇ღత䍯礴⠟斣姿ࠡ䶥ത癳ĉ矠梖ヴ绲̓ں൸ጸ≧ඁ⠼ध䬭㠎⒪ぴ⁾憂紻܆ඣ拸⎰宁Ǣ座笨ᑫ䒶桪從㺵䍺ӊื沨ニ⩁֣憧攩฿䱕塻᥅戒縑йᑿ悳嗟⢜匉瀡笭Ḷ<碀焓䇌䋗ԙ启漈㙐䖀㏣䇸ᄪ㠉㱜硳惚䆝䋲ٚࢍ揋䟏ᒁ᠜涥缨ਲ਼籌⡮㝱㸡䊕塪঴ᬻ䧰怱岝䁤㰭渱瑊Ҝ⃩懐⌺簟瓟晀⼨簱柽檙縗ಀ籌偹ù缑䍏箞ࣱ✐☦ߡ翣⊛ท簆≍桥ए縨崯ёઘᖕ堐漱ᯢ犤ⸯ帷僬濒僗缜⍇ԍ㓺殤⾯㸱奃ѥ℔⸂≛ঠጽ戈े篩ৈᣤ᤟ᙦ唩粺弆妋䕰ׁ僤ᄩ㶰䚮ຬ᠁佨屌ന呰㖳戫潲䇜烅滾痞倥Ғ᭢h翡换纘傮尳㜭摣䣏恮␀对஠Ȅ㵿ⁱ烂咥搐㗆挬ᒈ垞Ȫ⋴祉ટ栄㬰暀⣃१ྕⲥ䩆ᒓ∤刓煥犱哨᧱჈敀拃౧ࢫ┱㉄Ѡ⤒儥࡙¾惨惴㋈斬ӂऱ⤢樫ਗ਼㚶⣮函⋊䛅ࡐᖨ㠰晱ໂ⣀ڪᱧ橂㒈浈允ೢ䘭ࢷ捴㮐夁竃⻡⚨ⴾ橝摶࠾刚瓒䔍౺ᕿ墈穱凂⊠ከᴱ婛㒎ɍ儮⊻䬠঒᪺很緐咉疧圩昹屗傍⣴ᇳ෮䝝പᷔ〈䷱烃௡沧䴾牄ಗ杷凰ʧҝঔ᫤⃐䃤ӂყ纨㤼䙈౲綝Ც䀷ᇲ狪᳾௲ᑑ㘢ュҬ紲婒摯椗ᆘ揚᎚◦᦬⾒ᶱ睃殓甠䀢䮧ಘ梴ख慒焜࿉朔⢸币ኃ烥咮煦晃'ᢴ㈁⌹䚫སᲀൺ㫪も๧▪ՠ䪫䲈᝹⇾⎽ܙଚ 㲸糑ᦃಲ⺩欸噀咛䢰㢥灯䇫༪ኌ⼎⇱堣䬦㖨收㩘汮嵋㈚才䕛ୖẬ⫙㷱搭ས纫䀢穙ⲍ㞈㇗䊜䔡௖᪔⨈忑ㆃ┒⎯⌾ᑼ汷浮ㅁ䊐硖ฮỌ㑘楑㫃嫧䊫䜲癁ᱱ墧ᄻ壸ȋৄ➴㣠ᆑ▂䧤ᤑ✸቏䱼ᢱᆯ䐗⡅౎៌㪸厑㌃ಳ冩翅簾㹐筶㈎⋛䔗ම᥼㺀傑ᬂ⇧䲨朽穈ⲟ㤘㲣拃䐯௻斴䐞ׄڕ䯧ൂ礴㑍ᱤ碡㇋∿䊜ピ䖅඘州䰔敻祕ḁ幔撙潦㺁揅妹✪櫎䳋ڴမ⯣涡ȇ≃㩇挷熄㰩䖼ାᗜ㬘攑ⶃኢ㾭㼱❹粈Ҷ瓏㢚煠䣞ဤ⳨䀩Ḃ擧亡䂽璡䀴Өত標ᧀ䳡Ჴ⿟ᎁ㳣ࡆ㎮₳䅉䍖ӧ̆ᅥà䧄⥢㉢㗑簳䉤煕हᵦ䊈㲏⑌ቴ扰䳡ᵢ⅂℆䳣↤禭✴䉁ʝ㤒ᆅㅘ⚑૸ṂぼĄ熃≁χ‭窪ဣႩ搬ʄ╨瞱ᣂ㥤堌ăⰦ羫⬴ᅄ濁Ӊ煀䋴⟍惱ᗈ।烁㙕瘪䱫䢰ᰳ≵䔎撈烴┦猩Ⱗ媰噶劐⹄㎓㢽๰摰㔱熤挤⟠䱑ቂⶨ啤漲ᖢ籪帺䆲ኇ�䥁䶍懈䫢䛨ᒾ⎀牭呠䵰「䥂䊴T䧭䇳ɺ刞ᫌ㎘䆩ᙂ慄ᆫ㍃䥁栾Ⓠ爥ፒ⛤䬀ิ╄浩箁畅⭶㢴楌዗႐儼䄔䃈仩ᗲㅰཀ剝絇㑮༻硚岞䒰䨅ጸ⑗ࢩᑒ⟄棩厵൅悦璲᥏剪擮䦋ቲ❄ຌ׎壘惩ᶲᑉ癫⨤睥岑⒤ᆐዏ䚤䮹ᩂ⾱㕩⺤繙乨ᨢ湄䭃擳䤧Ꮔ㦇⌉ዲ†窀㢤᪺ṫ撾䁒�擂ᅣ≪Ը䨡ኂ㠄湩羲ဦ烲氳祘牭⒤⥈ϖ➥එᢜᶰ㪀弃╧ぃ䒸෵挾ᓁ熜Ꮃ䐨䰞ᙲ㒨䕩䆃ヅ噮抲╝ⱆ悱⨶ʩ│䡕໰䯵᪩⸠㫩Ǵ沰᥀䩣∾⦼ę❌䢼䮢㴰煑㬂睇䉨㲵楗䩬㊑⧭∯碪䬵၊㊪ၲ≲畄㉭洽睥੶ᒿग़厴㮢䱲ᓔ㤈丑朽瓆൪䒼㕐揁焍⦍᎕❨䱹ቒヸ偉坳䃦断䂴扙⒌卂ᛇ∭⟌䬕ᜒ㕴柉㼽㋦ㅮ昋潰䈠灕ⁿ㓢䤲䡁ԗṔ欩卲⥧䵪䊻╗㲇᱄槑吖⑆䧑ᗲ㗤犉㣲〠፪䚰怰⮹ဪ愯⋋׈䫍ᩨ᳊㪉㰳䎧禮暴䅚橴⁦楕卶➥਍឵᮴坩痙䩣ᕬ⚼ᵔ≈璭⦔ዻ⓪䵲Ꮊ⯔䤉㍠揅୫Ⲵ嵂⠸瓈榪吝桲š๚ⶄ眉绌範絮唱㕐ʝ壀榧匸䌾䱟䛊⥴瘉棼凅繬笿嵙劜ᒷ楇十⛻ཝᠺ㠴璑⑳Ⳇ椳纲絉穩擶䨉ᐄ㫈䮥ᄈ᥀巉ˌፙ圭༽᥆犌攙榽卣䢜伣Ỳ⿔究ᡒ墇ᵪ䚶ㅞ扥䔗⥰㋷◸䡱ቦ㯴擉෣勄㖩纻㹃٤瓆峤㉃⚦䢕᳦㥎⬹䎃₅兮剥㱋ተ哖⧰㍲⠑䦠Ѳ❤溡⩲㍄業䪹⥝Ŀ瓑᧎哣⛂䴳ἂ㏕㣡㿳◄୭ަ⍍空ᔍᧉ劇⛣࿃ᴪ⌔嚹糲䚆坯榺䥐暙㓯㡱厦➇ೄಚ⽬炉⏲䬘孪䪻⹔晧㓂ॽ劼撙俿懦ⶄ恹߲ദワ撻啅࿛碼㢱㌀摘ཅᕼ㊴爹晃㊅僯禴捕⚌ೇ⨉䃬ء䨭ᯒ㼬幹ᝳ撄壬冲嵍晱ಪ姳卟⚆伝ᚆ㠔朹猲⯆潮㖺捚㩴㒲榶㏫➃ਲ਼ᐦ㣔侩㭒䰋೫冾乑嚃ೄ䦣㋂✭䫆ἒ㪌籩姓▄浯䒻⭍暋䓺奔㏾䖭仾᠆㣤噹ᗓⶇ曨㊳煓噰瓵ᦙ኶撚䣛ጺ╔潹凒㺇䛫涳Հ皎೻ᥝ㉦杹䮛ᦖ␌翄珓އ癯᲻ⵛ沝㒥姯ዞ⑝伾᱂⹬嵉埓⹆ǭ㲶籃⸱ᒤ㨘䇞◈䰫᪮㄄罹⃳ᤄ幫⎹ݟ粍撬娛㋆暥䩹ᖮ⤼䈤ಒᔇ燨眿筚᪘⳷榬牼暙䲳ᗰ㬄婹ᕃ㺺㋫Ꮈ㭉乷泷६狚攭䤛ᴄ␼歡㳲瞅粔Ꮍ╛乼玓ᦀ玦朥乥ᕎⳔ䳙幒佄㥭ኼ杈嚑ᓼ⧬厅擩侷်㊌慹こ笆㥩㊷᣼湾೫㥚獕攝亷Ṏ㋣⠡୓伅෩↾䭇争᳻㨏㉝斝䰙᳎㦌瞉㙓碢筮嶿浌ṳ㒪煩㌢☈䵉᲎㿴稖⛒歅⭬⬳ཇښ㴕䪹猼敌䴥ᘌ㗼桙犒⍄௬箵杙Ẁ䞖付琓映థᛶⓜ硱㌓҄⣬⢶⽒ẚ䓶ᨍ狖朓ધᱮ⟼䯹㺓Ḅ⫮瞼㭖⊙Ⳗ禕犜ਖ਼䳩⦂㞰惉哣唅٭侵兜广哢ᙉ狭撃䥿ᤂ╴䡹烃ㅈ㝭⾲潂㹩೚㧠犫晫例ᅶ㊼嬙旂ᎅ⵭㶽⭑⊍糏姯狯摣䤷ᔲ㖜䞙圲䀄篮ҵ睄溆糧祣猟朏䧣ḡ㺜曉䵒嵆抔枱潞Ť㲠ײ㊠ᙷ䡉涽䡔別狈搅∦恾䝄♾Ⓙ禎㌞⠟䬓᭦㈌滹ᢒெ廭ၱÐẜᔃ礬猢朰⩙႞⦄夥皒♦㧯⾵⫣Ƃ笺祃ᐟ最⦀儡㍼柩䟌成㯫殿奒ⅾ䘩䧼抰晇䭠凞⫝̸幆㾒ሶᘖ宱崣ⅾ⓹պ੣柟亯ᄾ⫌殙⩒榠၉⁺䭗䅥ܶ湹綌⚿乐厡╬礙⹒㠄班皵嵔⩲唖禎㌯➗佀巖㊢瑙ናІ⽮硴ݴ㹫䊧㘱௱⒀૵ᡡ⅄滙硲抅濫Ằ罚庂䴗क़㌞⛄⬐噊㘜徥墫々ⱎ⡱⽕↟ʽ纗务梴ⷠ墚㜜堙碳⒅塎䚾畔内礒䖜௾㪀⥧ᵦ㜢籙䣲അ⭨ᨪ䕺硻䴁䖐Ŧᛧ䥤᝗䪄奥ᬫ婛景䪶佊ဨ拧硴犽恖䵸契㶂䢙圲ই᧯汻䭚䑂ⲹ䔥̆ᒔ⡸墻乴濤䝲ႄ乌䁴㕘煡䁒㻬੉撘⼪䜆㌼䟥榫⮦晉▿ᣞ纓泥㦭犼ᒌⱅḺ⍜枥ړㅛ昴刬〸ȧ䔁丰䫶⛢⵬༩ㄲ婥ⳳ吷僪ྶ䓌ξ䡬╿㐑ᔎd勞䑜廙咫刴ⷪ剾棇䅰ኼ◜玔ᕄ⢀垎⽂䍙㾳稶耆剶䕋䥴䋚◞刹ᚤ⤤历⽢睰̫Ⲷ剫牵敁ᆖⳂؔ੨ᑻ䴀僁╸嗩䅫椷ō➳㍙႐䌈䖚犸ᛪ⼪ᬳ䨲查ᚫ䚴繊扰歓⥶糘ր䪐枺⣐崩ヲ咮凳Դ婏⺼ٜ纅匆愬㍠ᔦ䤔帮⠼丹êഴ㥈宼᭗♫⋝㤱䯝ᐰ仔堉㉌䲅䥫䤤捏摴啄楥紏晚ொᗺ⯋ᒔ㬲烅⵪ㄴੈ婵筞入勰ᤤ䫩ា丐唹㴲慅ᘔ焵䅪灱㣞䥦勦◞犒╶Ɽ哹‬䷙⻫⒴筎㞰杈⹡倳粧જ▦̼彁⹜擩k᜵Ոྲᓑ五猍֑㋡敮⹫䍉㘢桹娓㖴燮澲熷妌㊦থ䪍ᜎ⩜唱㾜幪䯪吅禆㩹擋楯ዉ╯䨥ᚾ䡌哙⣒搅࢓ኵ䕌羶೎湵泥■⮞撾⾍ᇹⱂ抅偋䦵ᷯ⮷筙楠㌝斫獖ᚑ䴽ေ◒紅㛪ᾴᗪᙸ䋎禐㋩槫厧ᑞ⣗ᗈᴲ〵➲摶繈↿磉Ⅲ猖文䨳ᒩ乨ᕥ❂椵ⰰ⠅屌⢰᝔憃䊡㦏䫟┚⣨廁⇢圵ଳ籶灊᡼ᝀ֊⓶ᗯ䬒◩⠲彶⡪粅䲫शᓍ恷祕䕬糃斐䨻ᕂ⾯抩ℜ洙㵋喵䃋亹糜禑䫽ᘕ䫬喝䱟᜚㯒祅焫ぴ୩㮵䳝㥼勻娊爪竮Ɒ吲㔢来嬫沘砪䅰ཁ庖勷ᘑ剂枦䵒呩Ⰲ勩㣋撵獉嬲勂֒狠奩⪨⠵䧇ቒ⭊䕅硲殅歋⊹子ᆏ㳂㧈㍌啑⧛᧖㍪慵櫠孄᧯ᙽ䝙ձ䬂昉䯈斵Ⱐ吵ㆂ緩宪ેੋ瑽ࣙ啡˴▁ᑤቀ⼺囡ᳪ澹瓊䖶抑䀡᫂ᕾˉ嗃㖑曯䨂勱⇪偹᧊侅曊女㳃㩤䬈䗻⯄坚⪓ᳮ⌊䩵稳恶ᣋ⥸潇٥櫧㨖猭柩⦚徰䯊恵⮫И桊ྷ祛⺋欅嘟⪹⑿兂埦㷤䱹ף滩㉋確㣏熙括ᘊ䯐嚻今婉⅄繹绫व䓭㱾㫉㊗ᜤ啃Ꮩ㥉⿬喉㾊橕睒䓴䑋捾䔤ṥ罶㨎⪉ܻ䍱᝭㞔孙ᕫǤˎ塸峇ա檶㕗厐ᘓⲝጩげ扙暓䚶彌絵曁䕵⬛啦䩥吳乄彍㺼珅䏳祴㯭⭻㋈䦑᫴喑䫩囫⾊吮䵺狵ඊ乶ቪں煍⶚沿०歅嘢⺶叭㲺䗕䶋䥷ᛊ㭺㛐憁ભ榶毽᚛Ⲓ塙◺淕穋䣴䁏歰ೈ涄䫿㘋ɑ᝙⦲岰⥬牥㙫檆益偷㫄▓૜䨑檀呄䣳ᨹ剌䚅Ԋ佇珎嵻ᵖ㖊㪾䘉殓ᔣ⣗᾽◪耉̊㦆⎮ᝲ㍏㕹㪡ؑ㈭Ȗ⻬兽␬僥⪐⬰癀瞵ⵄ焳㪽奁અ嗇⥸屝㦊儕缋欲⭪⭹䳑䵴屍䕅ଣ喁ⵆ嫽⫂坩甓⾶灉潿糌ඊ┏㔧䬲ᓻ⣢坥㶚婵下瘶俎㭽䫓൭洜啱卶䂗䦞巍✊䖵ދ竵忍恺娪᪌❕䖈å垌⪸岽Ⲛ堕ਊ狶�帼嫀ͮ拀෕欀昩䶊届㯚珥॓泶瑩ᒴໃ㶘笒畾⪰㗑⯗ᡣ㨊冕੊稶䭏㽲⻅嵾ۖ疩ફ啷⸄兹♪䔭ᛋㆅ᧏價櫜綇᫛㗡櫴᠀武囱⻊匭斊㮵⏮ὲ䇘♪拓疸᫄敫Ⰱ奱✚璭㰊娅⏏楰⫎湱⪳畾⭪垐桯Ꭳ⬚洭⸊㩔᫈䪼ᇉ特洇╧ఎᕶ嘟ᔑ⛦䘭㽋⪴Ⅾ⥻囚綈⫐㦤ᬥ柸澉ᎽⰢ句䜊囶浨睶ǟ幤ڡ෱剟⛛⠩徙ⱦ对㤊ჷ毈杸䧄㶐⋐䵈氕噲⥩壣⨄癕ഺ但㛎棹ે㖊⛞禵⯢㗰欒岕㬒廙㏊煕繬ᓹᇀ㙭洞ᖋ檱圀棉岃ⴺ畭喓व檍杸䣀煻櫁䵴ᮻ哇⩑哃ⴺ䣭猻䖄ṍ坼棈厜⛶෴⯷㩁䨁傃ⷦ䓭༺幵ҋ橽⻐ㅵ䚿৲䫷楣⦡䊮㱲睅冻⏷劉ݹǕ入朞☝મ㑜滼偓✌尹̋㍗惭⳻⋝㎅竭䶽ᭆ㞝䪫᳃䚆䡍匼ࡵ䱋⣷㋗䕸䬈⵺櫺㟞⤉决⼆冥焋儵冉⣳勒኷挜䫅ᩊ垛䰥巓㫪摪旊๵癉碷ወ᎜ⓥᖨ嬤吢楥儳㗤䚵梫䳔㣈㎱瓙亇᜜ⶒ珰បⳉ嬁⠚䙍律祗ሪⅾ懙㵥㬔ᗒᩙ柔汑呫㭓⑹⯫㵕㳎ᅷ৒亅Ⲷ䔺宔㓪漀坋↶淭ࢻ嫖䲋澲嗓楷擭楃䪜➪浙嗽┌呩楺乔㧏棿秔祶曥ⶀ玵㔅ⴕ徥䀚徕喨㲱䵏竰Ị獺✒䶬娥㓍⪾偍㡖崕๻ᇶ᪈䫵煕֒瓶䶚ᯐ㛚淚弋㳳⢵凲㵗㶋ᖿ䐵ᮝ᪰禁㐉呛㇆凾Ⳗ歕㓼䓵榍㣶痁⭮㜐樁㉋㞒䒚哒㗖潎憊୕᪊恶པ᎘㛣ⶱ娽អⵡ噕➬澕䓻㛖㳊䞶䷗⮋㌝ⶭ婃㖔洯Ά√崍ዻ壗䶊ٵⷖ㺊笔涊䪱㟪楽含㮊浥Ꮛ篕㵍坹峜㦓猄䇗媇ᖼ⫬᢭㤖䇍縻ᇖ檍⹴⇀厗眙痝媳㝃仾偛➶劙ફ糖垎枾捌殈㳩淮䩕㓺母ᖞⶄ䈽籋ₔ告瑷ヘ䭢笃敿㍰琢亿ᓵ≂獙淳ϖ঍ỽ䏔䝹㌂ᶭ௓呮⪩ᦽ㑖奭牛䏖垍㢸揉獣ໄ痯⬿㒼橣崭⿆砍瑚㵷⹏䦻䵐❶狕攼᩺㘞櫕唲Ⲧ䭥ƫື᭬Ỳ燄䵩盶ᵠ媴瞧亐嶙㭮溙昫㐅㒋相㳃㩮囇⵸᪯㟲湽姇㬮盵嫋៕ཌ壿⧂湤䛠ᵫ狜哨棓坃㞦牍孚Ỗ㴉⣵仉統໑⧌ଶ㘾乴帇㙶對᭚ῖ垌䗿⃘涌⊣░᯿斒歐噧㠢籽⁻榕忬旿ố㖔櫡痋⫒瘒櫣倷⩜兽᳂ẕ⬏ࡧᏞቾ⛛ർ㮁喵漣具㧖緍䛛奖㤎痺毊ᩳ唄喎㌦砘䠡␇⎆屽䔻墔䜉憳ᯓ⅔㽘1ij⫐揎⣌䵐ዽོ⮗Ԏ絵ࡗ畴瀥崻㨬ƍ榩䛗ㆎ狽࿩㦣䥲␤箫㝭ᄣ₌ေ獽格ಗ㻖窽矺厖❷巵㯆睪橫嶯㪞瞪ₛ圠਎稠唠痩缎ϴ箬ྖ漎㔴㭞瑣椧崯♆ɝ⢚ផȉϾߝཧ୷嵚歆瑡涕昗䀎枱撚外桠瑎㪰⯜㤣ᖑ⏙׆癓株䦮䅍泚ᾗ崵叹⟚塝竆硢䌉畳歁Ⅿ⚗ൂ㚚㏚ᨍ狾毄ᖄ畁㵥䈬䩫氇叨⦝㢬粅傳祓㏴琭䅂廘㕔⨱呿⩽喻⧖䋒છ⬕⤩ሤ埘͗Ἑ㶊笵͢❇坏ℐ㾰ڋṆ噣㏻㟍䶔⻝ⷑ㮕痣涇嚏㧾䫙䁒伖⽂୳晻潡䬥ᛡ簄壣濖娏㽾䷝ᄚ䬨⨉⼯ዺ潺㞁媈㲺㗓楯帜㕮姉㟚礔㬎䟼俉囇ご婦Ⳮ璇沖♒඾䕘ᖳ䬕上埱ᕇཧ竲痹尓瘦଱䪋⿾涝㜛㌕厕⟾珌ሻỌḫ孿㝹椗怇⯾䕝挛匕丈刄࿂侍ֈ皔峹矯歅ᴛ㾤盝瞛῵␋䱆㟙㽿੅綱䁦硷溿婓˛᪝搚⋱嬌懾ៜ㽼廵刷笃盿楟巿㖂穩ؒ縗ֳ᯴畞彶㺬楙筧甅沿⛯Ⱎ箝㦬䀮怉䁵愺塋ဥ嶬඗⚽泟尵⦤姦㠦〮❁⁐㧚᭚Ƕ恫瑷根◂፛㵢ᘣ㣠㠮ԡ㕠䂗啭挂⡰۶眰ὁ੠扤怹樧刚栽恖₂ℱȅ⁏穯棲ኀ㍔�ʾ⟻烴徏⿲ΐ㽸纵м࠘ฉ獦䥀殡桕䰧倭砽ሆ繀䃰汾ϸܧ盛汽凟⧞廝⻱樯࠼俵塀愇ƹ紪ڈຐᬸ䩨᧍㕝槔☬ے塓⭴㞍䬸巂ޔඏ湦䭀燡䶣¸帬噆塚簾漯ყ碳斢ව儷嘧⬞刣㋐ᆡ䈼珵⬶ქ橤䦿咆᭙匚䋸໐倝囲捗䂈硙õᄜ䶔䌫ತ児ć廀⺷Π㊧娥㈾禼揙侞ứ窵ټଳ瞺⓰楪સ⚦様硩㘫ゟ⻇⇆ໍ⦼༹໰㜀暦庣㿑累㨿ᦍ璲ㄌ碖桅݀Έ〈⍂⠆㽣ͳ搮䔍䎳栱ヺ㞕䍧ࣶೌᶗՂḹ㎺控粤∸懸䂉ㅠ᭓䐑١嫼ᲯଜⰍ↙ཋ㒁㾫,碃ワ櫼☏ݞ഼☘㘸ᙆ将ӂቨቇ导䓅㪨ᇨ惤稻睰漹幐焸羑桧㼕晒攺Ҍ依ᢧᅺ䄚敔櫪ᶨ氁滽屪碭曯䵌⒟Ი⣦G戂╕枮ᥨ檾ᑠᩦሔᒈ㑖䣡ᑽሊ⏩㣃䟒ᢄ㧨紸成ᚃ綅㊯牐⒈ࢄ況⎼䞓䜪ὦᔏ䥾䦑ӂ㊬㘉糵埏獮廑̠ݹ౳࿑↭㏃㳃ⵧ播∠❫嚾ᲁ冱⍃⋥౅॔㮼⓱瓃⸠㢯怌䉑♖椉决分䜽ຐńや圸參璃⠣掭穔撏枚処爎␝໗ब㢟㠱箱ᑰ罧祒攽ಂ_壁終ػ㠟榇噶๑己⤃熭ĸ㬰牔औ>䦉嶰㟺ṝ┨烜㏄Ṡ䖯ᴼ媾槭࣡纪挸Ś寯࿌㡸槑穑癧㒬ᠢ剝ⲗ榍㇖⍽䛉熒ᠼㄠ睑䕃⑱㵳砳䩞牌Œ倩揿᪌嬬ḿ劸浱媃⻰奤朽㈬犦坹⤉搃䛗ညữ歫偱䡃検؊愹摓㧈ᤚㆳ捫戇䚾ῴ㯿㕡烤䋃ᨕጹ⩓傌ヾ⇕儮⊬ม䫪 牑䎱Ϡओ㻄Ⴆᐮ,椘燠⠑Ċ΀䩈ȩ坱秦䙤㞓㯺ᢞࣷ燌爉屠仡ἢ㤤牱䥀汆息悼䅞沏㤗⠣⍚䃸㕞ᷪᛨ沩惀੆ⶠ嚈⹒䊄ㄒ爗Ђ۷໱ᶼ㗘憩琽㿦屮㜿ᅐ伴⎀਌焢䄷呛榍䂴⌞భ珧坕ފ幙抝摬䧑淅䞴侩ῴ㶴孢ἣ⡆瘰璸ّ发ⓣ㘤兺⚢僩⌬㐤潩策䱧慥⤥❥ᒾᱽ䧧⁣ٸ䵎ᰟ勘斱炃寃癭渺ㅮ㩇攞冽䐘厑౅ਪ㋟⡡嬝矦桮爸煜㊜ᤉ晉ᶞ⠂䱽⁜㋸狑粑糦ථ糍⿱╙ᤛ䨖፦✱ฆ᭪㓏䗈剃狧֮䮍侷晾拑䁫嗵⚸ᮒ䏊や縎枳ֲ឴㝩啔檑畣⨚۽➈疥ῃ弲ら䭳崛堗媼ᶲ᪚፴ⓡ叻宩␪ᥓ峞⤒烃凇⦭媾Ⱳ○੤凒ⷓ狅໧⯩ᷨ熱䔵撣ݯ㚻䥖ළ䞁⧊䤵歮何揹垎㜉棍Պ皯⢽嗴姎வᤓ厕ߪ瞭᣺㼔缱嚕籦ͬುᔸ媋垃稰㍝䞤啒樑ᮽഇ⽽ࢇ᭢椊⃸ᗱ唓楁吀婍⫃ᰊ㺬疉䞳㴚罯ⲍ磽䚖唃挀䴮ᩩ倕᱓寅⧱弍᪇溭↽⥷㧛㕠爯⍐㩹侚ᢋ圂㜑獽滚㳬⸹৽碉䥱ᓣ掄朙䰲ʚ㥬眹燳㲲嵮熸୓寔⤙᫝㦒枺䴄湨ᫌ特䭩䤭悮೏໼⧛ⴀ⺌匱➒䵥ᮂ㨘癉兘䣓ۮ秷᣼䡆洓⌷Ḁ檙侰漆ㅌ漹䅳嗧絴滭୛糍泵ᶝ匩䏘侕ɩ吼灩剱⿆䴔纾䑗窏⹦燙损婮䷱᭺呪㖹䙓㔆Ửⶺ嵐卌๦㨉向ዳ佃ẘ啌秉畍䲆◮ᦻ歷㧈䴎咪現ᯩ俔䣎㝔槿ɜ䌑㤹㛉᥷ȵ崕ゃ㎺箤රῪ㖼毹嗓◆廵㮺口溇唎䬑玍暂哽䤺㬌檉撓冚儯⸹ཟẇ峳↛叉ᎆ丧᡾㱵⨄匓᪦ᐷ㺻௳ປ洑⛉厖朒✏ᱞ垲㨩栳㡆࡮⚭㭐纇ԑ৤Ꮅ柼㙵渥圜梩琓淦海终ᅓʟ糩শദ䚀ĺᮚ妈慹汝䮇坬滭䃖ך椕᦭槞枑㔾⸖㜢牞䈫ᴆᵬ࿯幟㋖㺈姤ഡ⠏㛴佁㎢禱䅓ఇ潭Ჸ㥕仁䋹嫟楹⬋仛ᮁ㧌獙稳㰷抖Ή彷⺇፾⓮ஈ朊仱椌㯬灐焃〇世হ碱ᆟ᳴䘎揯⩶仟᭚㲜桂樓嘆絷垻⍲媈⌜榯㕻䅧⒀娖岂禔瘫昇ᄭ⸹棘䆐⭥䗂௫⨣ᚰ孡㴴㼎幀傆▯᪌浙⟗ᠧ䖹ନ䜌⸽⮑㠂炑焫⏫➒㸬๜立䌋姎௴ᜣ༯ᨩ㠒㹅塍䶇佴ᶽ歗੏源䗼䥚昢ⲁᰁ㚭㍅倍岶㕇牽凲⦒⋵▤䮦⚲ 屛፲愹䥫嬋♎ᚊ擿暊挅憪΂㫛⒔徖㻌祆渃婛ᚭ䮽䃕榐ⴁሁ㎀现⻒樑᪢焚緓媆㋯昈㍝憆ᔖ㧂䰏✓使ᵹ㼥⧹囙့࿮炼网↋Ԉׇ玘➊⻕᷁㯂縉怓䮷❎ٿ᳜㦃糠棺ᴠ曫䰣ộ㙔紙巫智泬஌ᶴڕ拲紨繂ᄴ犀嬖帪桗ū帶Ƅ䳉䋑䷪㴔ᖯ㸰噧ྻ⾱㱘枱䋳⼷ᣍ≬㵞妒礝◍䯎ጩ⹈岚㴕㍉敳㟋哏劺ዐ劄䫿▴䕅♱෺武坪灞䇫χ前廈⣑ᦑ⳹刅㐐刴ⶢ椌㭽≥䫫繶ᩏ䫉⽓㆒䄒▫㧂埗䲽ằ㭧㙅抽ἳ煌տ䃙妋媋䓴䮓ᛂ⟄対㤬洅屓熲娭岽揶媖猂嗛㤶圳䳿Ღ㭽⧰Հఱ⇭嵸竐斒瓳ᗺ׎㯋Κ庙㘊恙帓䲇縣塸ὕ秂ᬖ喹⯽⬥Ⳛḵ㚪┹懋᪻濇傊㝘ຓ䫶☉嫬䯓ⷢ寵䀊液歋❶慈䭼⃱䶃⬛▫㥉坤ⰶ尕㠕⛕斋㫶䱏᭹捖ᆋ䳨㘔玡囯෦嬚寊懕繋̆㷍䖿䯾疔ᬗᗤ㎾᝾䳁⾾㚊栅淋忆瑍繬㫗皑欓櫢⯎柩ⴊ巡㡺燕婉牶拏ㅹ剑嶙ᴇ曐猩暝⿴ᯕヲ砶粓緦绯潹ݞᆌ笄䗇欱望⿨汩㻔溥奋埶ᓍ佽凰禄狫秭⭱Ꭰ淜婢〲⺒平᭷磭᝿糓煂۠ױ毨㟠⹌嬙夺竕焭指㇍弹㫺咓泯痛䮚猀昨巹㙦擵䘻䌶杏瑹滓ↁܝ嗍㧻➖⸍ᬭㆼ接浓׷炍繺㇜ᆋ䛸ᛢ獼杴ⶡ復ᝦ琕澽㪷䒍ɼ㊷㪏❲෾⍼枸ⲃṳ㖚穙嬓ᥖ䛅⡸⍜厙疇旈欿⠋⽩川㗅〵䜍恺⃍䍽⧚皕✗ෂ᭗囖⽞仳㷜犥玳粻粏䝿ổ涍⛹禭ᭆ㠁➙塑㗺稊攻ᛶ㚎烹㛗㎈㴑䷧ᰉ嚌㞱妓㹼檭屭癚◎⑿曓玛⋢嗻毉㙊俲山㾺狅䂫⫶惮᩾ᗙஞ䜗疧ᰚ埍垵徍㩚摥絻嬋⍌྾␾ᦂ⛤滥毜㠜添䶹㚺矍含࿵䗬婮㧌ᮗቱ上字㘂沭墛ⵖ粍砚䀭敋炡䑽ᶟ䝸㝈ٿ䅺⭍始䇶獖伻㽖೸㛺淔氥㜛ൃ孫㙮涁斦⍚孹ɼ᧴册硻滐玾盫⹛尓嗯焗ᰟ⧐䌞㚤‭䪬ࣸ繘箁嫯淖⪠ᘭઝ媂✠峕㽆䐤᷈⛼㇔ቪ།䛢౨眜㒤䙍朤఍绬璖絭绿睐ޚᔑᖸ寚ၑ漻匧㢂ܽ晛╔癮䖪冃➙䱮綛ᬨ眮浓ள㗐㻭ⓑ嵃瑭ㇻ潥⮱絈ᶆᐓ㐸澕寘伛᾽搒䁒紌掱Ỉ⥿Ш⍥櫧㞛䵊᷏⎒禽綬֖ឍ奺喣ភ恳ぅ勚皓》冝ℍ佽佦憖ޏί梢㞋⼊婋㮒砏憎㜪ጜㆩ磜䞖گᵀ岳兜漍䖧灶秽泛峔䜎秽䢳㙀漍ᴥ条™ⓤᇣ࢞矣澩抂㲤桽啻㖖暱䏿཯ྏ䕌㸔箱癑剬Ⲵ䶾惰࿬㗠徣珸䟘⾌漒㶱㭸ƫ溷壯㒑۝岛ᴗ⸁珸ೂ䱋拭㷶箬矂湭婵ɾ珝綛᜗呐哠!∙䩞琂㢼ⷸ劓文༥洼㼗剱篫ऻĜ悔ೞ祜㼮ằ਎㈆怯䤶佑ᑵ策皦怿嵘䋨ᇐ⧻絃⠎殌ⷡ䦣㻦⁴᳽䒗沄Ͽ㠁匝稛㡹」⻺竏䐵㱁帝⧿皵溠ן㣰஝烼䠗☣῿羕̴В㢩㨀ǵ炀ᾨର㰧/䐦㟼商Ď$Ϯ㡨๰ὠ㮠緎嵿Ҁ琠⼭៉䩅㸱ᤇ汀߶⁐Ἇ妨ㅡ淕धⳅ孩幰㏂意ᦱ䪊ࠗ皦䪀㻠瀱ᶣ澳扐⭪癲८疞絑Ѩᤵۤᴰ䁕བண䠧哀琽㭧悮ᄖ∞戉ߪ䆄ᴩ⇩ૐ杣壌昔殢ކ⨭䃡㕄拓෍ڔỿ⏵᪺䈨លₗ䔍翆㨧忉懺᱀瓌⣢䧘㽀䶧垣啤伮㷺༫碑㯒㼘ἀ䜳瘰煁慣䯌චἰੀⰈཱྀ䀯楤簼䥧〲入⬤㪩侨᎖⿽璮创朢怇䤙Ḽ⏧Ⴉ࿋䣄㴩ై佃涢ʯ楪⩝撐㺭䁔Ȝ䠕༺Ḵ㾠౱檐ቧॄ政①咜椆ࢬℙ悥ࡺ᳴㰈穖厒䐠ᮼ瓛䙜䌱䦣⡔␑恑߱⎜灠ⓑ敬ᜀོ㽓噚⅗ᤏ䑝ု⒂峰半炐䨠ᾳ১癈斁乚リ-ื⅓ㄺ䶎᱇峄�渠ᆧ䓭栿瞃Щభ㰻搷u࠾Ề栘絪த㽆恮ᕱᑔ嬬氩ሃ䢅�䥁䋙̍਩榦ᜨ䂼椶怪Ԉ敘ᐍҩ爅͢㶤矤ḳ忸瑮米फ़加$䐓ʳ犘ⱯႾ煙䀣ԙ楄ᠥ呴保ၲ㻅 g獇ᐊ❘硁ᴂ㦠ީ熳弰׉岿㵄犟㼭廬痻㰹䎟≻抷嗐㳂Ӈ⪘挵榔ᑬ唉䓼吕➹眯䃘Ū涁痿ඪ玮喛䧿匍㩋ᇅ㞛㄃⁷決㻔Ƕᾂ෇⭮༰ᵙ晟㷪≙㷛嵵笨₊㬍ଉ毳濽櫕؎ˡ䪣⑨ᐥ⩗⮺ĀЏĜ抜ᙣ刬ὀ曃暵礭┸ᙟⴚᡦ⧣Ṧ㮖ဴई˴⹑獪ღ劢⌧猱㏨䱽偫ᾚ≌繄䂹φ楉㘥䅙㇏䐹歓剦匢ᥲ千፦䭹机翂ਇ灬Ფ皔⾇姸䒞柩烱ጯΠೀ 䉸╀඼ఢ㚜㟏唋㏕悥熛ṙތ瓣ও䊃⇮࣪ˢԢഔ᧱䪗㢖慷 ▬秞捓咇厃妼㌠⵨ဴ᧳ٻ柶值ጨܳͨ娓糸ᠠ岑䀠云Ⅎ卖䈮汘冐ᅮ㼫䅨ɓ䘇㯙➼勃㺔㢭稔吡ᡏ伉㭞㱳�穸䚰揮㔰⃞�紜㵗玷Ჟ亇ᵾ䉓䈥獓璇⯯ⶾმ煮⌚䨠RᔷᾸ㑿曤ឥ搣䈰௓޵䆝 ݰ歏డ㕝௃䔔⿈己㢂焠ফ䄷稠㥁┠熕挕娍௞ᝊ〠ę擙糠匈◨䮶᠂⽄峓䙖఑比㊷⎩䩿⥤⦟擰日⩦៬⽗滑㢲猠Ꭻ暷䉯䓃೚ヨ匀昜ఞ妒⺰怈捋ଅ澪➷䳐ʂ盧疱䬷旽厵墡⺮ဥ㻫Džᢻ㙚䣏▽᪶䖕㊲ᘕᐺÌ�ॅ㨪砖ᕋ凤哏≐ᅊ兖守㚮⮤篃仳θ➂狸୰чめ徨૙⣭⬂IJɶ䙀Ⴣ渋ᣐᤡNj柛㌘䕽܂⺪⬛甥⯑灵ॺ峖Ҋ窣ႋ䜌ᄖ憢㫞㯩ᬄ㧡⮲垅⼚岎ƨ㵕炦⓷൉婱榖㧦䬖ະ⊙劻⿥ၪʐ翩䐼᧼⷏ˋ⎱ᶑ咼痫䏠瑅悺工࡯র瑮᥸ߏ⩮အ㶑䚥䡞㷨⮔嵳冝㳕㯆᳖ᓌ囁ᯢ㫝㲘崓瘅䆕朰潟澸䋤Dz亁䠫Ᾰ烿ᵅ㕨䜌⭓⡳Ⱕ⁡尵㬦琥懙⒀ҙᛠ䈠梑ᄈ琮㬧‷禇ᆖ䙦炭恾㟄᪏⣽分劥䐲汎㊋॔䑹归仑ႋ̻椌Ⲏᒢ䇜䖗䜞⠡ᯨ࠴䆩彆䳰珄᲻䭀䪎᳑〤玖朜懡䥥㜺⃘梫暅Ꭺ㤘᷷槕 㗝㑠供෸珼㞻皅㋜㽕䳠Ϩ⫁䋩燨ڧ義圈簡寬笮滈䏛ઐ◴咣撳グ䶠概ᥤ㜍ᠩ寛篹恅㌃㸽䀻Ზࡴ丁狼戰箟⪶᷹䍩掔尲႞媚睑љ叇畡愰ᓕᶞ䢯㾖尷䖳⡕ᰂǺ亹竐⠷⳯ㆾ癡ਣᴎ㧫㏍᝜�䁬㮠ීᑰૐ兎Ტ䔠!Ⴀ¯ᵠᭀ⇄ୱ⁂ᵠ㿸帉橀匘䇙猔ᰟむኛ糸珮ᗼ璢垝♧㒍㮥栕濌䂒܌˽淛倷༏巾篟瞚现㷤篢睶䲇嶯㼸ᾨᯐ⟗椗㒩⿜㝶ഌ帑௫枵濾⍏㲌灸滛喗丏䷼ጹ澙徏㷯㰆瞧潑猿㡐ඝ缣䐯堯埿啄₞ȏ沚剧睤⻠峦㱾眝曛栗㘏忽ᯞ澗䤨Ḁޣ眦䂯峅⊠䌣爧䈯紎͑䊷޾ᖮ㷳箴࿄⿷彮㠢筙猧煰氾寽翛愜Ā䐐߂࿀Ṩ㳰縆ྀ䡧瑁爎㮣᪥䄐忴⏣d࿅澰㱏㫖ຣ斧欗瘿潀翝愞漁ᤞ篞༣漤㱨粀ࢣ撶ಯᥩ〽爳燱᝝沴砳ഁ➥ϯ㥂笝洰㖗ᔾ汞礠焛缕帗ޭ矺Ạ㸗䀁籗ధ禯簮䅝技別䐱䀿⪞⛪䇢㵌㉢㵡泌㑯ࢾ⚾ኝ䔘᜴⠮刴侱Ḹ߄稊䘳楇岧丝ϼ犜攒㔌ᦦ⟜俉Ὁ၏瀋ᨸ玣慯ᓉ↬嬀䙒ᐿ棩㣺佗砊䀃ⓠ⡗咱濃㲩睘㕒㻠⨒ႀ篁倖Ҧ㱎冦䝔㙑挊榾ᕳ抛⹛ᨁ㑴棅俎慛䓸劼㞸烳嵯ᆿ瑐䄼᪖⪋㐈浿✦䅇幠Ϙ爉恓尠㎿仧暜甐㪫䨵枻侗ྱ畜笿ຓ穧ț枾㫿痲紞稖珮柜丫⤞㽯䄙焭ጝ矯朸♐䍂権؁槔᠍ₐ弎㼌翦䞰䘷剏峸ࣞ憟紖眜戠偘⽜ܰ焂硯ビ杩ُ秅磟ঝᱬ甛ᕈ傛烶仇᝺ׅ罫綝緯筯೟䚦㌜׭檭ឲࠔ怏情DŸର㧯仠ⲑ⟝⛉␽䳐埱。徦㴢祪䕋桷朠ᅾ↱䖛ᝌ眚⯪培⼺帥㶊缷䡋枍妜剿䓁ᖛפ憬民礓ࢶ怂╱圚䠎ᾳාߘ敼ᶞ⌐嘟ള埛⾄⭸⑺籕箊◷䎹ඎ嫟ᶛ䇋⅑毿埻⼹ۣ㷚継惕᏷咏὿獫掝ܘบ毤㠀㨦b⍕價竉絗椔⳿嶡抛㌟㜘ᰞ㠃ù幭ᵚ筍煻敬Ꮟ਱⮎ⲝṧ⸊_毮⡆庍捖礠㇚Ꮧ涏瓾盜ඞܟ渕䯪ឧ俩录㽊礭篻硗瓄䢊祽⫢㬓ḞⰌ㟥〉強㹺╽瘘௓在❿占ᮜ德座㯬ぶ濢䇻㼛彭篛粗爌㼊α➘会ᣜ償ⳇ〗忊༺繍砖ਗ搘獇㻟Ξ㼕帄\"夕䪯棵㷪耄性浐ဿ曔ₜ掚㜀媬࠘⢽〇ڸ㇡碣绋瑰纄Ɀసㄞ༞瘁珺᠚д幐罂◽ᑵື✐ᠱ墟ស捦␓ᕗ劊ᾣ厭ࣛᨚ秲揇䤏༙糯坞೔灰䉄刼㱟῝歖ʠϧ洎ॏ㟿䓀Ԛਔᫀ擘俇㨸ۘ
紆汇棝愨՞屖徝㈕派⟬俞᎓ൔ缑祳ȸՒᬨ怗⧈ഞ䙤㐉㯬ྴ哆㿕ι穘䶇歰㦿≟斐纄漬琂䠅俊ἴ䃼绱笓煓猝∀ⱡԕ礝⛍ذ៤ẫῇ氶劥稫煮䁏䱿ൈ熞ഡሟ歚៲⾵ᶊ㺐綵䕫繧櫪≿ᠰঝ悤䩯ᰦ縓⯫အ㺈⩰㷳છ砤祿拟㆞ଘ嘕䩠៻侦㫭㻦㽡粫犵ᑏ瞿☹嶝紞矀గ匡⍶徥㺦緗吥祧戇桿㇟ࠍќฑ榫约嘼俚槂峲ᕓ狗悻㮿仟磳圛䖔憷㟡ᭀ⟛伉㮀߼熳ݴ὇⒯≽௡ẞ䰶桇䠫ᔑ佑�笁竹甏䊇ͅ澜哥Ḝ㰟噯瀕⡠楎线Ȣ玗紫巿㮀໠粥ڒ簓揻澧杄倁糂㸛瓳㴳姿㌘សㅚ帒ࠓ姡咛怖愾罅䝵̯耛䩴咞ᾝ㘫ᐝ簟矯晴㾈罞悃緄箺༨๟炞ྟ㲦▭ࠇЋ濘枹䆉羳簣៯涃夘撞幌㯣吚セ樰ῆ㾍侎罱ϧ礯炿珿⺟ㄜ稞ᦣ.稜楑㾯俬↫礷畉毊ミ熟ᐱ☞帒栎⿤ᾢ㽹ř纐祷烕᝿罟㦭眜㇃ሥ堉⠛㲁㼠翮繫糧簯玝桟劎أ昜尝㠃揩“㑳爅�窳猏揿珟瞟吃戟犁ဝ⿱忩ᡆ翑織◧熏綿嗟⊟䬝䐘㴜們 焸缩纳῁箜䈲ર廟㧿樰沜圈欝〇怔㿾缹纻糯端缿亟ᄟᩞ嘟ᤐ瀚忣忨攕绋繧绷紻ҟ掟䔞㰮⠞堚倞⹚㿟㾆缣羇粖౿碿垯ᔩ㐞␚䠜゛㿪䀑羰ڌ㳷粍籟棠㴟仑ఝϟ簕倍俺翜罖縫綏罟瑟繖㈟䐟粣မ‟帔祙䠂羠纝緅粏絛簵經粵紿絗縔೟絿紋緯緫粙䥑䗟絾෈⤰λ縉絻縙᷻綅籷紏精絭䈓絀̞憻憗紝異Г愰ʰ˨ᴽ瑈˰Ʌ紻Ï綠ᶠϭ綐ə簿絣紨̙炈̗瓘͌⥻䲻籷沖ᗘO簶怸ό䂸ʐ˛縏締ϸͻᲇ丘ȾᄤИΘε᷇粳崴П糝縈̠ːˡ綸̈́ˁ糸Λ綡㷴ɨ̆ᤄ̱簼ᅶ倳綣ᴉ㣌˧絹慤ι籛純͠ʛ緙簶儌Єɮ璶刌Ϧ傽粮嵏ㄭ綈έ緔ɓ緐ʣ緛糼΍籲兜Ϋ紧䤢˫籟糐兽粋畘rϟ儼ʅ綔Ʉͼ̬ϼɲ冲΃粶ࣲ΃籚ࡪ̲ͣ痪ʗ綢˳絢ʷ綼ʒΣ糂ʿ緗瓊ȯ紗畃½緘塨ᵈ˝峐えᶤȹ結ˢϒɂ˄АɀͻᶨᵥŬʏ瀦ɟ緆ʹК收̦ɐˑ縊Ϣͷ簬τʬɲ偶ʀʦ或ɚ౩尭↚Ώ屴ᲄᷳŶ˔˻籦ȣ糦̻̐嵆͵籎˅巈䆆ˊ慾ȣ縀˦⃞ͮˮͪ紞ˎώϰŒϤȾ͸ʖВБ傡Ͼɞ̈́偮Ρɟ綤Ფʌɲ簤ᱡˡη籁̿䃁ςБ偱˜Κ籑αɑȡ̂䔩ɔɻ粎Φɖͦ˖́Ɇʄ͵絉Ёɢჩɟ糩ᷩφ棙ʊȷ絢ˋ巡ȹΑʹΖБ写̘偅ϩᲶʺ㓙͑ȥϾ₥ɸˠͥρȾ㴅ȮΨ恕ɴ懹ᷙЕ榕̙͏簵ʼ㲵Д̵絵БȾ㰭̘凍əᲅ˜ⶕЅΎ̥ϑΥϷ簨ͻᴽ͕Ͷ⃝Ί↉煸⇸⅘⃓H恇惎ㅶ焀↦䈎↽⁇ǖ⇐䂐⃬↉炇䴶岹»䢕䦥ëⲟ᷃㧵灛䆳䁊䅳䇅䆱䅓䁺`Çһ㣲䈛䆧䄽ご䇌ඡ粄LjȆ䂪Ýű⣗免䆤᳑䇱ᰨƩ@烐ƃ̫Ǩ䆐⇐LjÛ̘䃖ⅼ㶤Ķ₋䄛̶嵦ȐƧȢᆩ夲䣵熧ㄾεŶㅔǪᷘ巏緗江䁍↧�䀴ÿ䆇̏⁈䈗̠₹ùq⇯䇵煲᱖榷緣煜´ć͓Ă᳇͞䀧̜¿ͧ;⇣䀰‧ΪşͬԷ˟䃛℟䅷ͥǷʚᵗ̸ϗ̏⃞䅯Ͽ䄏↹䈀䊠↽ᅸ槩炏̰Ş䡁䨃˝PÐ䅻ɸ᷻ϐĢ[ʯδ䆛¤‧ʧȲ↛èï˘₦悢䇌↛Īł⅜LjŨ䎸䈶ᲇ˘䍿䃸䏄´DZ᷈䏨䈬䈘䏐ƪDZᴿʈ䊰ƨŸ䍜_τ䌰Ƅ䈧Έ懽䆘䌄䈳ʍ䇳Ǧ䈎ৼ祿䄐ↂ㶔䋈ᠳb慗ą億䊹Ň䁅䲇䈇悥䈟゠  "}
      

    The complete round-trip took 53.7 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-8066-vYT1yUtfqUSU-.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-8066-vYT1yUtfqUSU-.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-8066-vYT1yUtfqUSU-.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-8066-vYT1yUtfqUSU-.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-8066-vYT1yUtfqUSU-.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-8066-vYT1yUtfqUSU-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8066-vYT1yUtfqUSU-.R","role":"root","index":0}},".meta":{"timing":0}},"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-8066-vYT1yUtfqUSU-.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":1}}}}
      
    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.5 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.4 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":5}},"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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.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-8066-0mDCMFnPUCny-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8066-0mDCMFnPUCny-.R","role":"root","index":0}},".meta":{"timing":1}},"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-8066-0mDCMFnPUCny-.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": 0
            },
            "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 28.0 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-8066-71MIqIFsCv8I-.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-8066-71MIqIFsCv8I-.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-8066-71MIqIFsCv8I-.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-8066-71MIqIFsCv8I-.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-8066-71MIqIFsCv8I-.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-8066-71MIqIFsCv8I-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8066-71MIqIFsCv8I-.R","role":"root","index":0}},".meta":{"timing":0}},"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-8066-71MIqIFsCv8I-.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":1}}}}
      
    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 7.4 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 2.1 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