-
Notifications
You must be signed in to change notification settings - Fork 5
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-03-25, 22:19:28 UTC presenting an overview of flowR's interfaces (v2.2.12, using R v4.4.3). 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.
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
After launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server
(🐳️), simply connecting should present you with ahello
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.12", "r": "4.4.3", "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.
-
. object [required]
-
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
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 thefiletoken
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 afilepath
field which contains the path to the file (this path must be accessible for the server to be useful). If you add theid
field, the answer will use the sameid
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
MessageNote: 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
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" }
-
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 theRShell
(i.e., the AST produced by the parser of the R interpreter). -
normalize
: which contains the normalized AST, including ids (see theinfo
field and the Normalized AST wiki page). -
dataflow
: especially important is thegraph
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-7755-VV0SXJA0I1Hk-.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-7755-VV0SXJA0I1Hk-.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-7755-VV0SXJA0I1Hk-.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-7755-VV0SXJA0I1Hk-.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-7755-VV0SXJA0I1Hk-.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-7755-VV0SXJA0I1Hk-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7755-VV0SXJA0I1Hk-.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-7755-VV0SXJA0I1Hk-.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}]}],[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}]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
-
The complete round-trip took 18.26 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filename": "sample.R", "content": "x <-" }
-
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-7755-4QXkIa8d4HBx-.R\"}}" }
The complete round-trip took 1.55 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
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 }
-
response-file-analysis
(response)Show Details
The response looks basically the same as a response sent without the
cfg
flag. However, additionally it contains acfg
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":{"graph":{"rootVertices":[15,"15-exit",0,1,2,"2-exit",5,6,7,"7-exit",11,12,13,"13-exit",16,31,"31-exit",17,18,19,"19-exit",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"],"vertexInformation":[[15,{"id":15,"name":"RIfThenElse","type":"statement"}],["15-exit",{"id":"15-exit","name":"if-exit","type":"end-marker"}],[0,{"id":0,"name":"RSymbol","type":"expression"}],[1,{"id":1,"name":"RNumber","type":"expression"}],[2,{"id":2,"name":"RBinaryOp","type":"expression"}],["2-exit",{"id":"2-exit","name":"binOp-exit","type":"end-marker"}],[5,{"id":5,"name":"RSymbol","type":"expression"}],[6,{"id":6,"name":"RNumber","type":"expression"}],[7,{"id":7,"name":"RBinaryOp","type":"expression"}],["7-exit",{"id":"7-exit","name":"binOp-exit","type":"end-marker"}],[11,{"id":11,"name":"RSymbol","type":"expression"}],[12,{"id":12,"name":"RNumber","type":"expression"}],[13,{"id":13,"name":"RBinaryOp","type":"expression"}],["13-exit",{"id":"13-exit","name":"binOp-exit","type":"end-marker"}],[16,{"id":16,"name":"RSymbol","type":"expression"}],[31,{"id":31,"name":"RForLoop","type":"statement"}],["31-exit",{"id":"31-exit","name":"for-exit","type":"end-marker"}],[17,{"id":17,"name":"RNumber","type":"expression"}],[18,{"id":18,"name":"RSymbol","type":"expression"}],[19,{"id":19,"name":"RBinaryOp","type":"expression"}],["19-exit",{"id":"19-exit","name":"binOp-exit","type":"end-marker"}],[22,{"id":22,"name":"RSymbol","type":"expression"}],[25,{"id":25,"name":"RFunctionCall","type":"statement"}],["25-name",{"id":"25-name","name":"call-name","type":"mid-marker"}],["25-exit",{"id":"25-exit","name":"call-exit","type":"end-marker"}],[24,{"id":24,"name":"RArgument","type":"expression"}],["24-before-value",{"id":"24-before-value","name":"before-value","type":"mid-marker"}],[23,{"id":23,"name":"RSymbol","type":"expression"}],["24-exit",{"id":"24-exit","name":"exit","type":"end-marker"}],[26,{"id":26,"name":"RSymbol","type":"expression"}],[29,{"id":29,"name":"RFunctionCall","type":"statement"}],["29-name",{"id":"29-name","name":"call-name","type":"mid-marker"}],["29-exit",{"id":"29-exit","name":"call-exit","type":"end-marker"}],[28,{"id":28,"name":"RArgument","type":"expression"}],["28-before-value",{"id":"28-before-value","name":"before-value","type":"mid-marker"}],[27,{"id":27,"name":"RSymbol","type":"expression"}],["28-exit",{"id":"28-exit","name":"exit","type":"end-marker"}]],"edgeInformation":[[1,[[0,{"label":"FD"}]]],[0,[[2,{"label":"FD"}]]],["2-exit",[[1,{"label":"FD"}]]],[6,[[5,{"label":"FD"}]]],[5,[[7,{"label":"FD"}]]],["7-exit",[[6,{"label":"FD"}]]],[12,[[11,{"label":"FD"}]]],[11,[[13,{"label":"FD"}]]],["13-exit",[[12,{"label":"FD"}]]],[7,[["2-exit",{"label":"CD","when":"TRUE","caused":15}]]],[13,[["2-exit",{"label":"CD","when":"FALSE","caused":15}]]],[2,[[15,{"label":"FD"}]]],["15-exit",[["7-exit",{"label":"FD"}],["13-exit",{"label":"FD"}]]],[31,[["15-exit",{"label":"FD"}],["29-exit",{"label":"FD"}]]],[18,[[17,{"label":"FD"}]]],[17,[[19,{"label":"FD"}]]],["19-exit",[[18,{"label":"FD"}]]],[22,[[25,{"label":"FD"}]]],["25-name",[[22,{"label":"FD"}]]],["24-before-value",[[24,{"label":"FD"}]]],[23,[["24-before-value",{"label":"FD"}]]],["24-exit",[[23,{"label":"FD"}]]],[24,[["25-name",{"label":"FD"}]]],["25-exit",[["24-exit",{"label":"FD"}]]],[29,[["25-exit",{"label":"FD"}]]],[26,[[29,{"label":"FD"}]]],["29-name",[[26,{"label":"FD"}]]],["28-before-value",[[28,{"label":"FD"}]]],[27,[["28-before-value",{"label":"FD"}]]],["28-exit",[[27,{"label":"FD"}]]],[28,[["29-name",{"label":"FD"}]]],["29-exit",[["28-exit",{"label":"FD"}]]],[19,[[31,{"label":"FD"}]]],[16,[["19-exit",{"label":"FD"}]]],[25,[[16,{"label":"CD","when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":"CD","when":"FALSE","caused":31}]]]]},"breaks":[],"nexts":[],"returns":[],"exitPoints":["31-exit"],"entryPoints":[15]},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":2}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.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-7755-s2auU0GswubR-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-7755-s2auU0GswubR-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-7755-s2auU0GswubR-.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}],"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-7755-s2auU0GswubR-.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}]}],[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}]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}]}],[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}]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}]}],[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}]}],[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}]}],[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}]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}]]],[7,[[6,{"types":64}],[5,{"types":72}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}]]],[13,[[12,{"types":64}],[11,{"types":72}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}]]],[19,[[17,{"types":65}],[18,{"types":65}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":65}],[19,{"types":65}],[30,{"types":320}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
The complete round-trip took 9.05 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "n-quads", "cfg": true }
-
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> \"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/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> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/name> \"RSymbol\" <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> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/name> \"RNumber\" <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> \"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> \"RBinaryOp\" <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-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/name> \"binOp-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/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> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/name> \"RSymbol\" <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> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/name> \"RNumber\" <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> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/name> \"RBinaryOp\" <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/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"binOp-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/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/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"FD\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"FD\" <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-exit\" <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> \"FD\" <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> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"FD\" <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> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"FD\" <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> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"FD\" <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/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"FD\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"5-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/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/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> \"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> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <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/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> \"2\"^^<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> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <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/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> \"5\"^^<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> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <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/17> <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> \"4\"^^<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"}}
The complete round-trip took 5.98 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "compact", "cfg": true }
-
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":"ᯡ࡙䂼ࢀܠ墠ₛ⨢瀺䃆ࢀ■挼͙ျ‣:¬ᨢヲᆡ㑘ĐᆨᨦヰƁ倪憊ᇻ垠⺫WḬ⸡ሠ瘠曈ဢ泂ૃⳍ⍴ লⴰ㕰㪑Ⴀɰٰԑ栤㕠·戣܃�₡㢀ႄ刢↨7杁₃᩺း㚖ᄇ<䀵昇䠔ܦᷣᇄ棸䉭ʹ䊴䚀柺bɻл䀾⌤⨪斵⊂䛵੶ᒯ྾娾挂䳒涻↾攏ָ塖坓㈈‡嚥㇡ഀ䧋ᬁ眓禌ݫᰱ懊扨䚄⦒毨ᑣ穫⅁䋂ᯥڎᆝ⅖䏅ƕ㶟傄箵ᕱ兂ɩ獭䚁䒍繅䭊姉歌ㄺ⬍筘㤇硄牐峦ā橍ᝯ傣ࠪृ⢹‿焀繰䀦ဠ䕡⭤猊ဿ၊ㅤ庫䷄㹇Ჳ䰙䆃䳍勡湤橭᧕վ幈ᅇᚓᮕᆅ奌┤亘ᾌⰕ杭⮩᭙瞧冉⪄㢫䓀䏙ǫ勴⸦സ儉䢦ர䃴䓽ᖨ5⠮䅙⌛櫌浡䆕㨜煘悦䀠 ","results":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨⸠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ侶䧴䜉䮂疲䀾䂁拠ᏹ籃შ䋁ⱁ䀠㔠ε╉ሩ-愰Õ䨠Ÿↂ⥤R♪̚慡楚园梔ራ檐ᳯ᪆尰塲拴家䫺奲嫿Ꮱ♱孖国妖Ỹ氖䇠䂮͢䢆৪㩁ⰶ㫒ݎဵ㯎䐺䖎䅲䣲⇿㨾Ⱒ箾叡㭾対筞埽禞忠ԡ၉䠦獥ጸ烮Š䵵㹢䪉婩䣆㏱ѐോ┉䐦熸ဣ䥠滽äᠡᇱ暡ှ㮉杭䦀ᄻᡐ峲⨥ᗽҶ㹬塶⫦嫡礸䁖⛥姦剛塲廻ɱ燩䫀絔䍒淠☎ဠ祑䳬▩⯦秾䟥秞俧簞䁘ޥ㗠天䧺㦀摱㧊̸⎊嵳ʡ印᪆୪楠᭮楒⡖ӱ炌ԡѡ㹭┦ჼᩦ棺צ捽ㆬ擯⟙䳠姭⡽乂ᚁᣇ۶⏐䅅払ᚐᚅ泑ň✴⻜咠ᙞ㩎ࡍ垑䷨圎仌圾ॊ啩嫖ՙ坉⽝䙡ᣦՍ亮ࡁ⯋ˁ烃եⱖᜁ䏀䱬埅ᝊ㓜䘖ᗰ㨘翌瘣䙆㧮㙂盘昵繖༮碔♃ग़坩㫎♕䕅哉ᅬ椦䭌ᮉ嵎䠉倰攂↔斠獍ⲋᭁㅒ݉擙㝃᪙䙻摪⠯杹ဩㄥ˛㊒ᚠ棛ץ粜㊔窄䒝㉃ᑱ嚉ȣ㳌琵㹇㨩ㆄ⑵䦒筃ᥞ埩⛉⛕ƛ䝱溇圔㻐⨭ᵯ⢡㩿姽㹨䑓㛴ᶝओ䘮㤆็慘⦝ừ㒛ṋせ嚆⧥䤪䢃噰⽗ం䉣㖲拇䖙琹桠㘡栠瞁Ⲁ⥮櫨㞪╉恖ෆഭ⽋ᯪⲈ疶⛘ቡ慙宄ᖳѬ⧖႟ࣨ濛硚LJ祊㷒宭⠒稶♐ೢ㓬䮜瀾籪怛猻磋∧㍕恜ⷬ猔ⓨᾫ䅬㥒⇀縲⊼੧䒇⨠᪸惀ᚨ㍈.ⵅ恇旪凡⅍扴碧ࣹᑳൖ ᥥ桽ࠈ䠾绤ʣ䟲䡐ـ㌨ᬸ⻀ോ狡᰻撦ⅸ䲾͓eҚ䝠氬晐掱丠兦䕽ḿ䊂ᡥ䛏ᆨ卅⃩࣡晈ᦩ塓䆐ㄢ咇ψ䐦㼴䃑ᴳ纮ὃ䈪絬㩠䀤Ⅺ⥡ѫਡ款ᆈᕂ㉀探ㅤ䁋䟘呃夭ࢩ⢳डጣζ⍲ⓤ䑤Ɑࢤ俑椴०ሲ䚩⋼㞱㊗䝟ըᓝ้窺অḲ愦ᆔᥣ牨䕀䶩[ཡ媿兮ჲ⹙≜䳻䙪êജ䪡䂳᥅ሤ絏䋢ዅ䚕╬牭䳔䣩幫㊍ᢵ䣖㯇ᱸ☐䀣稼磶沆ࢹल㦕ᴂ♹⠯ၪ䀡剖ౠ嘸䊠⩩匉䯸奎沒㘆㩱Ⓞ佭ᓓഖ冾稞ਓፉ⺇纚ࢲ၌乘ԥ灹װ坥ッሁ▄㷍月牋᳔⼩堍ၶ᭩壖揞⼷㚊ᚋ⁎ਰ⺒ੵႀ㓔愉㨛妆昴繍瓓ࠠ⩗丄ླ斩ᄃ糏牠Ց३ᒪ塌瀨⼵ᡴ䂐嶒堵⪱ㅶ奿Ծ᫊犼⸅浰礤埊Ø䮥Ⲷ䕩噲䓊䫘Ƶ揨昗ካཏ㉠!璽➫㥷斊瓯㫔俵ⅷ摦噊哒⩍㚵ⶆ㋦淉櫙䪙ဠ¤㣱喩即❇㌩㵗Ə场槎曀椭Ⱑⵥ劻盄 ᾲ娳㜵嵤㒚媎窬檍ෙ嵋秏嫣ⅷ୲垤狉嫬⽵䇺痩剛⧋欭㊗絹坲䴎ۙ浽楛叺7䶚υ檳㛔֝㞮掏ዣ涍涹䮚៙䪖㓕䭽璒屮㫭⧍㭸ᗏ婫濅寇ㄢⶒ束ျ绨ᵍ'柝灓祫壳Ề檝㘬Ι呁床⇩ⓣ㷛ᚃȫߋ✯㭴ဎ儺Ẽ浃姾⌡⪧㢆䟢㴯Ě疡䌻狆ᦝᙗ疐㉧ࢇሤ枭ᤉ㘨₼猘條࡛搂㡧ኘ䞯⎮佷ຆ䨊ᵍ*╓穔᷻勫䲋➻❯壬俲暇ᨃ᧓㍔㰶㈧濪嫌樖畸瑩綻㇖殽卙玎〦凔枵⯭Ԋ侁梾凭ᢽ噙続㸚…ᛜ繶⾛佥敃䖵ḓⷿ珃埚皊㯄沬犉丵摸泬潔䅅㤛ႅ㭬䋷痮獽星沋⣰㓓⼶涝⛤缬᭬ྕ空㨇焻ۙආἠ1榇▃囆種㍧矡糼䩕婻ድඋ㔱ࡱ勦玗嫦侍偺嗽ᡛⰦ㬷㲗䯏䋮殣ᔭვ噋⧦ṫ㯙⮛㵷ᲇ፞懲眵စ䫻䁵嫤䩮ṷ䀖䦆杚暏˼泵玹U塧睍ݱ㚂咦Ƭ㛭湭恾ωᲛ沜繄癮澇婗䝳㔥ᱭ恞叴嶻緟➲䫮Ⓗ伩梍䱦劐Æ⺄㱫懶䝠珯ᤏ仡朿䘄当弻焆懤者៥㶗ᴎ毎ᘈ 乪殽㽷勾Ⓑ㟎⤖⼋㹿湙罚总㫗⣱搷ⵎ⊁澿⧼庥䆿夨ǚ㮸崪㔻छ☀ͱᇽ峫疼㯃㨯႗⟪紝㈍3珼囹ῠ⊝Ƥ尗ᔐྉ篗㔕滓焎ఞᐇ硨爣ط得獻㥾ߚ幣杇ᰐ尭娽᷵媠挓琚瀯܂嘵硞笈㳠ㄟ༡縃勱�䯎☜㙇畝⠓岇䶛ᮼ㵿้ྙ㑯慊㢗匢绦矻禘ֽ罯漛Ὑᆞᒪ纷穝䲚磒㾶态ᾏ寔瞺ⲵ悞栆翏籟抆⣷冪䠞匐u᰿敾ݑ瞪崀ଡ⢔䁬ᷢ⣈⩠利ჸǮ⸐埒˛檡树掾ȨᑡᆖⷘⓁŨ൦ႊᷗ恦樓澺ο䣡昫偩泬℈ΐ㟆洠ᙡ怭ᯆⴤ㸴ࢎňˡ羗忛Η攞仌䐄១矖稫ကԫ忙ⶴᤞਫ⢈㴤῁盉ᴕ伡丕らάኡồᢘᲬ䖁夹ᖍ懞爐㡲䏆洁ⲕ埛巜ᵁအ漩ᅶ殢㬫碂䊬ᠱ爩㡳浓ऱ梨‧䍫⤠䅠撐䍉旮ㄭ玤䌇ⶱ㓧҉⌀ু㲨ᮻ̲ṁ䴕�偊ᧁ氫᾿ѥ▨ൡ䀧瀬ᙶ已㡲⎢ᣱⰠ瑷⊚ᦱ叐ᡜ熚ᇾ䊩ᮣ⍒案榨䱹䓵֨伱䲈䈦ά縔斺扖ዑ炵歖䢥槑汱∶措䁉挮២Ť瑶净ĠԐ歌⎏柱㱒�掖䞮樫拾Ꮔ箯爬ȑ暸屁ʕ≨ေᷔ౨͒椑夒䊘⌾ᡁ→瀹截ᆑ禫粈㷱ᯁ䱪䙈ጾ᎑㮩䊟䈲Ἡᶪ炄僩ᴪ宭炋⍥渲䞮㟍抝撾㌒粍䱘᫁ᒫʎᆽ৩炪䀫࣏楩碯瑽⎞ᝩᆨ䪘≉⸀粒㶙Ắ€⊕扵ᓉᓡቴ匬ፉᩫ䪅ο䓡巅ɱ䅥॰来㟗ጰᎩ奫抜卓ඉ孩㞶凢Შ祤⩋僵Ꮹ妭扬絼ᎮὨ⨡楡ᇠԕ翁剕ᠾᒈ㷃ᕑၩ㊝̘࣪䎼㊣ᴉწ੶㌵֡ᐔඦ㊥ዜɢ戻Ľ䞸ì㪄綣᧡㍯劘ፋᄠ櫭噦⏳ῡ炷㚇㐉⽹ᄯᲞ㎻ᨹ标癭㌧ᏹ洫㘶ၹ刕㖼⊭ḑ㦨ᙻ嵓ݙש㘸剹�ᖷ⾸絞ឹ፩㩫㉦Ῑ䮕ʕ玓ᗑ凨આ珨沞♴ྐྵ䓹ۘ桨㪐犽ᚙ෩҆たἑ᧩皥泉�⽪ພ⌻ᄙ匬ੀ嚩炴ઊᤁ塎⑳珋ʥ၌硶巑ጥ㿫吐娩ሷኙ篪ᆃ爠嘾⌠冘≕ࣉ呍䊕ᐎ汥⟩ㆊ焕ᴑ冚卯᧥㩎猡ᚹ勫㺘ⓠຠ娫幨玈圥⟭䦍ΐ婺\"塪ࡣ徽˺䕉㌫瑵勘ĝ嵪准<有炲ጅ៱⋫♵ጅ祦䎙⮯峃李㪫㋣ᖩ␡羗឴▱ʣ-⋼Ⱐ䮷筁ᓱ⟪䌹䭐¥㉵慲⑨垤↠䋆拊✺⹋媺༬垚吳㎪㰨ʭ䫫汳䪺㧹䕱摹冹ⳤ怤扱㤒ㅽ狊圙⅋䵾屰╚Ҥⲥࡵᐱ㽫㥴䲼䰕⪐䍷ጐ䞔❫ɸ嚕㹊珇ᬐ䖦ഐ⍾䊣ᓍ㑜⫇䆣пጒ垅ⶒ䶺ዬ媲ච橸㫈ָ䀠Նʶ罌㕷യ㏶䦡嘁ᚨ琠ఫ䡻⧒狵狇ጟ⤿ၖ䅃╍䍬µ嫑㔽〄當㋦ദΦ硥⋆缍⾚桗䛇ຫ矚两ṁ泖ச愴㻟ख़ᕊ皲汗瘍姷╂甭哫㭃䉞㣍䄒瑶ᇗග䚘䰢䨷㴛惄㊠ܮAך尠Ꮸᬛ䎄㨒䵷夜䃌ዐ牳䶑䆜碋ৌẀі䧔㗢䌂̣㐭䂁Ǿʘຳ唟敖秕ᡕ壵狠ᡢ䨥槧ᵵ痜ሊՊ柕㋙䶜俁ᰚᠶ洶毦✀噤Ḗ殬⏖㌹淎泫㟖痓䁘⩆孧㴧淩渦䜵ᵆ歖梕䐱濮咗ᔦᵀή寗ᾢ楮氇᳅㘹濶卖址ᶙ揮巖ⷑ㑥毤⒕㯂䤅泎拥ᯜᇸᗎ嚖⫏䣦氎幐篎S溮䎹᷅浵沴ᤖ緞䵀װक緕师皾䦗篈ⱖ汞䏕៖ᵋ泫㜗䟔৪Ǿ䇗㛄䨧洎洗㶅潞䖖⿎㪗槞朔Ἶ絍澬媛῀巽殞樖៍䛫澮崈�緉涄䥖緁絀檾溗忞晎䰕ₛᩐᵾ嘠矓㴤䇞樯㏝Ѝⓡ乳䣳Σ漞梚䢃㶨Ὄ䑢�㔭䱖支ϒΫ⛡澖碀㶿樾崉墁Е橚弫ᠱำ榆籄䈹Ⅸд揌ⴒ殠⋕ࢅ䀶僕瞪禂歼ⓔ侦⸞䉡㟂⤳壢ʸ挀Ԡ㑮䛱廉㠳䁉ړ〠ᤡᗗࡇ✕無⠰ۆ⼗�䄪᪠ኬ咜綊᪠˖Ⅹ᳤ⷮ⺯׀搂湑瓗壥☶᷾㖬夶揅悑䥅ᲂ壎Ṣ㮭㲷廞們瞄増妜ჾ㐠ࡒ攼䕔絤ᎁ⪭旊ጺᦩ嚯犁ᐚᡞ↬◊ⷆ㦮㠲捹᧩維抄擮ᩉ潀䪓ᛕᴩ尦㟐沃斱宗ଫ厺ᳬⳬ䀿卂樹䩮䚝ጳᳩ䶬◷ጧᯩ䋭ण捅⅔⒁畒⺙童怵⨄Ჾ俓咏㏪氉䃁璘珩᤹婬䯣፶嶮ڶ琓ᮑ揮䏣㌦ԙ櫆㟁䁐і⒩㚝๛ẩ䥚窞Ꮰ屩惭䆄挰從ᑍ⚚獓Ბ差ᆔ単瓥癍㜼ᆕⷥ悛熛厤忹掭బ䨦ƒᡠ⤶楊檪⯧焪ၴ䗘愀摕㺐Ìۓ灧⍄堹棗䦕Ꮭ䝙擬憆琔塥煭ᆗ廅⺂用㼷ᅠḲ榃纇厜忩䃏ᴸ⯂宩䓏侠惲嶵燃叝ⱪ姲ຍ⯀婑硏㖒ଷấ癮榎ଦ屉捎㋪䉰Õ硥䤢厼孯㝌ƀ玮娵䰠䖌⭱䎕哌斁䈩䈕拎Ⴟ殖扙剬䎂䮁嫅䒌榖ங᳴⇎ᚘ歘畭䁮㟂ᡬڙ窌ῳᮖ尥尐䅷ᰙ嶕俒▃歅宵禍綃惵娭涏ڞ宆Ἲ㕍疎䰙ᢅ凍ᦙ粝奥硧倬㰲⫦耙䎟᷹䤌ຆ宄寍囌㞒⡭廽䲎瞝嬯ᡝ擂侓椠涺伓㿣㳺♝息ⶊᓖ帅椎喐ⷄ壵名亜ᯚ媭䮏憎ᰛ屸倾㞴ܣ婊琡䄇玒᥅ㄏℛᰃ底䆎䬦㮾嵍糎綒孫嶣䡎垔玴弹䨿⚃箍壣䞌羙䐤㯣侯ᴰ䝶婺搾澌䠜壃庌嶜⯳徕洿枂⸬㹵猍愝⭇ᴭ䰍〭篈㿵栎礛箹㚏ᠾ㟇⤊䜣碼澀䯑Ბ䐌ᄍ㯯嬹服甋䟍容冿ဳ寯惓䯭㗍ᵙಆ捭瓑絖岳嶽ƃ⟡媓刾ᮓ䟱夓䅬岞ᯋ⭬ᵕ⪛↋䃪ஃᯄ៶⣁䶼禒៤庫欿㔅柏填娾掅ី㮽㙾ᔬ⣓⬁ᤑ㔹⃦⃰喽ᇈ坹忓䬎ᾖ᠌㶓畼ഇ䞕㰃拦嬂Խ㺔㟟⩳ແℏ䝅㺃簽㔝㮵㷳棼瞜㠗ἓ缾㌱㞀ᒲ毯㗁汸奻瓹圈䬻㳳曍挃䞷ῳ绾㴂㟦㥈岘ໂ瞉沚檡缯ݤ㻹吿圐ᮅ㰻嬼ᮅ瞱従稾㼈瞹〧偞㚔बܴそ䔇埅⌧緼∅䝰磋从弞࿕㱛勭杣྆㳫疦ᣉᶈ礧幍爞毅㱇掿∇➹䎓扼ሂ佞㱛㵜樏睨ᤦܒ䔟᜵⹃硾洟༮㫻玼䨎罇橽盜⽢㷇帵䞵༷塠嘍䌂⟒綇䏼挓佛㼇廿㤃砜繛䓨瘓⽂罌怌☁᱗潽澟垰礇煟ᄔ佊籓扞⨔Ṏ粗䁾䘏柚秛琹漄漤系叿܊圡秋傞渓ᙱ缯咙库⹝䗫璟㬏䶾窳呿威㤻檝䜆澊罗㺝䔰徻浻↝ᨋ䭌禣䊞ἑߩ緻疟弙箽ட㐔绂絻⫺帓敘溉凟⼣㸗盽ᘙ孕簿嶜燢㿢碯禄⠕忸繏湜⌁㽞磏澞⸟忶罿絾䏯㿃筌畬䆥䠬߿擟仔羯糝ᐆཱུ繷媜༁忁盯祗族⦈憢〦ἲᱛ矝冞㐚耂俟纋税楗ᴈိ緧㽧絅撔ઞẋ帆䆩㼀箟揿Ȣ縒⁀㼴˞灄䅰ᰧ瀍㉁⡠ю⸣壵獶㽢ɯ睏䠞⺙㞆箵纴Ճ杚ᜨ〢ぃ⢍粓盶偰࣋侅l弓禟朠眢᜕灌侔粠ష婡繋紁ၺ㫥䍰䱸ỀⰬ廴ᜢʯ癗叞戥܊缄ࠐᘛ₣䦳ᷠ愔Ǥି峒ᑹㄡ䟌䆓稕晿⊜灇传營䝄༥㰺ҧ䅛ᤂ⅀䘗が愙Ɍ⁁攥ȼ䂝䅁禤ሓ㑣ㄯᑣ獴ࡀཾ笫緌柇绩ڿ擀䬝濒◠䊑愐チ抧父Ḷႋ䍰⸀䜢ਪ呕Ⴚ䌘ை㍁ƙ〤梜僤刁䘠擥倦獵䄜̪瑨㟡㚛簵むⅶ稬ᘇͣ俤ㄆᓧ䕿࣡綘䰿㺵៰翝㘯ⱘᾁ䉮珸ⱐ圤傸z䈪懫㱣埐ⱋ潟ϛ煸ⵁ㖥税偨慏ݚܐ朔壔䢠烲䌗垏䋁堦稻碟⇊ؠᨰ唤䵲渡焚ɠ凸昼ち⻟᩿ዢ㼯ᯱ࣠綱ൠ㑜汦ẩ嚮䇂砺͋⿅㨵噫僂⊨२ℱ堁⁰憖穒ႈഢ㋑碽㔿硻杕勶㠙䨳ҙ䆐䖼ᗨ籽᠒屈㽝哥౭奖㉋㱉Ѫ牡ᫍ挠矝犫ቛ䣺䈡।㨘㱣⬡䑣㬁ጰ佘ᙜ劮䉃ᮝ⏞ୗ俾䕦⸺㑵ᅙዺᖈ撬⎡Ⴏࣣ䈩ື䟡⾤䤺璒绦䐬ᨈ唢愪ざ}䌲埔ⷾΚ䰲㡼凫ԺἈ佂瘨汆烯⢳୧峮绀夲ᒛ愾篒᧠暂溭䏧ᤅ⌡೬勤㌄矃繸塚షં䜬ቝᢣ⏋ಬ㭑፦嘆㒁氻ᣖᦠ皥ࡣ⼱в䊕ࢣ寁厧笸垴ㅨ䒤ᘈ乘厯⼡幋⒑ʨؠ枪̮ⱺ䞦ṷă㖪ํ₱拐՜ྑϦ⪊汳懯ᮽ䞷ឃ䆨翶⣞捩ৌ〞㫤挰炖Ↄ惞䆠羢中䁵⅛΄㟑ᝥ似岀燱䜮Ộ琐⣓Ņ䠨ቩʢ㉁枹䗃ࡤ岉䏀Ҝ⋁栦ᠰよቯൗ丩䬚့籲䙔Ꭴ奁ㄨᅈ䒡慨伀Щ୧䎤㲑愴▗愸簲ឬ⅊礄ኺᚙ䮩㩥尸羫ံ奠垵ࠑ䅔磂㷯ผ㌑䩧梼縬䧘㤶ᥐ妩ʨⒹ籞ੲ㊩ᕆҶ劐䤺␡ᎮƲ⸫做棞ডॊ䰠Ɫⱆ澳凐䖞၄甲搭兄⓭ፅڒ⻊㝇䉉怹䢃揙႟ɣ♯煊䔓籴ࣄⶑ䃆甁䂶ঢᦃᆲ氩᥏䓫˓ਲ㖑氚䒼笶⤮☚ድơ奫䱇壜卙ࡊ㋩⋇樿䲅⧞䜇攟㾍ᅯᅋ擸Ꮼ丒⛡罇ⲹ塬烯磂憴庲㉷ŒӪ䀲܊㐑廅᠁㉭ਊ❅ᎄ䨲卬慆㓬㕉ӧ冾棆犳檒䦫⠕ᢴ灣䕩╍椽勺䳛䣤㧅ሱ䲗燊❍ᖄ櫳䍩ౖ瓰Ⓣ˄᫉哦碸㩹䧧⑅Ằ潂禫寫甋勳圦㨆䴈碻⪟榑☕ᐬ翢瑫ⵒ⡈㋧䆦㎚⿇㷉Ե倦䰍ᅸ汳祩繙瓆匙೫ᬹ校⤧䚘≿Ⓠ͢嶩ف㢧劜䩦⥱翥庹䰽ᦌ䇩Ṵ筲彯䀠⢅ℹ侜㳁秅�愼擃ᗬ䠡˫ኦ1㐙件䰉泛甬汽榫Уᕌ忢㋨Օೌõ䱔慧䜿⒎纏ҙᑛᵳ炨㕔䳄叮䱖㍐嗒䄱᩿ҳ筆ᵟӭ子梲㌜䥺⧹㦆㶻劃煝卤➁⋪䯣礛叜侪㫡叄㈺چⲱ撊഼䫒槲ᑊㄸ珿眶㹙׆疾⑹槭◻掼巂懨乇婙泑ڠܱ»咜᧤敝ᠼ䯳䇯晖崚猾䜨䶠戱㤤᪳偱ˮ瓃Ṩ䭇ⴊ䉷ಖⳙ䳓箽搰礰¯᪵ᚓ⌐⽐㳐½˶ⱑ⨇丰䉹ᧉ旮䇜匒編ཉ㳈䆘喦㦹䫤稿登㤣┧爓柪潙㳋獗兞⸙⢣はۗ奕⓿ᑬ絲Ǭ㽃崇玳ᖞ㢙怅侸幸⨦䇠ٜ揂㛩㝘ʧ玳䤦㬁㮘侷ż(ᗏṹ㢦པ㳏㌐บ⸹䨄ᆸٲ㧠朆ᦢ紓柪კ㲲ો䣖㈞䈷㞽㹼㧺数屼䴓◯ፅ糥犸⦡゙☶⾶缮秤䘏慳㏬ࣂ́䤞㷹勂ᡵƔrᒒឌ䠫桋僅⢼䡘㨥⣫侾ᝑ䁙ਟᙢ卓屍潗䌉爯侱⤙䔶ㆅ䗂ᕤ໌嚪喬㵉㔖猯俁⡥䈅㱹窃ᱩ婀寈淼绪⹄瓺ఋໜ㮹ゴ㼡ڈ庩⩃䠸呃ᅍ䟯䒼浈犽哈ᩙ枍疪丵姉捂緓繊㣐ጄⱹݩⴲム⺉ᑻ燑搷Ꮲ湫㊒凨孹泝㍍䓅䗸Ί湿䗀ᐤ傂战括䕪叜⾯巅䧻攀⦂乥᜔僋㽫檗彈㋝ం⥊㍐ᱡ♺Ӄ┹ᗮᶇ⸓ḕ䳎❢水癍䟅穚䩵ⷙ◚ᗤ姬纂捱䁹戴䦪❅ᥙ晱㥢敷ᗱ惛⌼͍㋧䮅䦊⸅ツ䳂㚔旇វ庒甽峐䰌ķᱳ䥂ࣘ≨喉䱢烕勛૮ⴉ㌅溴ŷ楰ᖋᓤ廬䟃惋寴䠣ĩ⳾屜㕢慾⏀嚙崹㿫䪑Ⳛ䬛䫰⬥㦅她ኃ慝兆ᩈᕁ纲㝊ጘ㍩㞵祺厽斈囨壴啫⍉⅒ᠹⰝ彵䠢Ⴤ╬冥斮旪䝫䫌ᓙ⭱ⰹ㙅撆䕿䲔商噡⻓ी䵏罜䋠⫕⠅䑵祼⥠售咢唊绒䍭㫋櫑╲ㄅ㩮ôᅵ楲乁埊哧⛊ᕎೇ⪦捩⏯ᐲ砡⤭ᴹ唳摺嫄㱊擋糕⫴殎⽭ㇵ㩶ں窞ㄥ唶嫪䴨䅶ᛙ˪વ⨅㛵䩶䍱啽㕔唺禒淈漢⫬⊀Ԭɐไ㭼湷㘅哺咪徊槎ˇ⌁⮧ⲍ⧴皫ᶓ㻋㉔强䏍盙㫕⪋⭽㶅ࣷ楲畽帳稾娩ԝⲧ㍮㪥⨷Ɑ⋕ᕴ卼妊畔團嶚䎋ᷫ廕㚇毭䪲㭢䞂Ɒ䠧Ⴍ搳Ი拊⟍糋竅䪎⡵偶㝴ͻ᪖ᮉദ媍磌ᬥ㋣䩞⡚㸕❻㶐㕟呾堚孒䏌䛋㬋啷䩃Ⱳ挣曌榞㨆嗔墦傊嗎凍ڬ樾ⳣ㰥᠑壻♷囏垄傦䠊䯊凕ۡ⬤棽↭ⱕ杤⥱⫯社妊礻ǎ⛅ڴ⨧⼭㻕⠄ᑳ䤿㛬⡬晵ς奎䁚✍᪳⽅㰕祕䍾嵦෪㒩勎ֻ泑৶匃楄槓ⲭ৻泹ⶃ业㛶墆紺㟉ໄ枏ᬊ⭂姰឵糷႗㙱埦厺ډ㧀܃⾖幍䤰❸犜妐N┰㯧㳘擿㎌氫㐕廷佰ᎀ痲晥壦檻䖍湌圏൴ⷢӍᙁ∯灄劐㘝ံ睊䢋嗚媦寢檋〭睔᧦歪礴䈕弞玊括䑭⥫㒍㏷䛰厃杕勆梙嶍湕㜎憉䮻㒰䉷敵᎐洴㖍坆桻៍勂ᜉ婬槧ᤍ⢢⻰粕㦾࢝傈ẋ垏秔媱ₘ淳绵䋹䭱䶀ᗝ孖䥻美桜ں猆歌ᓚἨ㣾ẇ㗠瞖徖婻ྍ凑寒滉❄࿖凴㻇榓㞥∵ఠ憤棑ᛰ揄⤧㎍幔䋿㕦坣剒亊ᾎ叁⡚㯮爛㓔࿖ᬋ䯟⸋㝓垆浻宏燗㛩尖涛❍㢖眺儂癳剶欘࿌ωᚲ⭡梓⽭皖⇹杫淤眊嚬峺嬈䳋寔䊼ᱲ窔痸枘Ṙ盓墎䑚侏绋伌樲⩋Ⓧ㮕夠យ渞痖儎砰ግ㯌ີ檈潣⭍ᢕᗱ㝨㸖琫刊狺▋⍫均㩹䡭⩽奕燴㞇嶔㔳弾䥛澋䷃ἀᓳ淼㭽䇔⡽䞞巡㟛尚沛弌拔弅㯮曗⫝伴ᰊ籯啖ᜲ哮撚ϙ廥᭼桛⚍䔔嗻澐㷛䠝❤ࢰഎ柘窶㫃濋⢖䷲⾙嵦旭僞基琊䐢㼨稻湣㒝ᤗ䟷ྗᷞ璝办䛛琍ⶳ廖楙㎵崖勶杧崤癃ᷞ丛孋篑缇篞殁㭢࿗᭶緑✯壾䘚ᎊ濘弟穎䰠澑ፈ╤㽿◇痏剞璛瀹ᯑƿ㨠ᤛ㌣ࠔ篳䮸傫㖀㈞湚怋࿏㚲牳侏㪝㈭ᬊᑅτᆓᔦ㖋柖䇫簈 ㆣ帗㦷ᮇΉ᎗媗㋼倿竚䇗㬀㼣֕䷳杵᷉䆽撞刍䱗櫻ધ歟ⲍ妗᳸僣̸ᜨ㊡暧ⱊ⏗盵ࠑ䫓㺑㠔珳愇絭砐㽎䦧穉⢄圝ᢷម測䛷ᄎ̪ཝ偡定昸緁匊惐䧗Ⓧ⛥䶿烽涡ಏ咁䡦䨹濓懽挂ᶄ㒣ⵠ毷ㄑ旰ဈ㍎穻䜍⒝懍䮰ᤛ㝃⼗䎽ㄆ嵀偄㏆丧䤸珌凡ݬᣨ橀凡戳ࣩ涌ʝ太璧喈ҝ㺽婲ᬗ〝䈮⩒実⎛᜔㟘瓽ၲ柁懵箄ᴸ烣嚬♚ࣰ䎽ೠ࣑刚筎Ⲑ刌ހᨨ粃⌕剔䄓奈෬㷾櫛⊧痊ၒ儰䀻㽃Მ๖夓⎃ຌ㆑祦佋͎㜛䜾ẘ挠␖湆తㄈ砗噌场笉Ნ结䚞᱇㌃⦯⹗筩ူ为巾䰡❳㲑Ⓓڼᧀ旣㰭婘煸⏛⭱烛»༢ጛٞ᱄楃澮䩕壪ᐄ仿卩啳硌㿬亣ⅇ矵㇃⃔ᅒ棫Ꮯ࿔㈁䝆▉噮ຉ⪯槨勭ಕၿᶝ㸐䰸㉱憛䢻粁䪪㉶歬̡倯ᇲ姕瘚屑执欿⪇缊ᤈ牳工嶵⓴㐱໎処ҹಋ熭䝥᳴米ભ兗᭫ऊ矬㊀㬻傹㓖ঢ়ݵṈ缽♞擱Γ㒦㘩为噎梀㺨晽橈戍̕ⵗ慹㔰玖矍ዚျ伕㫥ᡬ䭼䮇揇ಪ㇉瀚㚸䪁ᦲ嫫ᩐ៙刯存ᔔ巹侟嬹玆纻䭃眎暒Ḋ䷳㍭ⴓᎭ佺㛩䆇ⶼ撗喙䝄᪠ਃ嵠幓洏Ϥ伤㫩囇㟉檋懕߈❼楶◖ᵜ✠㎮璺㯁暆冻皎䇗ޝ‘焓工ϱ惾⎪佹寎撆疾આ㧼昼⣥↓榬䫱簣瘓๔兹圇丿䢜熿⠓ᷔ熓怯⃚ℚ况䷆㵹噛㖼㊂榸曏涏罭㱑ᑱ縎員㑩尶䢺㚞㧄ᝠ巼㲫⻯畻ᕴ፵侦㍹屆羻⪟֡ܰ妌纫⇋ᣕ䓥琁Ꭰ㿱䤦Ꮍ巊㨟曝ᶼ潓恍棜⋿␇ヌ咞緧ẓ㧁䛄娴箫ᳬݛ⌟୪Ⳑ㮷ڶ₿Ẉ⻇✡ᳲȳ⣔攌䮠⿂巊粆ɹᅜᠦᲯ歞Ҥ熐ミ䒛௸⺑㮥柇ᚸᦟ㧈孺瀗⦢Ὄ奺冖愾墕其俓炉榗娜簛ᡂ湓≍斿ଉⶀን剅䟸Ҡ竾爛ᜐ忲獋䇬彖䯓偆⽕澺煷玊䐥烶哣ᴃ⎫忯˝ᴃ䮁⽞㷉䵶ổ病嗹唺帋㗳ᯮ߷㳷௱䱵㯥䊶䙹斔㗪⇸ᬤ㇋ᬨᲦ惫ࢅⲥ㏥吆籺ຉ嫕坔䃺纍ᇎ櫞ᛂ縕㋉瓶㢁ǣᘮ廽㇋்⻅䭋㉕㾞痶㡸窛嗰坊岚立㨑㻞嬣⯕ⳑౕ皶㝺疆■㜆妒筋䏌⇙ᯋⱣ㩔嚧繿㖐ᗮ圞宦瞋ߏ䋒歨ᬸ溕擋ḵ斜亸ᇁ帚糳᷎曗嬜歯⹌⣵䵗ᆷ⎃歮∐耋䊏櫡猣ⶔㅓ⽗惸▘秕柬将悻⚍ᛤ⯄湫㝤᧽ʂⷝ掮廔ᶣ῍˟䛾䬹ⱃㄌ殷圽斝㖽㚣᮪琻怮旘㜃猪瀍㰭硘㛸䆚淺坷ᯖ暋⎏᧘䜂䮫ⲛ㕍姶ổ嗚㠕墆羻禎ה真⯪浤洛定㒆埧ᢺ捓粘恗ᛯ宮泓㴍唤䝹戤痔㟽夕䕛ޮ幕紝ᐎ乧㎽䏖ㇿ枎ᶷ㞊壎櫻䋎燦嬟⍉䂞█᪁䒌嗅ᖸ㘭弖懛剭ᯜ㭘丅㯽宁緾ގ嗖ޡ捻㶍燗⼝尗⹗㠍䋷䣹ᖗ廓ᙷ壒想⪍囟夘㰋潩㧝䥆箼⮄䶶矫彞殻䘏䛗䔇斳伉㩝圗揹澕䶱㚡Ṟ櫣勲狝ᚬ樷浭㬭瘗㮻ખᷩ瘿媨ᐧ䩬㻛䂷㭾淽㎝䰮ᏺ⮞μ☷塟⦝㘌ₒἚ߰᱁㖣縗喟ϸ噛巪浂ᢪ件㐉㮝氯塜儃殚ᨡ檁縏䡔廵㮍⺃峉絖基羃ϒྟ塎殁䛏哞漒ݥㅻ⩵瀣℅䐏相㽁焍砼咖:䟩澋㵔㪮簼䤆䘂㚔㴁死挏ⴠ廠ࠊ洨盥乗≘䞜⎲က彑漛䬾撛⬝䝒溋㗕砮䱟広⏓༇ᣑ檝柑ᛑᢍݥ沸珙䞯慚礒Ꮼ懭徐娛叕糔ౠ⭎ṿ㨝箯呺┝䎪ຜ㽎煊㏔ʒ甃䞸ⴄ眚焖䤔䏯ྪ㼑灾ᒌ⤠凩篅僉恝牶䎏唍揰人㩉筧ᒼ綀⭥⥏М浫啞掄⏚令㿩梇䒿擝ሓ㬤楬眠೮ూ婫㎡䝌璁暅显䲜᧺杆浃㣪绯緸厓ࢨᑢ䊨ۼ哺汝⻡⏕測窓櫮䁿ⴎϭ举㪙掰粺呿㨔枂涊ҵ䀫㞾Ԗ疵伪㽙狅厍斲ؖ枀廼硶牏煚军樆佦㶧㉰౽皐税࠰崈㥕瑏ၜ㔋琇ᙎ䀖旉綿ঙ䛝ឮ戗唃䋮㞈ങ㏯企㼙暷帍⺔☓ឬ屜狜⎱ᣜ⊛ற亞㤁箢綼䖝ऐị䄹⼤䝛䋄Ꮞ⹅㾥歕䑽榐秲垪䍒䏯൏樢�䱓夊梧ڼઙ嗯ᜨ幼綕㻮⛜㬽ୃ⿆㹐ᙪ条㊙䥭㬿淅㇋岶盞欁毙榱㪨Ϸ䫨碙✉㒁岭䅎㨐拘㚉旍⮙㰞熦綽掙ᖰ埳ᵒያ䵯乜ⴕ揮⸲㼅窷签榟旮㜦䏝㗳咈懛ؼ毗睨椅翷ዾ涖⸐㜵幚焓䎏姞洁⍖êሩ礇畽官෧㞻ᓨ羫痯䘤༊ᯛ倖㵇ॖᮓ幊嘛紴峺繛䪏旛猛尉亷㤜֗䆖殕缭วৎ礁焯ミ㜛㯮澗㹞ⴗⱁ箶ᮐ瞊峢瀻犏伃㏐ѿ㴞⚮ขᶠ唐䝪丶瞳殎壚漋箱⯅㲴క䁞䶎䞪亩尡㯵䭮捘〹߄ứţ柋䂌⊗䘞〳ᦡ崻咉⊢戂篵䙗㻝樯⅕峸␆㻏丱㤾㢝㼝㯋湟㭣眷ԕ〪揩ླ员披撩•Ո䆇嫤嶯䯿ⶓ␇瞔㹯僧湘䊞�⠑ὄ稥皧ᕟṗ屾叝Ṣ癫䤏濛༞⟅᬴縃畇浜㝛叢Գᘵᜡ孟橭䡯ⴻ̕⺨⣅ᮕ⮊⯻乡窇䔛ଊ゙瘵ᾼ筼硱曣匮᩶侮㸎ᷨ㛮Ფᤪ⟪Ổ滃殯籟ኔ口侨⋥珨⏯喧ㅖ㔰彃Ͷ秐ᰵޜ䯦淦㸙緧哎╜ᶨ垧ᵋ籊籣枘⭶⽮㼵盙毷㦕戞㝳㪽硏ᣞ䌙㺖⺏⸵猷亾⟧㈽ᡵ湍㷦櫷ྼ䴓Ⰰ潟念畗疾㎘䪲弈忒笀ᨁ昄ጐⰔ佴㺑狗穿梜昅➣徾Ꮻ煏䵞ᒜ吆漵䋙焷䅘ᖜ䯕ឫ徭姽浗炑ⴚ簘『㷂砈䝾㦞洒ᯞ帥娞涏徽㘲吂僙㵣羺恟ᰡ罄䈡惵ľ㨿椎戗篰澶㳝纯焩㋖搜乴㺂碀ᐍ㉣㶔㦛搏ἶ絷旾㲚؈倌忉組໒つ唘楺䤗㲽稗皖做化簏瀁磻筏㺝䴠៴作糥算猫ᒧ₷矗宧瘯懟眙恁瀓㓋祯癿⎝朕⿶ཐ㷋症㬐琸⿵幭碏煾➾Вǁ㹮㨛悏ʟ圙㟾⮭㳻眇搧猚䰄➡懤祧旿凿ᨛ篽砟㵰⯯傞抚樳拏⼍竗旯祬怩琋本縚簇磏㒛ᨐ៓ߡ紻浟⣝ἔ⿷⼸綳猠➙☜瞨翽窯炿柟渝㠅㽸罷煯䂟孚␛㎶ሕ笯櫏崟紝㾊ፙ⹃眷廞砛濕㚽篂ᖫ糽妔ݲ朰㼯竗䟞ጚ簙柧㼽䞛惠ᢽ䰛炊㱇粗剾攉㟆㿷禇糿ㆿ䈘榉習繝犛渤椟㠔埲婭糱泿ඝ欕矧⟉Ἦ绿簭箌燳溟䘇࠾濭伋䦗堋㿲Ῐ彭㼌締ݹ璠Ჿ嚟ᬆ怢怘喔怆Ϻ羺罄渻粻窛煠ᦠ㐟㙞䍼箚倭㸌毠桙⽜Ȍ嵷礇牀ស怟מ㈢㪙栭㘁䁗忇䕕⁍㰸֙爾泠㘫ȡ䜜䠤+့恛䁰眹繚㸛竏㒀ዟ䣗℡呜氦㠖′濦䂚ὥƠᵨ磍䄟涠㬿ᳮ沼יᠭ⠲恝₂¸Ṳϔډダᵿ彠悾ᇜ༛◕卧杰ḶϠ祸掀㡭㗾圢㼙Ṑ砵嘸篏ݣŁɼ笸ઐᐟ䱇ᛎ䤢ᰧ氭งࡓ抦Ċ㺱峙秳煃⸇䗗㾡络移瀖б柱Ὰ〼䇜͇礕狚泀⠓ġ䊢ㄙ㒑ᐱ㏾恿º䅕峂ߟ熫攟塟ʞຢथ互܌䡁翑罏䲝˦篆؋映⼑ൔड़倣ᬠ㜨ᡔ⿔ཀ䇍ϡ簎Ꮈᇇ䌠潡礝簥䬕搸ỿ又䃪ᜂΪߐസᏰ࢞ģ琥嬓Ё翻ろ㽪廿㰻箼ក㰿➢㐙塔吼硋矜öơЈ篌ॳ栐㚿ء凜伦ࠕ㰶㡝⾧悴䈅系礜ப慟坏ు㪣〥ഓ䈼т₍䃄∈䏖㫂ເ᭟䧏㽰ᘌ帥䰮』⡎�佔幀䏬秓畨ᜀ㾀旺䙘㌦瘩ࠅ痿炌Ⴠ⇶Бຄ嬀䊞沣Ⴄ昬Ⰹᡒ疾㞏Őɷ槷矄ᜏ帀䤡⸜搥┨ళᡘ徾侅䇅峥砲啟ແ䥢㬙漕䠸㡏厽㴳䄮Ⲫт൴ᗀ㰿ᓁୢᠥ㠪⠀ј⿅⇋͡ܪट抯䚟㕞͡㉨ಓ爴呍炝傱䇅ϖ㤦ȸ㼀綾ဝ琘ပ樳㷧桳ტ繩䌗碣瑟期䐌ᅁ犣碠┫ؼ寢ᢞἧ↿ȫު༇暨♏ᬦ䗙ᒣణ¯叴䯆㬼∜䈢تดᦸ⻐并䘕٣ᬪ䈺摍Ὴボ縡㶴ᬛ噤ᛍ䒐囁ଝ▛夯丌ၘ炅䃑Ƙ䉵զତጰⶓ㴁䩢䎦䈬戴屚桪烳䆋䍃кຬᙨⶓु␝㶧⬬娰㏭塻睼™䏷ᶷ䶣ḁᶣቃ稑㨱瑕澹ㄆ䄷ɏݫ炴࿐だ䊁䤤嗗⟤塭罳戅䉗ؚনኙ嘨䘡杢㲧ପ戰呅灧ホⅨ⋿Ӂ每䰐洁绢䶤ⱶ䨱᯿碘㾘↤⊥Ԗ࿗慤㧐由榣爧ⴓؠ㐤ܵႿ⺏ᷓ竎জᚘㆨ亊⾣ᱧ㢭渃㱛ំ惐ᆺ䐀䗈ഌᬘ⑨攁䒝瞩墯喃ῴ㞿焙ᆭ̑礡ᢈ╟㜁客㰦札о䡗�烳♞㴤䙉า᷸㑨琱㑃ᤘ瀮縵尿侼䢼ᅋവڶ࿂ῄ⋐慁⮣湤昔樹剕䡶倦∹ᰁઈ䃨䘁Ḝ殸⊬䄸ん罝ǃ䉧稱㌍櫕ൈ䓡ೂ晤崖┹䩘䂒ࣆᅦ⎺壤↿捄㏏╤㐨Ը㉖へࢦ愣䐊䘵ຒᕿ䍀洱∝ࡧ粫ᔸ牕Ѷ·ᅆˊ܅玊ᥤ◐窆䭼璦粯男呥烞Ƴ⌧ص溠㟈琁㭂Ჩ⤵居羦࣓⇫散祥ಇ惄₨䃱≃敦䗕ᄾ瑗灾焥砭⌹з爺መ㈈䤘帢橤椻㉒璂棡创⏄䞝浟囐璱㣝佥㬨昶穇忄ᤕ冁Ά硤દᓄ⾈䀦⧣渥ᆩᚊ⢍佥纒䎝㣹ड़ᑄ㞈䱑₂ᕥ吕昵桟ᡬ⽞ǽ䟹Ậ⃐絑ᦣ᭺䆭ᠷ手ᾱ⇑⋄㬡ྜᷓ嶸䕀綜ཧ㒫ᴰቘ䱮棋凪⎹䛾॒ᝀ㰸目⥣⭤㪭紵ᙟ璟ᤘ冢掎䗽當ជ䨨煞㻢㮡⚨㌺♕璙ᢧȚ拼䠂Ʒ涌⮈䱱㵂ç⺭䌼ÿ保壐凁ɫ离শᚬ㤣ᔁᏭ廦㪮渵䉎奚壾ㅮ拕䕍৶ᢴバ翡侂琚渐㬾撓壹㈞押䓻玠ৰ⃠睡㊢ᨰ綫✷癌涪侊㸥抆քࡶᾘ㗐泱盢⧤ᚪ䜸َⱹ⃟愩拷༮ṵ䵿㧑ৣ䷤⪨笴噓皪墄爓≩䜛આᆼ♏⛰㚂䖹挫䞭⹆㒂潙儨⋧䔷ࢾቼ㟐炁稂箦Ꭻ簁珰岃㢷ㆶ掃䝆൏枸▰实㉃ᷦ᧖眾Ṃ汿㤒Ƅ⋻䘶࡞Ꭻ䗀焱ૂƦޮ吁湂Ɐᣎ燆累䟇ࣾᙰₘ乑噣᭧⾪䞋㹍㲝磩煦䉯ंᐯ子摾堃ዘ֨缰灔粋儋Ủ籧䓏ຶᬢ㟘簩ᴣồ㎩漸๏⟞ᤊ⅞ɴؘచ⸘昩ᯃ⦬傶峧瑿碢䆬ፃ䝐件ᖢ㙘䅱栂居Ⲫ䌇⹔㱱Ӏ揧砽ัᡜ⣿⨩؝桅ሪἰ繑≾碴懡承䐰䣚ᓢ⌤䂩嘳ⲥ㾭ስ恂䢂白⊀❨佾ᭂ㭏ᦩ繀ᙇᾮ☲兘ぺ䓲ɼ⚒ഴ㇐嫱⠳痺耑墷ńʐ伳縳ˠ╩ਏ澘嗤䔎眳⅄媩┺ឬ⒋澂冶᎘❸倁ᴼ⬤亾㒲㐚䂨⼵䋪習磝জሬ➄䧚ၲ⎤窱奣㑇攮礷䉞岊礀䥄ሲ⛧പᡜ⋰懱璲瑭⢼Ŏ抄Ὂ燽Ꮀ⟃甒ᙂワᐁ䞃᥇䩪㜱煇➧⓲෫䐤䤷済Ⅿࡩ䆲৻以桧Ⴆ沟άহ縑ᩫࢮፒ㿄䲩⛴挤猾ᩏ徧ᣎ䘭ಚ⚼䰡ᖲ⺄䉩㸢稤ṫኡ䁓碛僵䥾䋳Ҍ䶉ᗒ㠄拑剣唚䀸♇䊏ⓒ䨇ᎌ♼䫇敟姠签啂猧䖨䲸籃䞳Ⓣᐂ▌䧊Ḥ⼀畩⹂归ᜪᲾ绿籭碷䧓ᐑ♂䡡᧢≨摡崂㓤宫粽慆桠Ӏ䦘刦⟲䦬Ꮒ⚟ᝩ熲ᓇᮔ犽╛䪍ᓾ⧻呴礪伻滤拞墳窥╬Ᵽ㯸璎ӷ幡搞⚎狪ᖵ䝈崘လ䇤䑪㊴啝ᢆ擞⨄ͩ┑ࣵắ䬘䝉揣佄╯䊾㕚⩱壇熣挩♠俕ტ㘴姩㜲⫆犭匶剉ɢ䓶⇟捑⛷હᎪ㍸佉ள⻄ᥭ碾橀沊⢥㻧␆ٌࣟ愺⦘䒩䈲㇆╫䚺啕律戇扥ޤ侯檊⠴穦䮂岦号ʱ穄䯂礂䥙卪☚䮩်剉稑ὤ昩樎慉牷ᓤ䈞别☦俑ᶇ忔䴞波櫧㵨㐱䥆䪓唀⤶勇❆䢄⟐䵐Ѡ㞵ི⭯栈嵟䢺瓘;券8˽ᨩðᜨ䤢斁ẽ啎⟉⣚⨜䖓ΉᓝၘԔ朔㏲俆斅⠭嵜㢕㒠剏⚞䶭⸠㐉亃甛劽Ş㪐璤⤯厠暡䷸∙ᐍโ槂䕇瀩ᒵㅚڛ㒱槁炛塌ᵸ֔禄㱓校眵抂ᕟၸ哈劀據䡭䐞Ἤ渮㻈ಆ䣪㨢Ἤフわ槃粕㧻慃᩶䀺ܹ⪂Ⳇ㵢↰㰸ᐸ䅂Ƚ☮䨸ᶦ㘬紹兒ᑱ䆨瞇捝㱊⩎᧹␏㬁䦃ᔑ叭㌹槪㬦᪅䵙婴㓩ঙ刷✞习柦レ䏆⟜粅懤ఃᵃټ璺ᦒ㌈旮䂓―ᘟ㕑ᅓ碇೨况ፇ檃品樎㎗⑉倓ᢧ䆎ູⓥ垸䳯↲浓ٻ䴅⥘㉆僥䲬婌刹ᢤ䰱ᙖ㦸䭕暈Ⲵ娒㍜攉䧫῾ᕥἹ泣ᧆˮ⸼♪惊楷അ䥵䮓杏啥㖀噡䕺੭唋灖㪏哌᧥㉜搲ℶῚ⤪׀உ⡢Ⱪ汪ટࣨᦡኪ斺伫‑ᒌ煶㣡█Ⱳ䱠Ᏸ囇ⳕ椻㎫᮲䮻ᷬ☴䡹奒䎄囩න᭕報㌴會㐖杊ϫ氧喷ᴩ婢քۮ▼孊暕捝娋㌾旹佞ᰖ㊌仩灈凪僭疿⅟噹泦奛叞斪卻ᰮぢ⥀ഄ䒆 䘠塎Ḧ䳝⥺㍬椡⨲䦵ᗺ糒暆獫璻⍒皉ᵰ㧬咲➶ₐࡦ㉒ฉ٣僧۩撧❇ᝐ䭇庌獨朱熌ฮ㳠摙ᝒᾅᛪ㖶ᢷᳮ窫䥱枈✷ᇷ䬼啶刢㴢‣㾧屨⟍ᥙ࠽ԅ攣ぷᔪᱺᓙᚐ䂘䞵咵時ډ沦娋ᎁ杕俬₧䰠⇙㻼箪⌥洈杙⢃ᢶ㦟ḗ㡛䥥ᥓ䈇ᛀ䭃㖅༯喾ᕘ峱㦵巖㤛䯗ᣠᴘ㩞ᐝᬄक㐶ෲẂ噈䁑猩㭬煞ࣻ俼疱厓ȇ仪綹㝔Ṹ⸽泣㬙㔃ၚ❜䱙ῳ稅瞒㨅ᱨ♢眧伃呔勧䣫漾㾇᎙㮒๒緮ᶲ㝊䚂泼祂犘擷倃᧠ઠ叾ヽ⠠寪帆潁珄糴移ᶩ∪睏ᵦ⡜喙ᄓ䐆៨䀣乁庛岩㣗࢙ʱ䣯揾㊴皙ᘒЇϪྺ㮦ⴝ礸Ě桧䢀Ծ⪜歞㌬ਆῬ⫡ཟ⨮牣令珑➹䭇ᘶ⸼滎榽勳ᔦ羺߽咸㞘嚑ҽ昡แᐡ⃜琥㮒Ƈઽፂ庙峕禷珳㰜犫ᜋ唠䗌ࡈ⑁䔠恥紗燏琖㠾р又Ҝ⣀别搷柨℅罋ᤧ噡㡢͓枨䥇れ庙瘒堄ẕz搭䅴Ք猿珶瀴϶㾼对Ḫ䦆埮熲෧Ɣ杚㨦ᱨ㍰楹Ƽ瀙ᥝ者慯Ꮀ䃘㹾䅗碳㌍敲՝䗱ʢ䬩᳴懘ⱌ㨧坓愤紊悿䧌ᘸ䷐忓䥼殥昪䫩矫䘁ፈ炟峈㦆猡⑿买厲ਢ丙缪彥昨ሠ楬䩑䁗Ե䘲䮨啘兂澉歜帵㶿⥚ᒔ㒠Է㊬ᚮ䭁ᶱ㦴䮡悂猧只⑶祀䩺䤊䗺ጳ杧䬙䍱㼔憉Ӳ䴷Ꮹ㑽兜Ẓ紞禵犴᠊䠧汔㧋ᤙ勲‚⋄婫Õᱫ│䖽勧⛝璸吆㡬䩩璝⟦㻲毀䣕內㔁䔫ᕈ佪⇑㹂兢ⵥ㠦瞻䣚㳕䧁ૐឤ⦯携⺀垙᭳㪚垦決䭁煾拷䔤䇊◄⫸埱✂夁䆪㤆㹉⠂㳯煩挍ু㷦⨂嚸僼㙔䥹禪悷宪瘃ӓ溂ィ全ਡᐢ䨤姆㩟ɞ䱫䕸穕ںࡘ↘̗䖨䮖ᝂ⦀嘡ⶢ䯥枫墴畫庳壔ॵ夓䕏ளԼ⽨兩㗼䅅⾫Ჴⅈ摽⩍⒏䬫Ⳟఢᕺ૯ᶑ✲滉禒檥娩䈬⥫䊽熋䳪ᔒ⣇㒏㫅洲㪵慎㒰䓗䦄徊╚䮿䓰ݡ⒢煈☫窶煯暹Ⓥ⥥㾓╤ఈᙐ⢠墌⣰嬆༓ಶ潬㔻⣂檈澏◢䬆ւⷔ円モ疙ካे㹎ቾŔႝ䋋՞䪹曃埩㪲䊅䜫䁛₩≷⩚忀劭▓ૉឰᗩ䀂棩н瀅屿᭔纟⋬נ䰑⢐ᓱ㕲憙˫ᆵᅏူ棟ቯ点㻁䮔ᖽ灈傁〢䞅⋪Մ捍᱿淬穾၊敫絾枂ྰ塶㴜工↫Ⲷ剎乱罁ಞ㋄旮犛䘶Ⲕ囿宒琑桪ᝐ╈㸹൏纉ᴁ敥୧ᐾ⦓抙╥⦩歜ྶ慈牊祻㒻攢ᔉ熜庩⏲畅绫熅竬ݞ奾ጆ縡拷ᦂ⽌帉ⱒ慥縫堵樄ೄ䥺嬦☐⯏ᙁ嚹㌐䤙ㆫ㺅⺋⃘䅣̋▭勰撡⾛ᘥ㜂䎅䡋᧧ࣈ婺⋍楫拾䖸⭟ខ宥㝄䄵ᖪ棆媩䖁ᄻ⍛֣犐啖ⱅᇈၪ珦ឫᴴ叩ॹ筌╷敚㴄垔⺞ᰁ㨠㑥ᷪ瀶晍幻䋘徴⊣种䩻ᔉ⦸墉㍲䆵ଝ♴ᎩẊ㋁▂䊨ᔪ犨哹ⰾᏇ宒䎵旪瑷耄㳍թ獅䘍䯟ᔶⶮᠵ⨲疀氰䅵干㳩栥ၨ唨揶ᒙ⮜売㽢䜵╊₵ⳋ㠄䫓ㆄዻᗰ⪬啈ย偎㪪䡥屫夆瀌᱐喟犴椩劒圼⣨娅₂厵祪䑴ᫎ特䣕瞼⪤嗭⯠呵⿂和⟊沅⢳搥䋋畻⋕喃儌散⣆ፌ⣈兴䚙含ᒇ偋ᾲ櫀㕯䪣八⩬囐《Ե㱪啵㜜撵楊畾䟤疞櫓ᘐ䰍ᔺⰠᶇ䌊於狫亶ⵋᅶ䕤ַ᳙䮘ᙉ⬨峅⼊毾柋䱷䣎咰ᓗᕳ⪴喠䊧ៅ⸚妵⧒䨑Ϋ▵狏祾灙㖕㊳姲䪹ᘚ⮈唹㙘瞅㑋淧奊嵰㓆疅䫘㔵簹ᕝ⼈兕㳊峅槊䛥燊㹴߲慿ᲺÅ䫞呈⬒啕㋐凑೫ⶵ壈䍹瑓൫棲㕧⪪䜑⡺娂㦺䇵㿊搥ฒ䭰䙘㖔嫸㗂権埥⤺幑℈桕䛊䫶⫍䭱ⶇ⬒斺⮏斾⧎ᶺ㆒僙事᭵嫌᪳⫞䦊たॴ⎲圵ⴚ埁␒梵ᢋ㫷氭繰盉᪂᫁◨櫤ᓠڏᑭ⻲方絊擶䈭ⅱ滳䦈⼽㗭綃喕痆⒲䔶ᝦ⛡⋺杈ጳⳃඏ匁㘛䨹惇⺜⑤͚䠲ⷅ⇷䍉ુ䒸硒痝塼ᗲ㛮囕⻒擵殊娥槳㾢䥼夠嵑匑樵林⺙䚜㟬䆨ࡠᯏ⍴滐ঌ勍㨒䮧埤ⴎ叩䋢䯎ঔ秴⏊ᭈ廌殸⥛ౣ⣑姴䫘垂䖚喕欈寷柎档尷㓗ᭆ惫殹撫Ⳛⲥᕚ儰粤៶䷊㚰䭑㢽碻瘀¬⇇ⷊ婏ᯖ㛮䁜ⶠ摍㍻䉋൫ጌ硐㘟囼⌥ᔗ倚缹䣉呁�乲ǀ綔⬐വᤀ㒤悰喷๐杤勉ᡕ⿉♻㫓ᠺ瀯惘ᰀ㐺ŝ䎣㴩㤹ᗊ䆇㑱㮱组䎜牻唁ࠠq夷倸冦R䚖䰱ᥒ提濹⋨ᇐᭂ㷕ⵂ澶急䤠᭖ᕁൟ毫ၚҌɽ㘝⢭ಡᵓ䣱䠪⍦焹ඪంþഝ㊪䥈攻ണ䒌䣸墯⎌䛖挘䃑ϠɊ嗡㴼ㆭ㭀爓咍ᠩ凋フ䛻බᯔၦݠҎ㰬䉢䜻⩗搱㣷-捨楿ඝ擹Ȣ熆咣〻机晗ྲ䓶≴ऱС咄ᆽ禙媃⍦晸㒻⑃偕⓺焭䣅႓ઋ䆐㍊ԉ⡉๐筹ᕓ亠࢈ヿ仒⡔ࡹ哎⥝፬儩嘳㨌᷺᭭㢍ӡ懟࠷ھഽᤕ⇐вཨດ㽭笓֊䥨䀥䉹ㆦ傑七䅒懬澵懽䮐ሉ㙤䭖Ҡ⠩䬳㎛勔瓀Ʒ檅䙙嘨䴎ʎ堕╕屧ᓶƩ✕ಁŃʏѹ̀ᆂⰺ㷁硥㿃䶭摓ん灐|䍈҂䬬Ꮸᴈ澻᯳〦糼壷獻籁㤒䂡㒢氲ث㑜ᑍ炨 䣹ૢ瀙傫☠き⼹ɢՄ拺Ҡ 䬶礌㾻烖Ƌ拴䗂祆げⷀ䤨ᆔᏸ䒣崘愤䕹↤炩㋱旓玕䎗嗒狕呙婏ʆᜱ嬼❗呀抈瘸揉瓧᥄ᄰ㟪ஆ䝋⊦桄チୗ⬤栧(籁ඓ焈෧እεૂ奬㹠煶㖎櫿ᐹ桡ⓠㅗ剀ٕ徃⧼♸筺械⍇ஃ䳞ဠॖᗲ欤䧰吲ᬀঐషᲣ㫳⅘湢ↈ䒃愀͈ę劚ᕨ⟍̡廔䤥竿嗋0㛍祲უ㞤ۋ⯨楘ހ⡃櫶ᇌ歶囜લ填㕞◭墋⏛゠䩑䬸急哦6ᮕХ㒏烸㉢䂏߆ຆՀ獺ᗖ疏椨ᒾ官⊚洭尓㒚盲ѻ㲁ᖍጺ䷖䫅㛻妣宂㜘浮ᤛ㞶槵喋⍐ㄍ瑑ᒂ㟀&⟽囨䉼ᝀḰ㷗栥㢥ᐷ栠�磡ʲྏѤ㷕纩盓涂㙶ǝ垛⿶琍丈 紟㜾梠છ㖖䠍⯺〢澌ᨪ秞FⰠḁठ瓞渣圛╦䘍⸡悖ℏ䘢䗇ሢ༟渃婭㟘掽ࠛ⾖檪卑梁૧懹䬴䝮Ⱶ਼洅⦒湞➓㱂ഠ嘠娊㋦ㇾࢪᮇ˺ณ甒斍ඛ◐ᛀ㾺僡厲㘽ǔ媁㱆⬀ဵ㟸㘃巾n䐴慛Ꮱ⾥Ꮬ❰竾ᶌ䔄盀呇㝚܀喻᪕⍅䙯⏑惙⋢婃ㄥ㍒檹傢䫮桄䆐䔄⤋亠珗䮉㑳泘ᮤ喙ഡ䚮䓈༐幚ᕗ澊㹮珉ᝊ䕌₀䊲ôⳑ寮刔什纕䔋䀠㮀全怶壼䂤ު庳⽶糒ݠ甉⌤斦煂爲›䕗冂ۖහঀ嗭హɒ紈刯珑䞙皴嶼ò瑲ë婯奰㙽⩡㦕ㅀᗱ⯔ፍ⚸റʆ禿Ƴ岒幎璍ⓛ柔俀⺹䀯䠡าᕁᄂᄺݚݜࣽ☩⺕⍢㘢䆫摤滔恳㫤㓥毦ẚ€猉喰瞤წ⇞擖糢娳ᢟ教潐䦕㖽屓㍳焥幥牌孥囪渚₪ѭ岻㕖䁝嶣㷅ਮ嘵㭧ၱ†Dဠⶇ⠦搾⃀剂磷䦔㐸y䌳㻄俽Ǻ寗ℋ夠孲㛍ᕀ窶↣殠į⨾稍ᢛ焖ሎ⏷妵ྞ၌㴿㨬ΖБ奆㺁⹝䷺竔Ȋᏼ◸ྜ⊢㸆戆㙳櫿ᵯⱦ浝қᔔᨋ嫤柍佥Ԝ欘䇹瞬❵廛㠎愍㏀紕ȍᏴ។氺ၐ礀篥瓔䅣問㺾䇀䚚侱⯺柘浖暭ⴻ孍㜓橹⯶滝狁№䘊史㟄捹庹㴶笅畻橌ῇ⥾伀盁⬗㼈㯱域ྞ庾 箩瘫椗幯⯾燝梚尅樏篲䟈ὸ㻦ăࡑ痭昂 ␁㝝➛羔帉毳痏⾇廃㶰窝痹З咯⁞潌禚ؔ㧀別䐱䁎牅ฒ甥ፊď僠塂兡悱簌矿旘ͼ⛋㷣簇Ꮧ欿幱์揍㔑๔ዄ於㺒掅緁崇暅ᐐ淿∋⩝䬹孫Ⴠጁ忇彳牓甤屔ᑜ牏Ƀⴞ紴⠫宩彮⫷+྄k䷇簗畞␄杂ðⰝ⳽ɖᬣ翾翋统ᔒᯰĠ嚂ຎ⯤ⵡီ瀌翿⊦Ė傘τ䧘㘾⎟噗✾✝樥⠮㟅૽ᗔ⡛ⅱ怰่㞢䕋㫰ㄣ刧㊠ሡⰫ࠻绮怵᧑矸㇠㎲ኰ㛢ئ䰬堹⛧ₖ㌧缒ͯ䥘Ὰ塶䑡玬楹ʕ᧣濴႞䔤䇀㻲ۛ竈偰㛑₵㌾大⤺Յ⡕႙䪦䇭瑚ު倸䃮ⷘ偡嚣愧簮弒ᡜ〤愐園摚߈⊇ⷾ岒嶡垌䬧椚᰻灕悍℘绸䷎ߓ揘ᷰ㘀瑡异懕ఈ噏炒⠮䈎䑓ᬝईᾺԀ扖䟢⢦堠ሹ䘦႞ᄀ↰慚ఐ癯澰㶰湜❖唴ᇙ㶒൪碹䄎ࡶ͎ݠ䕈㚸᳁䚒帧⒳凅䁖ₜ惲Ƕ䏝᪾礏ޡী疳座厲呷㙮梀ヰ⻗䖡婨⊔✽䖠焞⩣戻匬嬗崲ᢄ䉉䎃َᢱ⍸㳐絮点ს悳㔢炠㇃疟᩺䍟槇甼ᷞัޘҌ䶧䢺ظ刧㢊灌℟匆త潘㲹ᘁ篣㼄㼮ത゜ㄝઘわءऎ樨敐ᠠປĴ澰ⱚ⨵焔ᇛ嶞䕡ཛྷᨤ㗐樒ᩃ䐚⼮Ⴃ坋嚦⇬⍀䝾ഛ⑄㧝ā噀ಕस㱔粲䤕ᆿ᷀䧐Ȇ毨㉊䁍嗻ጀ枏☫㐷摊㈠傒偉瞛氕勨盖叾ᙧⲮ᠌ᑡ撂籙眎␘ࡅ−ᲖH烬ᡰ䎚挖氍ⷜᄴᛉ⏼㬩ᮥ姨繱墍╦ᶤਖ਼䐸⤊㻔涹䄕ྪៈ罱婕䐘䚬熍䭯症䣽ࢅ⎶䛵പ嗈滱丠䥧ຮ糩殢璎㦝┗⍴嫙යḄㆈ畱䰐歧Ƭ☊㹡ಌᤐ䲨掱䛓唃憬㊈汦䋃㺮ጿ礯璅ᣭ㻔搔⧓ຆ᳤ᄒ朦禮絥䩙璈夙刞⎅䞳ಫ泌㝿㍌㶃弹檮嘾殠沑夒↪挙䜅ึᾬ㉸珑珐ᵦ㶮㔺噗犠㤜倥揌嗱厢㚳匠䑣匥Ꭽ嬹乐〷棲㈕⍖䚣ส⁏冩宑儃༌垬౧瞀岙ㆡ燘揥娳෮ᠪژ畑徃義ᮯ⼼㹛㲉瞡㻽掼笭ೖṔ㕘攮箃矦⪭㬺繛沏殐৺換㍗൞ᬒጘ瓱尃姧は朿䅔岇磡ቴᎠ⟯䠊焢㜨淚س槦塯༽ᙟᲀᣢ揄➰业ᕂ㙤牲䔳灆Ắ弾穓⊃礙捂䜸佼懼㱤矬勅汯佉䩑ʐ礕掐⠈倁ᰕ幄箠⢳慒⩬䒿㊬粓䔌⠄企ᱲ㡄縪ᴑ商橮ㄱ⩡䲐㎃ぶ揼✵ೡᰔ㷸捱熳〚垰ᬾㅞ橲攈燍ᐈ⚔䰶᪢㒘惩栃⍇㚮Ղ祘Ნ攁⑶❿橱ᠪ㝄皩嗃ŇⅯ㣄䘣ચᚇ:揶⟰˹᯲㾄笩掳痧枯冹䪛攈兿⛭呼◪㕤罩扳䍐Ⅼ⼺㹣燔⡄⧟⋍⛰䷒ᰒ㤤擦琳ˇ➭点㥟⊳唛⨖匙᭚矆ˊ㌝⓲磇畭確㥜⪀䔋ᳬ崥᫆䲙Ỷ䅔磑䆠⻇劬檹䥗㊇㓰⨞Ꮾ♲俱⛺ㅊᶑ䴽撻⩬精畓㊐瓾⨃匭⚶侞ᰕ崰傀ᣳ涉Ὥ䲿嵟媖⤼槞厡❾䴵ᾚ㰸砉暳౻卮ಊ榫䪀ྟ⧾ፘ⚲䶽Ẋ㽥ᴶ石㔈ᣬ憽᱕款ೲ摤㍇⛒ĭ㠅ᬹ曳㔈ⓔ熸䚉瓢ᦰ㎫♩䷃ᰒ䕬抹棜⪇哬⠈慟⚁ᔃᧆ㍅✇ₓᮆ㳖V✨渱㱁㌡Ƥ犼ᵓ砻儏憮−䂼ƒ༤⦨ø⩬ഊ㈬ᑹ烐傛㦍孡ᦶ朎ڼۈڐ㦁棠玡㐢<ᯊ⍌偣惧䁞۲ಮ䲠模䭡ਢ稫ብ唻䡯厘惁㐰لဃଠ㋓䤀䯢㰦倯皐⒗㶐Ƥɬ䟎ࡸ႐ᔐ冡砣䎺怫⏂䠵繲泇㩱佊ٮ䧀ᘐ祦盒䭚利Ȣ䁯烩暷捱ޞ櫘Ĩ氠䨠厽⑮僔嬾曯�»乧ẉ༼椠ྠ笇䔢㮻❑亗簼瑠࡙来ȇᾱ|烑冓瀁ு纡坑⺎㳾䒖カ朋且䟀ຠᜨ៓撺㻯〤Ы皒峺䡾悂ላ䶧ᮩ௸ಠࠨ㶱吢ྺ墫氤ɔ䁠䄗晶㖴䔐Ӏਸ਼稓搇㒢喾䠬⠪ஃ㦫獨ƨȴߎㇼ栥戠့⫬·☭ᨯ砯䵬{Ϡ寉₸լ✀笉⁍㴡伣磞㰭層瀾ᢠ "}
The complete round-trip took 37.83 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.
-
. object
The response in JSON format.
-
-
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
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
MessageNote: 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
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
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
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-7755-Wwxl5t5JzpGX-.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-7755-Wwxl5t5JzpGX-.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-7755-Wwxl5t5JzpGX-.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-7755-Wwxl5t5JzpGX-.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-7755-Wwxl5t5JzpGX-.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-7755-Wwxl5t5JzpGX-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7755-Wwxl5t5JzpGX-.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-7755-Wwxl5t5JzpGX-.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}]}],[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}]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":1}}}}
-
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" ] }
-
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 inresult
). -
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 ], "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 13.60 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.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
[!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 theansi
field totrue
if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theid
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 theend-repl-execution
message.The semantics of the error message are similar to that of the other messages.
Example of the
request-slice
MessageNote: 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
request-repl-execution
(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" }
-
response-repl-execution
(response)Show Details
The
stream
field (eitherstdout
orstderr
) 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'), 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) :dataflow[*] Get mermaid code for the dataflow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowsimple[*] Get simplified mermaid code for the dataflow graph of R code, 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'), 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 :dataflow[*] Get mermaid code for the dataflow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get simplified mermaid code for the dataflow graph of R code, 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" }
-
end-repl-execution
(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.63 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
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
MessageNote: 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
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
ofx
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))" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.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-7755-9oFOVvpA2Icg-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-7755-9oFOVvpA2Icg-.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":[]}],"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":[]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7755-9oFOVvpA2Icg-.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}]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}]}],[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}]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}]}],[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}]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}]}],[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}],"indicesCollection":[]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}]}],[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":[]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}]}],[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}],"indicesCollection":[]}],[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}],"indicesCollection":[]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}]}],[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}],"indicesCollection":[]}],[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}],"indicesCollection":[]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}]}],[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}],"indicesCollection":[]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}]}]],"edgeInformation":[[3,[[1,{"types":64}]]],[7,[[5,{"types":64}]]],[11,[[9,{"types":64}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}]]],[31,[[29,{"types":65}]]],[32,[[31,{"types":64}],[24,{"types":72}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}]]],[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}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}]]],[67,[[60,{"types":65}],[65,{"types":65}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}]]],[79,[[72,{"types":65}],[77,{"types":65}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}]]],[87,[[85,{"types":65}]]],[89,[[87,{"types":73}]]],[54,[[50,{"types":1}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
-
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" } ] } ] }
-
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 26.13 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
tovisualize
). 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
toplot
). 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 off
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 nodesfile
attribute isundefined
, should we include it in the results? Defaults totrue
.
-
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
-
. object
-
. 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 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.
-
. object
-
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.
-
. object
-
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.
-
. object
-
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
-
. 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
Call context query used to find calls in the dataflow graph
-
. 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
-
. object
Compound query used to combine queries of the same type
-
. alternatives
Supported queries
-
. alternatives
Any query
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
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
MessageNote: 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:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.12", "r": "4.4.3", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
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-7755-AHYuK8OLrOpP-.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-7755-AHYuK8OLrOpP-.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-7755-AHYuK8OLrOpP-.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-7755-AHYuK8OLrOpP-.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-7755-AHYuK8OLrOpP-.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-7755-AHYuK8OLrOpP-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7755-AHYuK8OLrOpP-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7755-AHYuK8OLrOpP-.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}]}],[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}]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
-
request-lineage
(request)Show Details
{ "type": "request-lineage", "id": "2", "filetoken": "x", "criterion": "2@x" }
-
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 ] }
The complete round-trip took 7.91 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
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
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"}
- 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)
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) |
:dataflow[*] | Get mermaid code for the dataflow graph of R code, 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 simplified mermaid code for the dataflow graph of R code, 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, :?) |
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.12, R v4.4.3 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAwIC0tPnxcImRlZmluZWQtYnlcInwgM1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCA0XG4gICAgNCAtLT58XCJhcmd1bWVudFwifCAzXG4gICAgNCAtLT58XCJyZXR1cm5zLCBhcmd1bWVudFwifCAwIiwibWVybWFpZCI6eyJhdXRvU3luYyI6dHJ1ZX19
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)`"]]
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"argument"| 3
4 -->|"returns, argument"| 0
R Code of the Dataflow Graph
The analysis required 1.76 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.
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.12, R v4.4.3 (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.
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 totrue
, 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 supportsemantics/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, initiallytrue
): If set totrue
, the default built-in definitions are loaded before applying the custom definitions. Setting this flag tofalse
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 atype
which is one of the below. Furthermore, they may define a string array ofnames
which specifies the identifiers to bind the definitions to. You may useassumePrimitive
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 $<-
ornames<-
.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
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
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.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- 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.
-
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.
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.
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
...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
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).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts
, and add its export to theindex.ts
file in the same directory (if not done automatically). -
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 resultingExampleInfo
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, withInfo
referring to aFeatureInfo
(likeExampleInfo
in this example). Next to aname
and adescription
, 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
).
-
Add it to the feature-mapping
Now, in thefeature.ts
file insrc/statistics/features
, add your feature to theALL_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).