-
Notifications
You must be signed in to change notification settings - Fork 10
Interface
This document was generated from 'src/documentation/wiki-interface.ts' on 2026-01-07, 06:05:28 UTC presenting an overview of flowR's interface (v2.8.5, using R v4.5.0). Please do not edit this file/wiki page directly.
Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.
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.
When writing a command, you may press Tab to get a list of completions, if available.
Multiple commands can be entered in a single line by separating them with a semicolon (;), e.g. :parse "x<-2"; :df*.
If a command is given without R code, the REPL will re-use R code given in a previous command.
The prior example will hence return first the parsed AST of the program and then the dataflow graph for "x <- 2".
Note
If you develop flowR, you may want to launch the repl using the npm run main-dev command, this way, you get a non-minified version of flowR with debug information and hot-reloading of source files.
Available Commands
We currently offer the following commands (this with a [*] suffix are available with and without the star):
| Command | Description |
|---|---|
| :quit | End the repl (aliases: :q, :exit) |
| :execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
| :controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
| :controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
| :dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
| :normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
| :dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
| :dataflowsilent | Just calculates the DFG, but only prints summary info (aliases: :d#, :df#) |
| :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.) |
| :dataflowascii | Returns an ASCII representation of the dataflow graph (alias: :df!) |
| :help | Show help information (aliases: :h, :?) |
Tip
As indicated by the examples before, all REPL commands that operate on code keep track of the state.
Hence, if you run a command like :dataflow* without providing R code,
the REPL will re-use the R code provided in a previous command.
Likewise, doing this will benefit from incrementality!
If you request the dataflow graph with :df* x <- 2 * y and then want to see the parsed AST with :parse,
the REPL will re-use previously obtained information and not re-parse the code again.
Generally, many commands offer shortcut versions in the REPL. Many queries, for example, offer a shortened format (see the example below). Of special note, the Config Query can be used to also modify the currently active configuration of flowR within the REPL (see the wiki page for more information).
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.8.5, R grammar v14 (tree-sitter engine)
R> :dataflow* y <- 1 + xOutput
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDBbXCJgIzkxO1JTeW1ib2wjOTM7IHlcbiAgICAgICgwKVxuICAgICAgKjEuMSpgXCJdXG4gICAgNFtbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzYwOyM0NTtcbiAgICAgICg0KVxuICAgICAgKjEuMS0xMCpcbiAgICAoMCwgMylgXCJdXVxuICAgIGJ1aWx0LWluOl8tW1wiYEJ1aWx0LUluOlxuIzYwOyM0NTtgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46Xy0gc3Ryb2tlOmdyYXksZmlsbDpncmF5LHN0cm9rZS13aWR0aDoycHgsb3BhY2l0eTouODtcbiAgICAzIC0tPnxcInJlYWRzLCBhcmd1bWVudFwifCAxXG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMlxuICAgIDMgLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjpfXG4gICAgbGlua1N0eWxlIDIgc3Ryb2tlOmdyYXk7XG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDNcbiAgICAwIC0tPnxcImRlZmluZWQtYnlcInwgNFxuICAgIDQgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
Retrieve the dataflow graph of the expression y <- 1 + x. It looks like this:
flowchart LR
1{{"`#91;RNumber#93; 1
(1)
*1.6*`"}}
2(["`#91;RSymbol#93; x
(2)
*1.10*`"])
3[["`#91;RBinaryOp#93; #43;
(3)
*1.6-10*
(1, 2)`"]]
built-in:_["`Built-In:
#43;`"]
style built-in:_ stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
built-in:_-["`Built-In:
#60;#45;`"]
style built-in:_- stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
3 -.->|"reads, calls"| built-in:_
linkStyle 2 stroke:gray;
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"reads, argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 0.7 ms (including parse and normalize, using the tree-sitter engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + xFor small graphs like this, :dataflowascii also provides an ASCII representation directly in the REPL:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.8.5, R grammar v14 (tree-sitter engine)
R> :df! y <- 1 + xOutput
0<1>0
┌────| 1 |
┌────────┐ │ 0---0
c<4>c └──c<3>c
|<- | v<0>v┌──| + |
c---c──| y |┘ c---c u<2>u
v---v └────| x |
u---u
Edges:
3 -> 1: reads, argument 3 -> 2: reads, argument
4 -> 3: reads, argument 4 -> 0: returns, argument
0 -> 3: defined-by 0 -> 4: defined-by
Retrieve the dataflow graph of the expression y <- 1 + x as ASCII art.
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.8.5, R grammar v14 (tree-sitter engine)
R> :parse file://test/testfiles/example.ROutput
File: test/testfiles/example.R
program
├ binaryoperator
│ ├ identifier "sum" (1:1─4)
│ ├ <- "<-" (1:5─7)
│ ╰ float "0" (1:8─9)
├ binaryoperator
│ ├ identifier "product" (2:1─8)
│ ├ <- "<-" (2:9─11)
│ ╰ float "1" (2:12─13)
├ binaryoperator
│ ├ identifier "w" (3:1─2)
│ ├ <- "<-" (3:3─5)
│ ╰ float "7" (3:6─7)
├ binaryoperator
│ ├ identifier "N" (4:1─2)
│ ├ <- "<-" (4:3─5)
│ ╰ float "10" (4:6─8)
├ forstatement
│ ├ for "for" (6:1─4)
│ ├ ( "(" (6:5─6)
│ ├ identifier "i" (6:6─7)
│ ├ in "in" (6:8─10)
│ ├ binaryoperator
│ │ ├ float "1" (6:11─12)
│ │ ├ : ":" (6:12─13)
│ │ ╰ parenthesizedexpression
│ │ ├ ( "(" (6:13─14)
│ │ ├ binaryoperator
│ │ │ ├ identifier "N" (6:14─15)
│ │ │ ├ - "-" (6:15─16)
│ │ │ ╰ float "1" (6:16─17)
│ │ ╰ ) ")" (6:17─18)
│ ├ ) ")" (6:18─19)
│ ╰ bracedexpression
│ ├ { "{" (6:20─21)
│ ├ binaryoperator
│ │ ├ identifier "sum" (7:3─6)
│ │ ├ <- "<-" (7:7─9)
│ │ ╰ binaryoperator
│ │ ├ binaryoperator
│ │ │ ├ identifier "sum" (7:10─13)
│ │ │ ├ + "+" (7:14─15)
│ │ │ ╰ identifier "i" (7:16─17)
│ │ ├ + "+" (7:18─19)
│ │ ╰ identifier "w" (7:20─21)
│ ├ binaryoperator
│ │ ├ identifier "product" (8:3─10)
│ │ ├ <- "<-" (8:11─13)
│ │ ╰ binaryoperator
│ │ ├ identifier "product" (8:14─21)
│ │ ├ "" (8:22─23)
│ │ ╰ identifier "i" (8:24─25)
│ ╰ } "}" (9:1─2)
├ call
│ ├ identifier "cat" (11:1─4)
│ ╰ arguments
│ ├ ( "(" (11:4─5)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:5─6)
│ │ ├ stringcontent "Sum:" (11:6─10)
│ │ ╰ " "\"" (11:10─11)
│ ├ comma "," (11:11─12)
│ ├ argument
│ │ ╰ identifier "sum" (11:13─16)
│ ├ comma "," (11:16─17)
│ ├ argument
│ │ ╰ string
│ │ ├ " "\"" (11:18─19)
│ │ ├ stringcontent
│ │ │ ╰ escapesequence "\\n" (11:19─21)
│ │ ╰ " "\"" (11:21─22)
│ ╰ ) ")" (11:22─23)
╰ call
├ identifier "cat" (12:1─4)
╰ arguments
├ ( "(" (12:4─5)
├ argument
│ ╰ string
│ ├ " "\"" (12:5─6)
│ ├ stringcontent "Product:" (12:6─14)
│ ╰ " "\"" (12:14─15)
├ comma "," (12:15─16)
├ argument
│ ╰ identifier "product" (12:17─24)
├ comma "," (12:24─25)
├ argument
│ ╰ string
│ ├ " "\"" (12:26─27)
│ ├ stringcontent
│ │ ╰ escapesequence "\\n" (12:27─29)
│ ╰ " "\"" (12:29─30)
╰ ) ")" (12:30─31)
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.
You can run any query supported by flowR using the :query command.
For example, to obtain the shapes of all data frames in a given piece of code, you can run:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.8.5, R grammar v14 (tree-sitter engine)
R> :query @df-shape "x <- data.frame(a = 1:10, b = 1:10)\ny <- x$a"Output
Query: df-shape (1 ms)
╰ 12: (colnames: [{"a", "b"}, {}], cols: [2, 2], rows: [10, 10])
╰ 0: (colnames: [{"a", "b"}, {}], cols: [2, 2], rows: [10, 10])
All queries together required ≈3 ms (1ms accuracy, total 4 ms)
Retrieve the shapes of all data frames in the given code.
To run the linter on a file, you can use (in this example, we just issue the dead-code linter on a small piece of code):
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.8.5, R grammar v14 (tree-sitter engine)
R> :query @linter rules:dead-code "if(FALSE) x <- 2"Output
Query: linter (1 ms)
╰ Dead Code (dead-code):
╰ certain:
╰ Code at 1.11-16
╰ Metadata: consideredNodes: 7, searchTimeMs: 1, processTimeMs: 0
All queries together required ≈1 ms (1ms accuracy, total 5 ms)
Run the linter on the given code, with only the dead-code rule enabled.
For more information on the available queries, please check out the Query API.
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.
LoadingsequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: helloAfter launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server(🐳️), simply connecting should present you with ahellomessage, 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.8.5", "r": "4.5.0", "engine": "r-shell" } }There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. 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).
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate ServerThe 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 query 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 thefiletokenfield. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
contentfield to directly pass the file's content or afilepathfield which contains the path to the file (this path must be accessible for the server to be useful). If you add theidfield, the answer will use the sameidso 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-analysisMessageNote: 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.8.5", "r": "4.5.0", "engine": "r-shell" } } -
request-file-analysis(request)Show Details
Let's 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
resultsfield 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 theinfofield and the Normalized AST wiki page). -
dataflow: especially important is thegraphfield 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":{"files":[{"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\"]","filePath":"/tmp/tmp-8371-DrRwGMTVFE0r-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8371-DrRwGMTVFE0r-.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-8371-DrRwGMTVFE0r-.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-8371-DrRwGMTVFE0r-.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-8371-DrRwGMTVFE0r-.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-8371-DrRwGMTVFE0r-.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-8371-DrRwGMTVFE0r-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8371-DrRwGMTVFE0r-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8371-DrRwGMTVFE0r-.R"}],"info":{"id":7}},".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":3107,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"fcall","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":65}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],"hooks":[],".meta":{"timing":1}}}} -
The complete round-trip took 9.1 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.8.5", "r": "4.5.0", "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\":\"text\",\"content\":\"x <-\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.8.5%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22text%22%2C%22content%22%3A%22x%20%3C%2D%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A128%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A221%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A182%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A104%3A19%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A192%3A25%29%0A%20%20%20%20at%20async%20FlowrAnalyzerCache.runTapeUntil%20%28%3C%3E%2Fsrc%2Fproject%2Fcache%2Fflowr%2Danalyzer%2Dcache.ts%3A93%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.sendFileAnalysisResponse%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A163%3A52%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.6 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: trueto 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.8.5", "r": "4.5.0", "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
cfgflag. However, additionally it contains acfgfield. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"files":[{"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,\"}\"]","filePath":"/tmp/tmp-8371-tPhuSzHDHSSO-.R"}],".meta":{"timing":2}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","index":2,"role":"if-other"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-var","index":0,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","index":1,"role":"for-vec"}},"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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.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-8371-tPhuSzHDHSSO-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-8371-tPhuSzHDHSSO-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8371-tPhuSzHDHSSO-.R"}],"info":{"id":33}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","type":4,"definedAt":7,"controlDependencies":[{"id":15,"when":true}],"value":[6]},{"nodeId":11,"name":"x","type":4,"definedAt":13,"controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":3236,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","type":4,"definedAt":7,"controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"value":[6]},{"nodeId":11,"name":"x","type":4,"definedAt":13,"controlDependencies":[{"id":15,"when":true},{"id":15,"when":false}],"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"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":"fcall","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"vdef","id":5,"controlDependencies":[{"id":15,"when":true}]}],[7,{"tag":"fcall","id":7,"name":"<-","onlyBuiltin":true,"controlDependencies":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"fcall","id":8,"name":"{","onlyBuiltin":true,"controlDependencies":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"vdef","id":11,"controlDependencies":[{"id":15,"when":false}]}],[13,{"tag":"fcall","id":13,"name":"<-","onlyBuiltin":true,"controlDependencies":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"fcall","id":14,"name":"{","onlyBuiltin":true,"controlDependencies":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"fcall","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"vdef","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"fcall","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"controlDependencies":[{"id":31,"when":true}]}],[25,{"tag":"fcall","id":25,"name":"print","onlyBuiltin":true,"controlDependencies":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"controlDependencies":[{"id":31,"when":true}]}],[29,{"tag":"fcall","id":29,"name":"print","onlyBuiltin":true,"controlDependencies":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"fcall","id":30,"name":"{","onlyBuiltin":true,"controlDependencies":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"fcall","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":65}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":65}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],"hooks":[],"cfgQuick":{"graph":{"rootVertices":[32,15,"15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-exit",24,23,"24-exit",26,29,"29-exit",28,27,"28-exit","30-exit","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["2-exit"],"end":["15-exit"]}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":[16]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":[22],"end":["25-exit"]}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":[24],"end":["24-exit"]}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":[26],"end":["29-exit"]}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],[8,[["2-exit",{"label":1,"when":"TRUE","caused":15}]]],[14,[["2-exit",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],[23,[[24,{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[[22,{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],[30,[[16,{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[[16,{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["32-exit"],"entryPoints":[32]},".meta":{"timing":1}}}}
The complete round-trip took 8.1 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.8.5", "r": "4.5.0", "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> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"vdef\" <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> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"fcall\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<http://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 6.8 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.8.5", "r": "4.5.0", "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":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠڀ■㚑䤦檲ⲐŒ≎ĸó⻀ᬵǸ吠拀ຨ㠠禥Ꮚᐰᨀ㢦瀠‣怫₱⧠ᝪ劭⨡䲂ƴŔƄ¤Ȅ�Ƞ峀˙憮牲凃㮓✾㸢䉧溔㤦⫋㗈L⨠ጳ౬怪ဣࠠ吡稠䄽ຠበเβ嫹籡㉮唦㴵᱀૦ᗨˈâ፼仂晀吮㥳䰚呕睎⽟аⱊᔁ甥⏈兕ਦᬧ䲛敔Ⲱͳ敫玱畖Դ㎿Ⲏ㔊瀍吮❔ٕ垤柺㹃㻲䒦椾†犍倅㦩嬻䛈声←厯⩔ⵖ䏁᭸崹䰸㥍憅䱩玭ᯄ偬ₔଠH₶\"晠ȉᘠ᛬φᥒ#䧄えᤥ$砠噴桵ᆀz7䀭ဣ沄=$儠Þ攨匀䬤ҥŌ㑝ᚠČ�ሢ䉵ᕴ࠰檵℔炭̴შࠢƢⱚ䠲戅䃮䠾ⵅ彎#ౝ⭩ᶣ慠刉㯝役ཌྷ䓦氬ڢ䬭㌺༊፣䪆ౢ䄀䍬㘉笝祱䒎䂙ጸѨ情僥ᖿᜰ悺䨵⩐䩮ࢺ噳ᴯὨ¬劬᧚濗姜ף⋋∌狦ⱇ抆枧�撎ࢴ㓀勯┣むᢙ∢㝛⨷ᕱ̱䑔ཽ伩ॉ㍎ߘ⫍Ղၖรₕ撡∰йげ๙☠撞採ⵃⱠ硄Цඌ߈䶔᤺た⳩ᤦ⼧奮ⷫ祡ⱋ䖉❊ᔫ▉‡樈孖挚㭒䛁桞淚睤Ƞ⠣梉༳暘⽋沈漪佣潧洘㭗樛㽜࠘Ċద䭣₻䃨᠈悻⼦ᣄሠ僔ᢡ哬Ἁ൳⠥烈៦ᛨ㥎⯨ժ⑊䕩⍈ᖅ▉ᎊ殰氩朡•櫚䂷⢉˓█坦▣㡠尶䋤ଓ氰ྉ⁏汢券ল㓄ڷ械ܤ䊪⮉䡹כ㠽栉⬄ᑇ༷⪛佫涘ផ擇曤ᓏ梈缵ᘥⵢĴᢋ▥⳼ᱫ烺ⱦᳲጄ⤗ᕥ㳺ᡆ儝掄栈焤ឺⰹࡻஅ⦊疁柤歚攠ᭆ斈壙滥㹣䧁筆ᑛፋ婘❉捚墮枠ນ䳛䊢埧眧句絨㲆᪱䒻氭ᝋ℘笙ᆣ從塗Ⴀ᷃咨印盛ሡ瓘Ⴅᢦ姗⚫ᶧⳀᔹ曦⃗ᴒᜄ㴊ḅ棫ℤ㻰क壀㑓冎፶礞ᡇԆ婅媩ᱏ䅁䷵擷斮ᒡ峅燄าਐ㱬甈ᬤೊ㜬槓ᖉ槉巕ᨛὗࣇᙦ峪ᨄ梿ᯯ粴撷䜰嘶㒨娡⌚⌴䁘嘠ዏ㐎勭䖊㌌宷犤摶秲唣䪴刣㚊孵䡬烷◴୍ሁパᗔ㭆竕㎮㘃ဧৱ帯䛫㎧ⷹ完娛㣗娇㗯圊㪅咣㟧皬ໂ憢䠫⠛憷⺬嗣⟵ᓎ摖ၦ祗᯦㫼䀧ᇽ姇㋔帎㑪弸㛳ዣૈ湩⦆㑤奮翞㧕圏⠜獽ၦ౷啭ⷊ▍៷䶨ʰÖ'㪚ඤᨯ懔࠸㔒䜠⠤ᓫᑓ⍒硕ց婴ᓨNȫ慍畲壞䉃仕兪⸭圫゠ঋ乄ᴈ摕⣅۠፞p唭卺দ≡皨ύ⡽Ő䝉㒵倠ᯐ䇸̄⠵⋔㋦ᆈйڣ⧡吢䌭䅠ڰ♰ࠜ倱࣠Ӿ巔␛㛘烸☤墜喨䍦ᅨ楣⨉ᛰ社̀ࠧ呓͐ম憜ᝠəʭҢ刦玸斩䡃①伽爂亪ᗯڤ◔┲ห䁜ຢ䁧⤲⥅⢢Ϧ刯䑽៷磋₲ᆹḳ㥈厂⌡⒂D䘢ⓟ◨㪱戉ဤ擫ኒヱ≱⠄䪠碨ר抰慨ٲ•厤⑇⪖⑤罭摱䩄र樑ᩅⵌ䆶Ⲅⷅ֔糫瓈䥹↾爍Ჰ䚭㡄䨣ቘ昘䁪ऀ䴩庸夣ᆒ绺玎㻆᪓▌強ᳫ䮠侺䨛ᆲ籬ሶ㛇幵撥᳢ⷭ乨勬ၿᰃᝪ㊆⨆枼剈恏䤠㖳离ᶉ屛㍲ᄵ恒ᒢ术ʷ䪥屷֪s杔ᰲ䔴䪓参恭䴇䧉▾◌叡磐䩖ㅄ䦒哇䕁⻅λ▜圓˛䄹㦴օ፠Чٸ⯙㑰禵ᝓ狒ఙ㥂ଦ喊䷭Ⳙ䩠徾ᖍᛊ曍㡍⾄楯⑊䭏⫴睕ᕼᦩ甶႕㓅畯ᖂ摭笟ⳕ疿ㆥࠒ‼ᨣ㧵斋唺戧䜅⊅ὸ尻ᣐ檮ㅂ⎃沈ᛤ欥擿三偳焵წݠᎊᔦ祮狼棍垳ⶕ傺ӊ櫃弲浹�綍䬒梥⎸ᴡ弫焫ᭆ❕⩾㟖憎㩔喭⧶ⷽᩚਠ㫬䉂奓㙜崋㛨䧽壍䴈අㆲ䪒崒刴̺ၷ悑庈↞䚛ᵄ㬉㿄瞜ᜇ⎎㨳䁝榲淧凛ᅞ䉷ࡩ倵瑡ญ條⟹剏塰濔䬘庥劗瑊暗䊹恘㸚寪⧐䟯☭惲䘧廧楱䬦䎖Ʀዢ䛟㶔羂ȱ籈Jᄿ溲秹ਜ㥧៓梈焭椒๑猻䁶ᰔㅑ揁忳粞ઉl䃦ឡ圼樑ᶣ䥐䍨ョ俚᩸癗瓪䲩罬樘⠠㵍ᨳ囱Нᤆښ䞬普䴊ྐྵ䊽䜗ồ獵屒0䔇₈稭㡎ဤⲙ冸㺉ῃᑔ掞㣆搾ᚢ痭挈䀧牥亹䖼屋Ӓ瑲㊇⦞♒澩䬖ⶑ慻燑ᰣ㍨፱㩧⪑Ƙ祯⃤䱵垹◙Ὣ壳毣姦ૌ㠁•秆棍䃩ⶑ泽箞廝ⓕ⯣㢡᮶涕㬒濢塻䶵ą㛝匫㙦䝈癶烬ܚ澙畹พ氂毗孖㜶玞ਠ྾㟂猎幯澵嫽凁孓ⷞ䏑堮ඁ⪞縵溕篿䏀㾣篚ߞ㸮ᚙ瞪㬜ᾝ燽㗝潛㿕歿㲖⇢箎砿ጌ䶣盾搒㷧矔析硯➘侼睬ᕴ䁳彾叴㤧㪑䜬缛ᕢ亐抌厏ḅ䠠r᳘␁ᶫ֓㮾㚯䌍ᝑ翯㈊川䫜Ⱈ⮷ᩨ均ㅓᴃ垵杏ฉ平唼◁㨓ី㽎✙乵緽ฏົ兞ᇫ㦓⹗盎༖亽曎掐㻻據瘈綷㦔㓞燯缘堞牆ᐁ勻罟⯧㲛涛Ⱂ璾Ἒ澫縵碹帐檘巎壏㮚客縿稅湅仞搛渑㱍᚛吗盖佽㷿∎眓玌寿刯给旡羥砠®▘༪坞䐆乖纼∖攚爅禿㠫Ῡ֡斲彎嫞䨛淯戛ᘵ粏㘒癎籲纯擜砞絿禃澣縰泪㑇瘔栈䝸婿䠜㡢䝪塝咜ည眰Ӗణ儂䵸ܟ噼琋ᑫ䡏宽彔еᰣΉ坨窏嬣栽彅笰烌㐸øᲐᠸ嬥⥰⚢㠁Ĕ㭛娢የ惺ڰ╕᰻ᜨशა琾侞䰐ⴡȷ䂭㡧䨍ဂqި™䝇ᄊ⏢呐ᠦ瑄䒼䀳䭵߈㦣砵Ⴂ竦坢〤㊖童䓢㠯Շ揲Ḕᨲ佞磷希㘷ㄝ٨㧝氷琷ސ䳣ᝃ䮘⍰嘱䶗࠺ᤝᨵ枚ӆ䱂渲ᾕ禃䙢ㄽ惃䣤㸵皩ب䐧匢⤱xㄇ䱜砆悤䛛嵃 啲䟢倴䐮ు֕䫃瀣⢩פ㼝䔱ᚚ䖦ɐ禖䓴⚜㐿(抄㿜᠏棭⋤⧜债棟⍰㲐̶⣤ڬ⏰椱⒑Ԭ⧣㑫Ϩ㽃䐁ᤘ䔋兂⬽⒄䛜厃ȳό祠ႂี僋㤏匃ᴳ壵穠㾃'䟬⤅漵㣹㡠ᚃ㔾筟䔹ਃ㠂碶䐼㗼䂹磷䥢⯜ⱈ㑲П䠭㽸夦إࢿ⼡㣐₣刺瞔⑂㨳ᅀⓩ炤㢰ⶡ⩄▽剃䈺䨪⚥ূ笾Ӣ箠䩱ᒵ棨䫒⋈⨷lŭલᜌܒ⒙瀲Ҽ☸Ⲝ搮䅞⟠㳢㨲ᓉ僯嘭ڦ䀴\"㠢⪶唑䘴ア㈹䲃⋊㵲✹ण┺㙽䢨㑰悊❍ᚽ㓦✊⼲ዧ㓂⠔䗳烂江秌㔲㦉璽▢⣂ႱᙟⒺ㿄纱瓉⌺ʠⰣ㓎㩓纺惝⛛幒ㆺˆ㙽ằࡸ摊孓䓃ރ当榿䳞䔧s7㣅筥DzƼ䲩㍰⋒Ჿ楆曫䍰垫䴈䙲夜墻但☦ボᶻ洙░墓㌃Ŕ˯䩥ᖲ䔍֑劓厰䁚敆⧲纨岹擖ㄠ᮰䂘⩠ᷱ䮽甙摊徒殠⳩⚘ⲡ➼峍松㙽垶䳃杶╔྾㲯լ⬒溦屔曾Ⱂ瀣磾噱↣[૮㜃ం䴺ᬡ㐪澹ᣀ枯䠪⁶ˍ条㤫㌇䱹⍔䯒䝉䌌ᓎヒ劷扜ᚩᗳࠢ⌓拫偘ⅦႼᛜ媪倫⊢ᑾ␒籠拆ᖎ㶫嚿⌡⏵᫈畚ᙤ垫⛉畡ᝑ㸒ࡶ‱᠑㳴摳ኧ⤛ު〣䂸⡒⨓ၴ㥾ᘢ嬄灺磸殉␄㻮䳣ᗉ㠂⩹瓑ܨ絋拫ᗖ᪐ቿˢ秹㉒噸狍曙㣱湾㋌ᕞ冫皱匌䓢╪屷匆㑋繱拱摊垪慼匕ᆪᤳ㢺▕垫ᬲ䬐嘮㉊䥽ごˣᙊ⧉䬄嘵㙼倧剤┥⩂䝉⪴ᄅ⇓搅⫒៵コ烈㑀慠尫楾筮啪ᯊ綰⤚旎ⲡ絸ᬂ唼岊呲屧ᓵ㚲嚷穇᠉㬽ୱ狩埱㚊ᚻ㩆䄼⛫愃摽喌㤂䍲璑惑А搣䑂⏊䄲堫o₥ࡑ槤笖┨塠ᠪ煞Ꮭ㴑⹌⨹ݸᄊ签䳠㔽㴂撳䐬戣ߊ夻⫷䩣㓣僺㬇䛎⣒㈰䛬揮ᵒژ⤨᱑ᒿᫎ尃㋡沾ᒣ٩▲ɾ播嚒㪻Ⅶ䣜抆ఢ䓾笣≃Ⱳ唏泧◃Ⓜ䳿操染㦻⚨䪰ঊᙰ⠪乽惣⡲㦋拑㑠ɺ勳㴒㟘㧪祰囅㚲䓪⩹囩㚲嫣⁅圉㛓㙌竼囦嚭⾩曽囍擻㞐ᵸ囉⭞ᾊ௫ᒇ㙜⮻䍺䛂ᒲ巺ک棺㠔䷺ự⪡囘♻欵ᾐ甘㋻㳱ᙎ呧㔪ㇴ࣊ᛧ㉚㺵捄盋㧃㥺嬔皑㙛烋㑴Ꮙⵋ・⒲眹㤻₳盫昑ವ峦疆ⳑ䚫㸬眾╔䠎溳唇ₒ䵶‾璗⮓䏼僒╾ᗥ᷼糍ᘺચ㗱ᓪ㐹⺛牲弋ࠊᾊ㘷㖏㵒导墢囅㳼喹勳䖵⽂廻墾㜛⭋敾䳻砎բỳ癤呑俰庪㟋㬽濰欔期㷊撵㒯⫛㑫寿⼋↠絓䁝�朰ᣳ⛳䭐Ϡ簧Ȿ4࿆㤧檿՞⌚௳旻ᛎᬀ栵⡕ዞጰ瀜宱∛擓₦凵捐ʓ㻼埲ᬘ瘚ᆧᑔ�澢⡠ᬛܿ⺒㏺礨ਐ戥䂹㺴㘱∧≐䔞න㙧䐯ᇝ敪〪ᷰ౦ᖠᬃɑ̀噤䰡⩔挭ව୧⼣磧♙䇣࿈獦䬶┎i䘚穟楇ู妊ᅽ䞗ຐ濢嶃燹㣡ưဣ潚ງⅴ䅟㒛功⭳შ䲤沪॔汝斨ⶐ䟵⽁ໟ㿄怦䧔ኘ潚㈻䧍⤵澌⨔仫䷑ᒄ䆀羋啔ౚ䲀晇㧸Ởቔ盇畟纨ô秇塖⓰᠀杧㵼Ñੰ翛埱ǁ䶱⚇烎ᱦ␍ↇ兙᧶༛㦆䥘娘⨊Ԡࡖৎ甼䞇䚺榡畻⯰檼㧎഼發!僀°岎නᏙ䏬亊㎈ᦙ夶㺞亠□䔿㗟䁌ઝ區ȥ翭䣂ଠ姡球䓑ͤᮥ疖嚎嶈ᰄቍᯋ䐈峐₷㚟㖾溁咬壌䍾䍂䎬ፁ䉍拗梖䍑䆵榙奼᳅絍㯺䰛ḱ煇ᭉ熥矅窅妌䦐⎂®㊗⍯ ヌ㬢⎤夠㫈怮僐ឡ⇀琿碐֨⻬㩞⚱䗔㨫棰㣎䓂憙▛ᣞক䶃Ⳬଠᢑ⟆䯱ऩ淌濤擼Őਣ戦́䐦㛳彭款嫔嬲塀㪕̹ᄆᶓ疄⪩叏慠愁寕杏㊑Ñ姕䒌凥殞崕僐綛䈹堭䞁Ώ䔑ĭ澳ㇹ᭮彬妌⎃榑忺媤厞㵀佭篎㎛氆⇭玍玛ᠥ夠ᆎ䎖᪕彍椔殆㹕岙浄怴㭕檍翍㶞㤆旕⺎析棽帍䦏畒㭼ᢽ綎既⋻嬽坺瞐㮭塤伢ឋᮍ壴ᨏ玓⻡對癚ྕ᭻䢝念䥌惃忕凩徏㭳奝毌㮉㯡昕耎Ά箥幍憙㾐㭼Უ喍䥇ℏ塭殮ှ߿幝曱⾎㬷宠ؿបݝ弣沈儊ޅᶫᄾ愀删Ͱ⇨晋嗶⩝∄䝭䪛恝㜋⒐狛ɞ揝ྨ纋⹖爙ྦⵧㅽ娸筋槹㛼瘨᧹dz嶏㛛䡮绫ៗ㷓⅝ᾶ⚰痈ㅘ㞤佛㧸楜廫㞧嗼៖亘璺孮ጲ,槤坳⥛㑞㈌保㢇汞ᨎင瘧㯹䡽侴牧᳔ؔ㛩០ረ缋摂管倌堦䐦䮰⩠ᜃᦕ㜠絾䦅્ཋ䕻䃘㭵㪤൹⃘ㄧǮဥ੧炄੭т纑桞偸࿎ⳏঠƈ猼ㆌ⻘㌷牾ರ≇㽌緻㍦㣘◬²票ᓙ櫴ĕㄚͿ嘖ஷ數ᘚ坕㉷佣烙⺭ॷ櫛⢛儊疷ᄄ㘆౺耕ኪ෨滘㯷懝湹ቀⴠ啭僭༨ナߚ䀳湆㣧勧䗧濦粷偝◬濲睗䳘祮⺵㾷㕺ᗶ坖禔淝䂵⺅࿗⏀㥧䫱瓷杣ḁ㷾稗Լ㷲后礗緍搞䎞碷�称ᾆ畡゙嵲潁炢嗙䏦潞䠈⏭⸮皯۟Ṇẕ壵ᐚ㍩祱碀ฌಘ㰯ᐟ潆砯槙吜溮焯㳚㐔ῶ痎㋘現澊珯壁ḓ⼥綮⦛ᆉ弗ዸ派㦏ᰒṐṒ矤כ䫣ỵ狋ඞᗶ忭悯州⏾幽熯叞ᯱ✍禣㮘尜バ圠滊䘞䝍紿䇉ɣ庵睯䗘⬃ṝ硷䶝ᗯ底耏溜ࠁ廑爿垓ܴ㽐䅕惘モ㽋筎渡䀸㢢⿕ܚ㠆皷➜ᬘỽ狗依䏻ầ受亙␁濱籿Ɵᷤ奻穉ᯪ烬羻綋緊䓧㼽稯枚ḕ䅉⦀峇䑁冖奥曄櫆冲ಈ䙈ś䓴Ḍ珡第䗳糗⢞柷従痗級琊ẫ矯愚俿偷羝䒹⡣≑यᑣ䧮由�绉碏戅ᒥ濿㾚岯睡ዠ君倇䁙⺟ৠΟ⡰砕㯣ᾗ㶹燯举⿂縂ᾠ㹧㤧撏ဝ劲N㾊簵✠㈡䪫洯殼㼝ᐊᐢℕ另þࢱ⇿䘠㸘ဍ᱒Ň禿毂ខᠮ忾畠䆙䕷俞⠘ࠍ埐绚稷楠䔝䠥其Јฃ䅴丧斯ᦴ僜Ƨ滠戡Ꭵᡌ簴㡳爀㥾堤а䁨䅇䌿檠䒢᠖䡛ù̐ࡰ㈞㗛 ₛỊз戟ڢ怖偐幫ϫ琮䆡ᓱ∱ྐྵቪᬽ⠓✕熥ॠ䬦禌ଏ䗾弧嘄傋Ṋك曀档搗ф强ύ卨⏴ᢧ琲䴲∉Ӏ⌢⭄၁Ժᄝ嗈ሲሤ嚥䐃⺶∋算潯ģਯ硙⃜綢ྟ䲞庘〯架䄵Ҡǰ獣崮塋㤥䋚ઠශ离…桤幙㎮א佣䨔矿傷㴀ర㡡␦倪灺Ʋٿ斠丢爯忳ὂȢి侨㠚䠏埑溅ٯ椰绣䬪烯ㄕ䈲ࡉᎂ涧䰺ѡ憬㨔ᯠ䃢繤㡈⃤̯瓘┡殤㰵㾷䇗篨᯿ᾢⴖ篵羑䉞ട媁瀙䎉ざ憢桲ǐ奄䖧昧ノᢉࣨ⁼桧永ᡣ纙Ҭၰ壢䔩ђィ㷞මボ٥䣄ᑬ粋䂒挗㴬䰃ਜ਼䄌䉵盤㶱層怏ߛ愴ڴᱨ䑣㇀ṹ䭸䋞ᚴ㫢濣Ἧඤ刁᧴ႈ矀㊮ᱎ⣁䊑เ㘁㈧摷戊䞴⨰ͤᩌ䕗⍓ݔ⚜朳挩䃌⏢樠礌纪到ᢪ⇤嘈⤁ᡤ爿ᑶ㸼䘂䅃⪪䱆ㄌ㵕ବ⁑⃧⯉嶶ㄱ䔂擅᥅傅፣∦䵷Ɓ䎥堋册䑆ᣈ恢䐖牂ワ䋈ঔ㣢䬿纷ㄬ殥戴⎝筳勰㢻ʃ㈁䈧簉撞ᅍ䘲ᘰ珂㼭䚸㤈䵚瀼╆㉨溇偉ႆҦᗶ✃宮ⱚ夈㻑枦䘳᱿廍䔲Ẹ皢级湇僎ిḴ渠紣岑儧䜘祂䞫塍έ抾઼⥑判唾偺凗䗬ᐘ搂㪮繝碷挦お䕖欧䰾瑆䛟䕢ᙘ䀳㤨㙖棢䋏∩ቦ㔴䊙ᆻ媱ᰨ烩掠䂬ࣽ揾曂〈奻䊜㈇䝮Ჸ洃⦫牁㢡⎃₂☩媥扢थᅄ႘嗜᪗䥑ፁં⬩㸤✼ᢃ㆖䖡ተ媃䑮掦┟䎀䲩୩滛層䢍ি䖒濲↳㉬摞⒳抐䮂₦㢾ʚ䤺䚉Ἰᤲ㩭᥅擪ᏼ₄㱩緋㲾㉳ᆶ◦ᶈ䋂硪牀䓎ኽಢぱ䏀精䲿䥂✬䘈懃ㅯᡉᔏↂ京⛑燦¹Პ⇖❖Ḵ䎳屪䕖ᩔ劙ê⮦㋄粳禪⦔⛥䭞ٲ羭䩇往厐䦘㼩爥હ੦䥒ࡕ၄喼岃畁ᔗই斿ࣩ殚异䵈榬⑹ᖴ䬳奉⣰ታଊ㷑䗧⧘ㅭᙔ枳惒ൂ⒧᳄䬋ᒉ䛆シᩢ䥙╉ᨴ昃ᵫ⥘咾卽敚⮉缪幬窐榄悸᭴熳塌瓙䫒㖩恅ᚷ㊁⨗➕ᔄ籬彩㵋噟化似ហ▹ᆺᲀᥡ▾ሬ厂漩ⵂೕ厘仧ᄹᗥ岱ひ᧪⣠㣳ቩ৫䚕щ倒⸬晆⺽㊆᥊┃ᤈ幒掶䳰慼䰲⑊犄禷媓䐳妨⥬凳哯ᑵ⍾䴥䱜㴉揧冴ɾ⧀搵ប筓ᨬ獑ᅉ㍥䶦ⶺⶄ斿劜慨ᝨ哃ᩖ᭓ᔙ㌋ㅑ文ㆿ㊎ᨊ旾ᙠᨲ♗᭜䓓㏊භऐറ༡Ḹ姨䬽㟒倥筘䀹刢䭦⫹峄涵䚝兜䗖ᤌ峣䇭ݗ䲡刵♮⪐ㄅ皽ࢌ傏䔮Ⴟẓ⣬孅咬㊵䶮㕩㖇礱噹㸥柯⧷ⶓ瞰⟡澚⃯۴ӹ៩ᮻ㐫㦊ࡺ᭸䦓囮⥃咧∳䫎⧹㹀玼溋㦄⡯ᗼ唓ሔ堶⡡ࡀ͜ᄉĄ▱湴㹫擏᯼癳䳫䴛㍋䨂㫙ঀ玵庖⓳摇溜䇒柮急⦜獗䯞ヲḇ暺㤧枣ᒜ䥳夅彌楫猿䰞㑱栢䖅♭廠ঊĕᆓ羪㍘ഝ犧侮✑䟆ᭁŹ嚉晀⊢啭熣籿洊ⓠ⧰䬥燣䎰暀⥱杽Ỵ塳⫩མ糑獉拴Ⴅᶄⱀⅵᄥᆠ२㜜耗ᡕ䌖ଲ㊡㧉噤㩧ি数帜公汈刯罻旤⸩嶑ʲᰄम֢䩪ᢡᡢჄ砲ఛ亮゙䅴ᥐૈ圠⪓孪籨挆✲㕘毠䁾ᙾռㅸ咬್㍮䌍ତㄙᄵၷ瑃䕖ᖱ⠂䒱䄰ᒴ塓籓Ҭ䩺緊䉺ⱉ䈱ᛰ䌜䰪୩㍞̋搇റ㼲⁰找♹缑ᐪ榲硪㥊ܸ惔䌈䶲ⶪ䩻憅兺ᖰ冘傫ᑏ棃墢㏪⪀⽡㐵Ҳ榉▉ख⣂䨔䢖⌆兔⮑㛅癆㱼ᆃ☋♄⏲䌪㦀㒥ऀ䄜⊉攵妀旈̬壄䷃摍嵏⋔䪜⭀ᶅ妵㣬㥧榰Ɉ䮂嬓癉ṷ卨੍亡⠹⒵恻兢ԧᐸ媜巫⡍ᣚᝏ䭐⡑妅倶⚴㤪瀠囫ာ殫孉㌚䰖⩂␅㽢䅵᱖䦜旟✤㉊ۨ㉎≶⥔⤄ⱶੰ䥳斏攈埒寫烊㓆™⭂⮪ㄈ汴偎⾮ᕠ囌嬒⎜ⶡ狮⳧䨵侑☵熴禅ᖦ្孓⍋ⷳ«u玐⸥㘄Ⱓ䕶ᢵ▝撬叒嵪糋䋑擡⮣ᓅᰤ祶䟅啤唶䯲ರడ櫆☽峣䴭⹕㊶≷㥺ᦞ⦖摬偊哫⼀㈨檳⫺⨙㉄䱜禧焺᮪堃爗䘯欋⭨ⲅょ祱╳嗇晻戺碝䇈৽抈䌣ʴԠ峢⻆㖔⺶竆庺娡ᧈ㳏䋈⫺䥵㉕㕴Ằ䕵牙唦䆋痯䘷᪬欻侬ᕶ漄⤢′ҹ䌰ᓠ堵嫶狷ـᏕ翠筲၈㕕ឦ垊岓⥎䛟类⿴႕澽涏㔩堖哚媤䏉ໍ㬑氇丼䬅⥴奴ൣၝ䭘儼摊坪他油欨併♕瘺⸈㶟禇啾ల烨劦Hࢴጊ䣕尕භथ妕痰嚶勌禋შ櫏桏檶ৈ㷅垰想絡契௲掽㒱⇋ᴐ⩼⬅ⱕ偔⍾Ιᔯ埮冲垊♍㵘䥵橌⬒㮥〢攣䲶㖱፨唳㴺Ꮚ⫟܉橋休㋕㹃ᣲোඑ⛱嫦䟅照䘡䜓ɐԳ㋠ٖ⦛吱徊咋䒉Ὕ佉᪄欁剭梤獌哌҈㘧ᧉẻ瓨棒ᳩ橘淝⮭䦴䣸沮漄㖕䳭ࠁ咊稧䁒⌡⯑㩵佴峸᧤吨寪妊䒈囊ےDz㖓┵硖㳽怸柤ᙆ奪嘮䧍䜂欶低ⶹ湗˾ԩ䇺㕄斶旜㪏צ媬檺Ө䋗獼⭲ⵀ㑉姦婺嚍⧊祒婟Ë㌦䛔⫽妱儐♪哂幋⽆愳囪嬗侞╅篵˸絨ⴽ㗹弖ὺ事ܫ回䪼疻₍堵ۺ禌畊㓰壖碜ۮᨸ條䩙ލ潗øᮉᗐ嘥夦壺籤᷄犦֖毺㬍磢厎っ涶ɞ擴岻䦎ⓕ㚱婎滓⿰៖ᾅ憠ᵏ場䏖沌࿃嘮㕟櫘挧㨠潈ឮ䟇ᕥ啵劶䠓䪍ා盒Ɓ梧ℽ㉋ㇿޕ䪴˘⚨箉峇䆂㮍ɣ⦍枴囶╺洸矵喖敛┉巂亲㯉橇㸠㝣㌦❧丝ᄍ差祓ڢᷔ朙᭱渻≉ຄ桸ចᓢ癭嬶Ⳛ㴉眃ौẵ䙔坹〺瘲僊漓䮍ᷕ⬓寅殸➍疕̯坶父看喎摪㽐烚ລ⦇撱㸍䕶㻲禝ᵟ㖻塾⯚㱊湿滹◺㠕ᄊྃᇤᖫ娎嵚枈㏗盆㯡ぷ❌䤖旭Ჸ䊮㗙嶒罛ࠠ柔ᡌ篐泝㜭㍗⫱㎍ⶮ嚃埤㺛؋䇃欞䢋檓㦙劉秲㶍䫌ᅌ呾璚埉᷃抠娳渗⃪༔右⚐縗㞿歈㐡噋す溾ч檿⣘Ζ德獸൪㑡塞癙測俓≥窍澿➝盁燀儸傕᧖ರఱ⸉痓䦃筯梠ᴝጻᥬ㵈疝帎哛৩㉦绐ï棟ⶽ⎰倥罯累璝အ揁㠏浴Ƴ篟殎㙭ྔ念瞜㵞璟嬺怿♵Ȉ䰠漝䀋䰱䃹綟櫠㢎浛䜏矉DZ犳仠縄䱩㢏䃮Πᠴ䝡牠ቃệᲸᦀ暽ት篸⍠編ྃ䇡氭栺傓䇃章ᯑ丠挷㏼㵵縝ዀㅁ咦帉ᧇ廃㪘㓽縬摏ღ䚲ಯ庼业㧕Ț₠᳟さ㤬濲ヽ緟畈㔞䪦⢎笗穈ᴟⰣ⬯濷僪㓦ຸ㟔瞦淫悒懖惘ㅭ✮嚹儋岞න┱墦⠏㢗ǹ簟氨纣䱫巼℗О㜐㹡甫ᐻ㢀䇢▤ᯨ敃Ⱝੜ惰䌡ິ㧡匛ै撕㻐䘽䦐攣播䩙䗑ᦞ㉱䨛⨱堠祶أ⥒㕈ᰗ㩛椐⍜嗴㦆斚䨍ₘ㇈授ᨸ懄ᆮ扜䡚崰勑畧㺋ಔᆩ䜇⪸涃嶗≟壣ϣራ吠妦̽ᲂñ㰌᷈箃ଖ癓ឃɷฟ嬒◦扁䷊⡫䢯⼋㳣渺㹛猦捇ߢẐ剃䒢屝悬ϱ࿘⟡售㉞僿έട‑婸㙒粗熓喻狷ㄠ㾪栉⮉慮Ѽᘩ䩂Ⴚ䡊ਏˑ渳窭㾸㦓常俗抅㵆瞑ɔᜅ絹ᰤ玞恮ᄺ႒ሂ߀ᩩ巣撽䟔䇌䞼᧨梒癮擧剡㽖浅㐐廛庲簘䂳偯燇擭憾ݢㅩ淦㖊磎嚺ଵᭂ䓳涸峿䖥匼䱘ᛉ䉃丫ࡍ愞➎র㌱慮᱓多涓٪㖓׆Ẳʠ燌⛐²Ã∬¿䓽厤亊㤉盆撽㪞ǘ穭桤米绻絒ആ䷉亲ề⾉M䇺◓᪢啯怱೦吀䵚㏉僇熹ઞ䟲⺔娐䋭㝀ⴓᎢ㮐㻵㤰皈姘⎍ᤤ枳≭㕖䒀厑众啩䟇ഉ僋娏䩈淒巓፵ᰯღ䆃⧢匆⮽癭ᇐ曙瞳棯ݒ甎ƚ䲤ら䏊༻䱀ଅ曑嗜嶓秠咉竄=槎ㄙ䕀緲⏃盏ₗᲬ糓ᣬ䝔㳻吃俼㨉禬䮼㺄畮嵠嶜缒㐢獟椂㛙ᣋ⼙尧憿皅愂♋ᶬ耓櫯嵔̄猷䳡㵜䄷t㑼惲愺ᔬ猉ᑏ㥖䋰现丞ㄐ瘷|᪒ㆺ૨寏㚓䐡壒䂰ᓣㆂ㼠㇁㱸冄磊ភ᰼羓㩎ཐ拸球༁㢾䴫籼ও㬾᛬戂卤礹ㅕᾚ䭢ⴢ㟹甶ຽ≂▬⋐庲漃晏佒犺䰂ᯩ⦅䌇猫า㢑欘忒檐╯ᑒ唏㍅仁㿅䥇人ᦊ◸⚄孒砫䵧᳘狪懁㩔湆墺䖓ᷲ瑫⣬ᔄ䭐乲㠵娇䅸浖㺈圣淪熞㉪䚳㑟ᜆܵ㗼幆徻曲幜殃可凷ዼ戅〒澵䥶䕋ት᱾䝒װ⩅㿩櫷ŝ亞㢵砆㕸ẏ昔堕⡋㱍禀歷㬳᷵揈䭽㚝扝⃣䏘瑕㫥嫴Ꮞⷸ㼅棷ṻ榏㦴垜巴怫䳍彠ᨯ甍㙫⏷堕妖悁䴀婣帋䫍䛝⬍㽵淋㍺斞㗸槞堵䛠ᆉ䥁ӶᏐ濥㎉姶䥹纒㘋圸巚綝ࢬ㡎䂚㈰伸ᆳ㍋㈸塄悿嚱强耋⯍⭒㌃⮸湂㴬業⣏璲惊䱧䔩体⻒呂㇉ᮇ㙅旷ᖽᗳᝡ床烜亍স朂Ă濖⥨片㭸㋹㛱᤺摫犏䓐ۺ沣㞕噗䀒⮀প⋩ஶ晻埖敜徥၆䳋㕵䄇䥹禀⸃ᚥ姆捣㪌䩁㛹尟窻ㆄⳘቢ䪤檘┆毺縌ᾎ൲尬ѱ痙㲮櫖罿⮒䷡㙒帶杻ឌ㡇O寁沕汬炖绻ޛ涴眭⯲᥀ࢣ⫈䤋揙濿墈Ɨ⤺↛ᓈ皍奦烫䶎ᷝ圍ᯩ亏婽纗揍巃⁋姮矻䜚ᒯ嫆㰝涞෭竇㗸䶞巊㜻嵫⺋冎捤ỡ䙃漃㩽焖᭹3ᷝÅẛ㓛与ბթ歕泱㌽緗繿䞉淄栋‛➛姃៛眎篝渺嗥屗◺㾁ข暙幦抛ඍ⟖㻳㯮泗㍁⚗⿺υ綮䐿幨ᔐ絚ߚ⼄ܠ㥻㰕礖ᓹᾚ㖳期壞皳瘌悙Ꭸ爹涀産攥◸棵⌸ġມ畛⃢䱊∜ބ潧㿭昷⟹䶆㶱㠎嶗∾⢔ჭ嶤ᱰ牣氬ѝ箌咮瞿報泱ṡҖ继䬿淋㝣紶⡘㖍Ϛ晐㳮灧ᨮ炒ማ凾䂗㿣懊㢼抛㷿㞔㢄执反⒛⇽尔ᷨ簭匯৸ĕ䏲眬㾕⎫䴌Პȋ檵⮴㱽摩᧻㤊䐃༯弒挫夽Ǔ㶕䟭湿㖮榖㹜焄Ͽ㛂㰌㐽䢽哞爃ࢄḺ圳將篼䞚淃的㯊朋ԍ䊔刂⟯⨢ḥ媮楚└吐࿑㘬㶻ℎ䯓⨒ᙵ澎ィ乯晚ԟᐓ眴㨃㌧徎椄容瀔縣瑷穜ᗍ杈廩恇嫎Ǚ槢䞂侤疖榖祹䔜㏢嘲㽱篱罶礒䟂ắ㩹戯䟸夘ᐓ᭢䀞榇庾൶⪇㭻Ლ᷃牡㽔椦緑亾㨍☇⛮⚜ጔ朷⿔瞳穖՜崈叿㞾㿞眛䍵䆛ᩃ柃⛄甓紙呝ᤘ珼伆㰥毇䖼䆙עẢ罞ࠅഓ採㭫崺ㄜ㣏㺓勭ߨ怜窫囖ℇ召睩㵹糇硽䦞濃未⺡ృ䗋䩽䗢䮤囉㮉灇}榖䞁➬峏㟫笶嶂ྚ⮱伎樳䎽㳗秨埔彯㹋灏ዝ箙⮨⼯摵爇㋄篓昒揂Ჺ砃濮糹匁巿砉㼉捍殽䶑凯ံ巌紋目㷼㴑㋱━㨕棰ᕾ秛㜚埖幐痋䍏ໜ枟殼༦㵎穗瀼䬹ⱼឩ徖ᦋ歮㍝⎇緐潅漨楛Ⰾ叛汽杁渶礓決Ǹ⮆໖瞒淐玅栗粖嘌柁廀羋䙎㫛枚容《㸖泗ӽᛆ秶檨嶯㱋掎姞㜜ᮧ⽎檕悗᱿᱉㞊ૠ䜫秴垠ᛀ⯤㚱㸽獗㤏㎝箋㞱巗ホ嶋Ⳟ⼑㯧俉ⷩ⸇珼㥹䧧琕彺爻椏牙㜗ླ帖欗⋿ሡ緹瞤巴磎榗ᒠ䴙叉俳㢍殗ލ涞᷾瞳庇㠧屷滛䈃䮸㠌㩥ื၀恖帛筣岆祝眎揙朁凷瀓㧱甯絿儞ǬḦ́寯ᒞ刊槔溥㧣簛㱝ᾕϫ睷ᴯ㕧矇ⳛ刚⨄Ἓ嫬⸷ᠡԘᷱ枻弁焧伎瀈爓⭤禽繯犷䟉威啔㴲碠ܖಜ戒␌Ỡ粳憧籞瞛ᏻ㠔㵥娛缿⪘笐棢癀㳠ଠ⌍羓䭞李廹牨οǜ羉ϳ倆㺝炯乞䯒函佗竈笻緯ᩞးឯἾ㲂岐䧣䉁台ވǥ継亾♛樞箱潸竑綯罝攛జ⾿尵瞙䂾ᛋ泩柪漛幙䵏㯿Ε䯴佦㳩瞷榿ᒜ缕埃⹜䬯㐋❛ᒙ氘㯧ⶄ稧晿悜ᨍ䞢ẉᵓ泩烗毹吀⾝㾠祍㼙ុ䌑㟑劷ᴓ穧᭾ᾓ䰘瀉㓡猣榀殜ϕ䯵徶紅涐㚏㬛⒰笷㲍皃䐏妙ԗឩ怗㰎眏絼ཌྛ䒹浛具䌥◻㯘亦篋撏䬽Ἓ寱吆琣瀾篎Ⱅᜈ桁㯲ᱧߡ倀羼紗廾嘊㬅幂湅篗䒞㍒㣫筰淢焭挾ᯞ㈖ᶦ廦繓秏埞Ῑ⠞埿⳥灕啞崛ਕⰁ彑筙泝㽜弟小寋⼆磟煟ᐗ涣ൎ⚿㘫嶼⹚徺⁋瞗畎㐇㟆㹥篧獛喟Ⱛ徛垦翋礓懞烘尗俀漋妃筿࢞瘛䟲㴦罂㨛䗞柟擲簜䲉磫挿㮞䜓埳⾚罛瀧矞࢛ℱ玴溎➓撠擾笵ఌ㿶継犓䝮棘ⴄ架㼝峲ዑԞਓࠑ糧癯矾淸礏瞾ի竌⠿䩾樟吟彸紫环呟林搗⽨㼕砗⯞斗བྷ彁㺯淟甘ࠁ激纽禷㟟硞妖ᅎᎯữ滏槏琝濍ྰ㺧繡灿খḜ瀜筋ᴤ䃟抾䰜垳⥊」狅ᾟ䔗⠚翞㵗狥瑟⧿”毶䯠㬢狿⡍ᐙ寶彃羃礯帞⸙Ⱍ翂佷缆綏ᡅ睏悖䕿⠡ගኛ氐瀊罱ǔྜྷ㺰͞傎㎗攠㎷ᔾ㵽㒚〬⬁翾矝⾏纭綟箹ㇿ敷䃷㘜㛜㠤⠪ᬎ㗭柝佤纏ᶭ㧰फ洠⬟྾㔝䌛䠗怃㧶䂄⽂线岸ؐ࿀᱿䧷㞊ৠ㈩憓࠷௫惋Ú绣簻窏猿淟嗛®別༇㬅၂₃杔ࢪᅴቋ瞓⛾嚏Ɱ⭨稥㺖堈ᗶ忟ὸŗ綨ޅ㐡椳哠䳼⛭滚琮㠶廽栥၌盘॰䦊ՠ⚽忏ⶎ⯵㖙堗〶ᗮ恸᭭碞Ϝږ眡☀⁀䨤梣㝙磒㧯�弢ĪЀنソ枯叠樢撢⬪利㬈䡋悞㭖ਤ洬Գ㟨ᙽ䰗㟞ᘜ䲙搮态恖義È䆅ϛ塴ඹ䴰㳀䒞䑄ᴧ䯒␁另傛㭪眝緋娯猞潀⸠䈦ᲣࠥᏱఽ滼⏙ड䅾帚ۀኌ䦴ᗷẰ皥儦㘯嘦ₕ䄉䇖˗稟煂☀㾀淰䎣榰横尽塀᮰մʊ塾㮺ᅨᘀ☀皆۸ᘧ垕簊ࡕῘ⃓䆍Е፤ഘለ圀桁㝤弦䨭⁋炌ᄌ⸭ˌ؛煘ደ≀崖皢ࢧ㨪砻ש灹㭎䈐䐑ߴਘᖧ匟፡ィ儩ㄌ䅠ちჂ䇔䌚ר刈ᇻ垀奡ᙣ椤怭∸щₙ惬∇痹߲ൠ⏻估氮ↁҦ䔪⍤䑏灴愆䇼䈰҇璽捰≰瘆ᖣ⠫ᔬ羮塙ဣ傇犤䏕ڎㅄᯇ䲰燡奣ᒥį堳ºၾ儌⇈Ӎય殿喰羡䌝䈥ษ∲㑒ჽ㛮旂ߺကᄨ㹀珁ᘢ碧温ᬋ灒灰⡍䄶峅Ժஔᅨ⏰姁䢢₧䌯利ౙゑᥛ䄱䈮ֈ瓴ᳫ佧メ梣㦥ಖ䘷柶ᡠჳ⅜䎡Ѻၫ䪟ⓖ᪣֤㰩稸ⷰ䡴㽷∟ͥ㮶ྴᳯ兰厁洝⧚唪栊ⱺ䐺䅜䆲֦ൠ♘ⵀ䘞ዣ涤㖗䘱ⱜ桭ჩ憥ȧծै㍐痡ɢᎥ൲渺痮䢑セ㹒䌃ݩ猌᰿幫ỡ緢甤᧒ᐈ䀣ᡪィ䅽͗ٞේѐ㰠歊⯣⾥䒓ళ䍰㟃℃⇇䌺箾ᜑఐ囡㓢疧䂯嘭䱉䢅惊ṋ䁫凶ͼཌྷ徍⠁硂绹Ⴈ⼢䉍塩烒愫䉠䝈੬ᇐℨ孄⠠侣ギ䘯瑄䒆ऒᇨ⏃Ȃరᄈグ匱㽢㎧༮稏䉌硼悥↙Ϊښ皀ሇ媨疾潠ᗸᴮغ㡨侅Ộ⍘䒖ࡂᏤ㯐弱䮢ઘܮ䤿瑦ࡨ䢿憮䋔䛃灔ặ䙐崁⛽ചᜬ☵ⱀ傈䝨ᆗ䊊ӈ瓲ᘸ̦⼁筃喛璩з䉞⒗࣒ܓ͏֘ᶈ㥀⾱惣斛㰐徧塙撘悶丠⍫ߙยᣄ⌐峢㮣ᝓ匭Թ削ஶ箜慘䉞㮢瞂Ჿ䔷ㆱ䄝Ѧ礮ᄾ秪砶⢡應⌻֘ৼ䏄⫈䝁㘢層抬礻扁ゔ₺冢䎲ŵಂᯠ❨悡奂⨛⊩ᤰ⩒墒烍ᆎ岲䖘ਊឨ⯡ব砠㩥⚫#ᩖ咙ᄚ儣⎂䚡ࣘ᪠予䋱㛃᭤⪨氿屇⒝惾凙⏖窯琺ᓘ㪂㐱寀繦ຬ町珨¶ᆶ␎䔩᨟區䳡ӭᒮ㔾ᩉ璓ࣖ兡㸘৸ᡨ毱簢愘㺩嚍⓭㑿აㄣ䊖Ӟ࡚᭹䙡䢃✦䲨戴⩍奐䣖擡䌷堸৯⒀⼀䅑⏂定ἑ耀䱋ಙ䣃⫄掑䚳ฦᩯ䝨䅞㊂怙㈭䰵穎ᑸࢡ䅶⊆穌ତ㢄ᘜ呃攉晝瑦ᣓ円⎣ᅢ╌䬩ಲᕀ嫁䰺㹔㨌ᘲ墭⁊掔≍ఢ᳔㽈櫱≃仉塲欶ᄵⱹᘳ㆐Ǖ䒨ᖌ┨禎㑃Ị刋⑵ಇᄗℾ⍥ᥕু⮌◸污孩仧涨婬癌ᅇň㨿䊽䝋മᾈᄽ㡱ၝᅥᴹ♓ಕჟ⃞揃䝹Ω䈼⣰ᢑ愃䫤䞦ᨩ␡沈壾嫮戫䔷ࢶẬⴰ啑唂↉䮭䆡⹋Პ㢦焦斍䠂擖ⁿᓑ䎃էථ朤湁浂备ㄲ↫䜇嘖ቜ㏘䶡欂⧥㴫焮ṇ⪵暁熃㌯൮ϓ䫀濦爂毦➪爹汇屰棔燋所Ƿᙆ◜㤘庑ⶂ⁁㊧㜼噊粊眷ᆳ̄䟮ഖ᭹䯨埆枂矤ⶭ弽2甪礅ㆶࢸ厸ᘖဢ㻲ᯑ㫃絤ඬ猻ـ墰ॿ拕䗠䰞ᗌ㚞ঀࠡ㈐㔕笲䅕ᰲ㸧燋糼䝟ࢊᘌ㰈俑笃䉃は䂵㙋ɺҫ煶抌̀枍⎜⭸崩ㆈ篹缭弈繏呡ҵ兰ክ䝚⚖᳢↤䄑娳瑅佂₵㙛帺䊔ࢬᏤ╨㙟䏜⏸愩堃廧微⬱ᅎ≰䒪⣻Ⳅ▨䭠✠ᶘ兑⊌寥瑯䢴ɛ䉱ӎ㇑催Ⓙಶ斂⚤稚琲ᇥ嵆㬽≤択壳创揮䗷ጂ⍤䮩ᴳ熐倣ṥ䓷池Ⓚ䦀䑠侑Ꮲ㟘弩斃ⅆᲗ消ๆ恀ⓕ盞揈ၠጨ䲅ࠤ珑璲扂㉪堇๘ྡྷ㤜ঙ⋂➸亡⭸湩粲ᑅ眨撷快沵憜ᒘ⚱◶ᔴ⮤搩犳㱅紦▏䊫㤿⓲ᒘ椋如ョ滲ㅘ䕑∢㗦枯琎䃮巐撴∰ᅳ䉽牷梻᥋ዩĔ䞤犯ጿ㟹Ე夊ㄲ懶❌亨斐䎄埾焠堐射岾᥄割㣉䥓挓㨎ۙᗙᮠ◩埤⏡ᥰ漰ᣵ牦稻䥯捪☌䤑ፌ☸ߩ㉈㽆㫐ᒣ携犙䅈⦟ॼ♤䰥ᴲ℘夠塲就㝅⊻ᜪએ撸⧀匞⚐䠥ᾒ㾄涑㹀壇㔴䮊╅ģ䩪ॡᅤ㌰˄ರନ暑呄哇妑䟯簾䪃ᓸ熌ሧ稀候ធㅠ光ᦳ橓Ц効⾽䪅ဦ⦔⎑櫼অ᭟ᚴ䝉⥳Ԋځ㊾珨檥漱㇙疥▀ʫ曊㣥ᇶ₢߸㡮ᴹ᥀⩰ᒣ䧳ࡵ⟹痵ὔ㚆◉珡囆泒檵㙖㕍偔ȯ䂀媉ܳⱐ▴䯉᮰㥉ἧ⸣፫㉻棊熒䋭✲侸␊㤵Έ唀dž㵭媲ᕏ涫〸樎匣♲䱭ᦸৰ㉠筠兡窱䵑栵墼榃嘁⚔䭉ᓂ㢤籱ᙳᧅ୪帢ⵆ⩡㓌槥劵◨劭ዸͤ㋦㳠㨹ɮ㊸䵅橧㓇怲ೢ✦䢦ᗼ㪘惉䞲倁孩栈ᵛ婢⒫磳刧▖䨛䈀㪔䷨ぢ漦筮檻畂爴ᄐ∁ጕ䑂䱅Ḻ⡴嬉巳殣睬滦㵃㩨ᶁ䡮劕Ⓚ䏔໘ୄ纉浳⫆Ὤㆤ槰剭㾉↜剭➄ᨂ⪔抉矲哓Ὠ㉎橾ᐯ樀㏳➊丰ૢ伝㎉焃櫤狧庰䍝⩖㓚榹戯⒔䡅〬灉构Ⳅリ↽䍝㕚ゲᤸİ斁䷭奴䠹⭳组㵭༼♊ٻ哘榡ʠ槶牕Ꮢ゠䄹溲ㅄㆿ㕙䚗᜵䌌㋤摰₃᷊⛔狦䄲寅ⶫ䦲慔媞ಠᦢ㎱✡䶳㹬塩⯳ළⶩ⦳Ἵ䙢䒓粙䇯比ᅓᣂ‐㦹㑲⏅冫ຶ䚙唂㌑⊹䧓ጠˬ䎉㟲囄㳬ັ㍘暂㔅⢚䁭勞䫖ሶ㽰⬩挕羧ᄨ䲻奘窓䲨樗卂杫₳ᰶ㪯ᑹ㡓⋆㔢嘫⍞媂䳶⨞−攁俓Ἄ㓤坩ᙆ㟥䪴स嚒ತ槺厇珵佃ᶶ⭰甹䱒穣Ѥ妸䵔䙹㮎妘厭⑅䠳ᕶ⋄掄⩒㒅㫬⠎䭞٧ⴋ٦䇚攥份ᴺ㝤纩㼻潩溶ॻ炗瓫ǟ向⠒佳ᩖ⟄殹旓䧆囬㖼畅㚖泖娝剳⚑䨋ᚖ❟ᒹ⹒㺈罬᤻㥟穧ᥠ㍃☖乥⇺☌旹⓳來捩ㆶ歎⪘哽ᦤ揶搬㟝⺴䓉ᕓ΅磯㌹穇癱್ᥙ㐅╃䰱ፖ㬼呙⍒㊅⻯ᶹ篦7哧ਗ䋯△䨭ᮢ㣄怉懒䞄憩ᶵ䝄携㧠犗⒓䩻ቮ㗴羹孓྆秩岯杋晽䳚㦑㍞晓伛Ზ⡬槹↓䰻⳨ֶ䕟♳洁㦪爥攓䩕⏆⪌嫑喲䢓潫䦳坕⚁洉㧬玅曓䱗ზ㪌䫙╓嬅ⷩ࠹孀ຝ沶ᦀͰ攏䑽ᴎ㶐㻁巓㼤㻨㎿捉乤猷猎撑䦗᧮⧼墙⾒ᄄ楪䎰歏䗍ⳑ⦨牪斒䦫Ợ㞴䇹⿓椄旬榷等嚌㴄稑琑曒䧧ኾⷌ櫉ᆒ⛂ש檹⽔ɹⴐঅ匱⒃丯ើ⫸䖙疒庆䁩害⽃幵㳭㧊吃昵䠿┼孑⢂㡺柖▾捈店㴁禔㎎操䷏ᵾ➔匙刓ዧ䝩ẹᵕ幻Ქ㦆㍛摧佛ᓞ㿜嗉姲⯇⯭⪺㽓⡔ⴅ⛑㐖攭䠯⡜唙㝓᷅ݯ亼½䚅糱狕斆䬟ጮ⠃᱙櫲㪇翮᮵佚糳椦㍿旮丧᳆㦔嘙猒囅෨➲罅Ǝഘ夯珓斻䷯ᾚ㕴稥娓䠷淪ⁿ㕒庎峏䦩夐ᘙ丏ᰘⵜ佉窓ᨅ◮恹Ë㹵˲Ք柗䯿᳑䆜箉検悅綣璇坉权峞ᰤᕦ៏ᄲ㇜批朓倅Ứ皳͐Ⅱ粼繪ㄟ䥿ᇡ㔢櫙帓Ẅ硋⾺൏㱲Ⳉ՚૨ᓈ⭷ᷡ⇼䭉数ⱆ䋨�ᓾ曕䌈㦖ૠᕐ⢠孅幢䑹未妄糪硻ニᚆ峙ᥗ友攤⯽ᜐ⌢擙Ⱛ渶⟩㝋᪐⋿ן狍䜤Ⴎ㺴䉥䋒椴╨⑱ࣟ湺ᴈ䗬ᶂᒷ䪧Ꮁ㯜噥珳⼦潩ⵍ櫄咪ᆙ卉搻䷈姪㗢呥ਓԶ塉呹▮冄ᵘଵ⟱䶍ᢺ㳂栥洪ԇᏭ౻䣑䅻⋆ᘽન秫么兑™庹䩓䌴௯劺Ø纝咶䖃ક┌⪸從㽂筥ᬼ坙塋抯壐䆖抡䖍㍽㣘ⷸ宑⟢䇥咓搆晉ᱱ䇾穣拔姽獞ᛎ倛ẖ➂慹ᷳ笵ẳჄ㙮˿姂⑼叁◂恥ᵒ·䋪⑳棚⩳拑秽掬ᚔ⺠匩⻐瀥ⳳ炴㑌䞸ᵓ㷌䅽䗁物៰ࡉᷪ⊀䚙䎪⼴㇖欈痪ॲ瓫ᄗԲᑲⱚթ♜劙ණ淉湌摾壗灛䘈䯷教䮰呱⒂罅䞪攵Վ硸Ṉㆌ沺᤹றᘕ䧨利⼬䧙昪ḵ⩶ࣚ抄妓㉊ᝢᗮ㵴猙ᗒ攆婊ᱺ磂⯓ጊ㦶䩙Ⳕ姎⿌棥䋒ặᙎ徱ṣ̚▸䭅គ妦㊂瞙潪瀄䡋抬䝈㹩糜㦺䭐ᗺⲄ儻兰栙㲓᜴捈ス坙⩉わ樫〉朆⮠ྐྵ㟲䃾罪ጅ版㉴֙䨧䭣㣒䎅棪分㒥㮼ნ㭄䳐㧱爬ᙙ䩐尹㺂歙啲⾄排᩻獔⚏㊮斍㎴擪⬫ᣱ㼲憹秫▴൭德睚㆒㌊旙ȶՎ⡴壹㷼琥缫વ潩㊺痤墱倻Lၕ◑䱭ẙ㖐★毫㚵⭏⌌免焹狡憯䪚ᬣ俜匓䩈ᐅ獫ሄ浏ቴ˙楸勣Ԫ⋑ᜮᨾ㠪熙塊溵ॏᶹⓝ䦀ኵ奈⫩ឡ⠼夥⢒槥㏲ᡴ☓扷磕橡ଁ慐⭃敂ⱼ履⏔灅熒砇Ṋٳ佒१峴╘㏛暧䱄哉⫸毎揫瘶ϐ羷㳟㦓狦ᔰ䭑枏䨂務⠒債咪疅独穼䓙噼䪿◢⩗敡⯢囑㌨ㅹ烫ゴ狪楼勐ո䋪祼ࣰ嘹⸏ᙎ⟼楁姣ᄵ㝍㹹ⵝ禕ફ֚வ攉⤧ᇺ⣪孹ཫቶ癌祲ᓑ熂㌋ᕏ䯳秹⅖ⱒ垵挒㹶㔠ѴⓏ祵犾䛆䯡ׁⶪ嶙⅊硥罋ᖴ䓉ぽˑ溒⬘嗅呾〜垵宅燡■娲ࡱ⃟⺛啑磟⓲⢪ᅹ㎒恵丢ⴇ㟯恾⫐䕤狖秨喱⪈己㕲唵奓㔴㕋共峐ᦊ䫼ᘏժ墉⾸泵撪╴ᅼ勄֒କ啸⫇䑪⪂噅⨲䷨浊䑴瑌汴䋇Ὴ粳ᘇ⮛旷伺喅⍊哵㷊⸄奌㥰ୋ幡⫨祧犟晉⮺呕ⷼ匘䔓㦄绉ᕿ泇㖀狧喾પ昅俪岕㝪呕ᗊ杴㭬刣Ჲ疂攉⮺嚅ⷴ刹㞼橕ϫ罴缅ᄦ▏ኩ⥈ଥᒳ》ᵖ㴺擵巋≵Ỉͺ⽀䅫䬒䕦獶哼䉦埥⋗㹕ᴪ᳴响卵䫝╯攌⩶朓Ⱘ孱ナ屵ᯫ唥ᛌ繴⫟⪗ഀ䇜㉑ᑝ⯆儭㯵ᗹ峊㎺᱈暱ᛁ禜嫾շ⭌ᕺⵒ岍漑惵੍ヅ榉嫝նீᙫ⪜寑珕濫更ᑫᢵ㛛൪㗺樷╛⿶啍ヺ䷨䈓䢴睪ួ⛁䖊媡㕓⮨喧⤿ἥ▌䍹睪⚶捋⩾仁ᦍ檮ᄸ殃喃⻪娵⼝㉙࣊姷㿪煼䠵毗扶ᥒ欤坷Ⰶ嘭入⬊ἲ㝳碼⋒㗨䩕噳ⷀ厞㳒紵ᖋ糴ௌ୴卖关᪸㗎哛地⡤唈т憉܋ᛵᯍ筳ⵎƂ竖㘂િ❈⣺嬊ⵢ絵㨫㒴͉䝲Ệᆏ媽樛橀晍⡮嗝㐔罵❪竆㭊啲Ⴡ綜椏㤭Ⰳ䕕⧆壽⹚佮ϊ䝎彳僌书傪疒㏨竛⧳ᄣ㮊䗕᠂⯶䁽Ǜ庘۴Ẻ爾غ;ᡶ㴦䃹ᠺ延⫯䃶Ồ嵿㫉ᗌ檟攑⽺喣☢娙侊ᖇ䭨ჿ⪙ۈ斍櫈㙀⭮卦㿺疙㻓᱔梋㢴潇浢۰斗璘㚷⤁尽候啲㱕捏媲ᇚᶐ窿痃樸㔕ⶱ幃⏺熙⤺橖ᵨͼ⭚⍢䫹ᖓ⬄㔇Ⴣ㦚瀕䝪᩶nj歽䈤ᶂ⌏嗶ឈ框凮㞚䞉㡖梏烿⇏絫ଗൂ櫤ន䡦墕⯪䩕悻㹵勯䣾ᓑ⍹竡൘櫢㕥⬘引Ɫ漵䎋Ć䬣ⶸÒ䅫姜➢⽑嚹₺乭攊戴滩晸㼲ᤢ㉽䗪兓ጄ欤堾⥦侭㕗௩哹⧀ԯ粻Դ᮱ᖔ溁刃⾦沥Ļі窍䁸䣄㍹糭疚ᮦ埫䩑内ヰ巵㴋⟵晌ჳ嵄⎟䛷⦼᭕撛巓㿆幭ںㅖࢍ泽潃氺ڪ⡅䯋曚矌呠চ尭ʻ㖶ӎ峵婛熙曶旋⫲㛆侭ᬃ㏼埭㶻畖Ῥ㓱㇁Ⅿ曤媖歡暜汫⧝╆漕碻⊶⊈䅷㧐⚳嘁⯶㛢溪兽➔䚕榺㰄䯏䋽䋑朅ෘ婓ᕄ楂嶹㏆峕嬻ֵ⦉㭷种♠ᛂᯕ❊䍹包㖶嚭咻৷柮糶⽎卣ᚽ╬媡㗤氅剳❟⪕䤺䲇❍˳ᇏਫ泺㦓ᨬ䑌漞嚃⤶䏭䧪狗█槂狔㥶囖教ᮅ㑽倅巉寥智⩖㖎ᢸ䣗⮑䔗丌珵╟⡑ᇖ㟦䏍宻ੇ㲎ૺ狞殃窵֎᭽㗺湁寫㴢繍傋⫕֎⋲ᗒ㶗⫏ⷤ᭗垗⧥叚㡖熭ჲӗ嶏峻峆絴㛀ฒ獨㚂滛ᵋㇶ汙Ⲻ㟵䝋㫽盃此㚽秅嫡㒢洡媙₺癍㿋࠰壋拼䷔㪈㛢ⷫᮩ㑲ⵅ啝⟖禕竺忭ቲ絇糎☌䰉㒺湘儉㋖礍㙫ᡶ㍎擓㵰Ჸ⸍䭾朡喒ᾕ⦆姍佺宇▏ᡱ巇䥻ᔄ祳᪻㖜₆售㚆䠕⊲忴俎䓵淜殂挚⦌嫇垴⳹吞⍺䡥㝴旗炏⛿ዩ㕿⋋⩻⌓ⷸ嫊㰮唍瀪㏕᥋仵㕊ݲ监㕿⨬㚓Ⲗݦ焀捺测䇾嗖ඉ喂稖㟭⥖县䲊拍添ୖᾋ滹ⷔẔᬈ渔㰁呷〟ヌ欽⤊淔᳨盶䷍⭦㜍⤼㪳垗䰳彞㐮椽࡚囄⤍廾筙⭣盐浯孝㛊䢃嶻❴䩥㈺ᕕ⍄㹬䓕殫⚰淐ᮘ瞦濣呣◆䯭䳩䓵Ⲍ۾⛂杲㛪ᷪ櫂㟩淃咇㻦悍≛⢖掊绷㝃ͩM⇄㴪晻䬓夷娦庽㰺瑔Ċ嚽Ç仪⤋櫓♥潃暓㇖垅ᶋ⇫绺䞀ᕅ橾㔳䣎峊Ṗ䘍噴临洎䧷孂㕼仮涮㰘疘⫭凥䕌箽〻㔷擉拻滒㆐⻯ඣᩋ㔹涋嗕㤦卽絊䅗俳當⏃媍⪪喉㫜㖥濒尫⢎嵵Ⰺ疔壋෴Ɐដ⼊䷋㯀痘ⶣ卹㫎牠ᬫ㷗⎋淰ᷚ冂㓶ᷟ⪲瘧⠳吉㱮䛽ᦪ⦴睌旹㯍纕漁ᵷ㫴瑷ⵃᗣ⺌䓽仚厔䋎᩸䍘滑ᵎᬭ㟘澋偓㽆䙽烚䏕粉櫵㕐㜓奫㭊啚樠妻㢎瘽䷛㢗㜈㷳䷃ླྀ嚻䣨竻ᝢ汕崫✎䶵喇畇♾ඓ㚷祉᭛嗭⼮勷㛂朽孚璴⬈᧰叒宏㪹祎⬙盕䠭庛㴎䂵᧚㟖࿌㕴Ở枅浦㭣旞沃夾㐖篽፫ᑶᩤ⻕䖊㲡瘔ఏ㚸涷垧➎役屫凔与屾㏇ຕ㳌䗿㭁瘹槻厏⻦僅㛓䫃毋ⷶ矜佫⫶䇬⩒撛漏ᬏ␂そ坺ኗ浩û㟀獯ể᷊勣睺澧怋⠜塙ྋֆᐈ⭶筌垌亣㷼竊眃汥༊㵦瞙ᔚ懱簫䀨䠥暭晈䩸ᓷʷ檫㌾淽淪濥禄埲⿌律⪆緵筌η氢䴂ᠡ㙠琙㘖䣑渣ͯ徟灺綾筑埻涂摟㟞羝囉吕怡彷⮙綫笔Ť啿废ᶞ嶝છ䷯䆣濁㽶给綧竷瑵⓿双ゞ樝搗珌俷ᡴ塕纽㇈⡏璨ౢṤ㪯㖪榋㼻怌䘄㟣Ⱞ经㶾䋗期洟弚䲪⠣耛㙺䀽㘅䓦ø⣲州牓瓫櫯坏⥝㰣ࠦ摦⌗㘌Ⱬé呟䲗敛ᇠᯠ㛸ଂ℣砋㿎䯰䗕ñ庺ીݨುୠѠ殒̣ȧᦢ㭁⡧䂝-⢒笳㊠ᨀ㕭⮮祹࢚ሗ㐋䱈႐啕崂㉲ޘ兎䄣喻㦂䔧恁㧔QῒᾚȎϪڛૈṰ㗠煡䶚応ᬗ穥\\ん㉨䆦礢孭㗀῀㞠拡䓖㯣昬Ⱡ៏߷Ă䈝砥㉔窠ᬐ㩶⫡璥ᬦ宗漌䡗䂏惥೩㛞ޞ㈬⸹ਠ擡棝簵ਮȐ珼㻓ᾙ㛿嵟椐匁䜰怡ޣယÉ䰕ᡕᛯā∊▴㝰ᵭ庰樾壖劦厣⊕䡟⢍ℹ䎾妮Ꮈᎈ㰣ᱞ捍ⴧ瘭ሿ㑙䂀ㄗ⇣̿竡摔⹈㨠粁仝㽪笕⨹燳⢞罽⇥ϳڦඬᾕዺのح望ᶻ㘾៳梐⭿⇙䉷䂍Ќᥒ䟐抶䕌池倗㨥ᔷㄉ懇僗ݩ卾瑠㦅㝚䫍䎚㤗屑氹焝戓䎯ڎ࿈䏘ㄪ⮁偃㾦匘Ḽ培҇俍绽涖ڞౢỬி⒃⁃ᡦ⢭ℹ煫碅ज∇痔䡮ಂ沰渁糭ྦ崖ᘺ᱒犧ऑᇸ㻤攩ธఘ㼀欁牃猍ằ甠៍翀ㆣᇇ䐌䝓櫇櫽垇⚡敃ध咮夸槱撃砠㫸塜䚎ฒᴄ㠳ᇚᝃ忄䪬塗₎ツ炒ᄣ䒒殊ᢚ䑮䗓№眉ය坌⭸㕓佺∟淕ࠇ嬺᧬枮囱吰硱ḣ彶䍮べ椛兴帡ݡᔤủ到烜㯃䲉T㣐ٛ䚢൏K悱㱞❞ٴ㒧ᷱ撃0⢻愹凸䒟椘ㆤ⒄尣卪᧫ܸ捑璃妐㦭ᵯ浠Ⲋ䩺刀䎭箃⌶ᤵᙥዑ揃ᢌᙂ傡䙓毾壵ࣄ挮㩳㚌㖸昽➃㸩䭇俰擰烝瘹攞揅䞝ྶủౘ粐˵ํᎭ⩊稣䥊㡅纬फ䙧䐗ⶸ㒝㽾䨣ᅧ涯㇣Ⓒ岏ᾧଢ଼揋䜌♲Ъ䳘祸樃処瞗䜹䂱㲍畭䔇ㆷ䚔┐ݡުໞど枂⾯〶粕壷懟⎶፟ྐ֜㐘晞澭䂹梲䄡抑⇿ㅐ⛏殜堤祸䈳ല瑯栴ₛኟ磹⨴ޕ璎Ᾰ㿇㮑䛃獙ぅ炽咵䊎宆殇㈂ᤙͨ乨ݤ焩涵⪛ᕅⶪㅑ光䔆ਁ�䝉朠䨂㳤犾壹䐃翤Ҹ械犻䔰礅ㆤ8䳩ᣰ㞟⪱䨳ⶂ牯᭖㬳ኇ⊌焿䞵䚉ὄ愱椳╇䤴牶乘䥇ⓩ䧛摺ึ䲫慮⸩䬃栠㙬ॗ志ṱ燧፮䆌仴䫒㈄篮繺ⳬ䁮弸ㅑʅ攗廑ᗞ扢䲈䤪㴘稬㏔婤㡭㖫ح䰮ᔆ皾ᤶ䛗ൺ᩸㒄翨汳皉绥㣠䕛䪐瑅䧟Ȟ෯൴䵊㨴砡琵㒳ᕬ㑯搽吧≾ሞͺ㡣䙸ᥨ㧘硱晳䕇㮭媺㡓᯽᱾↠又⛰̠ዄࣂᯰ⽄䌂㗶㞮㬾䀬㓱か䑜䃆乗జ㭠簁夳ᇆ୬⚾ⵒ湖劜槭₫❆不ᦪ㲴潉挳⋠㷇䪺嬴䪆桙槱ӣ勝ඊ⧣嶘礩潳斃㝬劸嵜簮侁景捥⟽Νᩛ彘篤寀㑚◦⎪欷填㒘Ἕ䷝ݥ྅Ầ㰔瓘桓ᧃ偯慃୪璚瓤ܬ㍯佬䫿ἤ眹壁啇⡯ঽٜⱺ嵶悭䠓ᬯੱ䈥Ἱ䏩᫇瓬榽咽⚑䳮䓨G塱甶涊㵄扑䈕Ɇ北䬌婞䯋ᔛ樅Ꭲ栆疹᪶㏬狩䍣䙉Ṭᢹ祔嚘⃧⧂ፁ㭆睺Ჶ㓆ㅹ䶳潇端ᖺ㏷㙇ᐻ_寚ᗰ喵罩犃䍆㖆痊孖㚙㳐໙嗶柭䷖⼆㩽ᴜ嗉澆䋯圹ଡ଼䂋唘妾叴穿栛ᦶ㆗⋶嵬榇㎶橋⅗珁᳸㎍䘽侧᤺己熙弊ᡮ܈䅚ʖӢ⇣敓㨫伞ᶦ䀓䉓䞇◯¾繛粝㍧㓒獰✦百ḅ囼涉䤳ෆ羔月睘溝䶄䦪痊勔㈖癤屜璺ೣ㋪献䖸敚ບ峦㦸獃時ས漾㠔౮糍橜⻮涼広洋姴琟䚏ೠ∌儫≀✓珉Ữ搊乺㺜糭娘珽乻᱑噄珙睳稇䟭ᶾ㽑䀾礔㛾疯暣皠䘖㨿⻉氓㨆㮬ឹ檰檓䅼㻠ଡ嬗侏夾㸥卓৳ㅔ掎⃖׃媒㷱吉ᨐᰆ㌝₺濉㰶⡎㟫⃐埗̈刣揩㩥㜰嫁㨽怫痺偌྿ⵐʆ崜岶ତ笸ⶊŃ娔潉䣽᮱籏ઽフ溝䋤װ秢䠗᧪㚔磉墽䠆∕煤⣚ƛⳤ妨୲᩿䵎瀞㥋㬙朹將瞾䫰㆟㴊䖿嵚晔梥劂盹䚭⬷穏ぺ绱ᛋPĥ漘ᝒ㝵ⴞ㴊◥瘢ࣧ哎ዷ纇拻䗗㏾ᙻᒤ峾夼沮䷨⢷≍徿Ñ纇☎ୱᘣ㛤崩嬼繹屫〷槮ቹૼ䦆⌊◓嗱給丽᧺㋔暉婝ᴪݯ䚺ⵑ⦟挔欇洷歪幚㵔椖䵫⏇㭯婼潱抒畭搮ᎆᜍ疧ᯩ㏞ゅ婍䙆〣梹᭓憌唋Ἆ䕼ᙋ䴚ᶚ㰵⎥甕㧊屍笈ⳙ⪀᭧᧺㍔ᚃ㘌墉㑓㯖撙⎷ᡍ絨㍔燇↟媻௱ញ㟥⣡㑒籡䉫燒㟶湺㳑ᦃ狶秖斱✭㙥ẙ㼬瘅点⇺Íណ䕜⦜ⅱ㨜⌧ᙏ哇ᰥ㕼砵䋥㡶嘑箉亂嶓亶୶㮪晌媚㒹⠡䅓㐶壌䁻䩹勏ᙴֹ䭻硳ހኞ㞌㈞䛀䨆殶߉佒ຍ⋨旗䮹柽䱒巅㢱㟚畋䙶ౌみ瓗㦛ጛᘗ玼堅暜孅厒ᇥ扝රᑌቐ⛲孎䌁ͅ䯳嫧ෝᢱ㋊煵媆洄䡸⣛喝挀燑㵑杵Ⲧ㝵㌔椩櫫䬷⩗፩ვ㺙⌑喲᷸地Ⱔ椡㖊款䫫噇ዌ掌泖●殌儚ᡒ毵綝ᙇ䉬ᙍ⪾ᦎྜྷ哎Ꭳ㬴Ⲅ奱㔺瞞塳窊䑍㑼ۓ㤧⌜嗥Սᛚ⿴帅姲糅廳ㅷ晏命ཛྷ嫽◪殂媫⾍ᢍ㏲摕堎幇䔭么盜㦋坮滨ᵟ晴琮忞㢃Ⳡ恨Ⳙ䧬Άໞ珷嫦↨ட柇⿹甩㊊ᆕ凌盷䷯ⅹ㕘↔૽㧨ፘቕ仒廈㼲睅忋啲ᯏⁿ媾㶓㶊妣㏬ᚭ俋ᵄ㓋㲱壓煶䣌䏮婿㶚䌔㦽祗垭乢尙㼊痴䁋ӏᦹⳲ孌ଞ喨⮥嚤⼎就䀄⸭喋憶ዌ䅹ૹ䌈ᮣ媃伪弭㾊⨅䠻䴦⢍捺媽ᖊ㶊哙⯸㚃㕏ᾣ㍦椭䯫⢏⣸佛痆ያก㵷䁄⏡完ஂ̯㹋Ê䒍彿ᅶჇ䛷ණ䰘ޘ汐巾㐒綖璻ఇ♎ࣸ⥜⎝笙泙ᮗ暋㒎歞㥦礎䳽忶దû㣹綖㫥䗺歠⪬澩寳㤍⚎媻䌶ڌ䆊槓ᎁଚ刎王ᝣ擹嵑㍂緭䗓Է智盞捔⛿ඣ毡暯ⴄ妓㞊祥澻௷ᆎ⓼䓒掝㭽ᮅ䛕⺹彛ᢶ抅䴻下柏垎旔䮓⬍嗴孠㞗⸷ᩝ喚耕䁓䪷䗔瑊䣚䪉⧖⯵噙ⵑ姽፶瓍䕻德涍ᑽ䣗㪄⋾⯑噧ᕺ䶋㔊篍䩳㛫痍婼㜸㗂㜗◵厪㘬侥崹㼚㣕䖋皶⎌替哛妘挎ฅ⯅ᯖ湙徻㾌熍忋㝗箏擽壙玌盽禠涩朌浢幓㍺攍撙洆㉌ㅺ凚姌ⓨ嘔氜㚗㔽弱㡶罕溋ౖ᭔һ৻㮌㭵唌玧㛳伽媃㨦㔵䬓䢖ⷭㆵ㦈˼囔㰔㚡⹑奃㩆㌽嶫㲖泮㟋㝒ᖃ崔ᷣ獉㚾澽䰎㿊樑摋玶⋏乻痓㖗欓⸋娘癆ⴼ岹唶綖恻ߖ䶏ᅹ⫓枛䋿᷵海㞌漍嶕㑵獛海翎䯖⎉⾊丑㯎枡瞹崧庆白傳禗沆⳾䗔㕨曱嗍㗂圭㞜彛㿮祭筵⭳朏哸Ꮬ疄漖丁᭙糣复᤺栍甽ᢗ羍⧹㯕ᦕ䜄昉䭐涬⼚䰾戾穔旛⅗匎䏽掎ྙ᪗孇䜏ഃ⯃ދኦ㣙淺岳儩㔬㸪侒ỮḆ㪹瞳洇妗䐮兝嚛ᔗ疓架㗉慲潓ⶍ㯎➞杤Ꮟ㽺勠᭺㉨笨ᅇ穢ᤕ掓⏉އ仞忯㙬ߝ䯦䢰ḍヱ䗇硦⭦你⋹㓑湂娿㭞潍ቬ⨗繭⢱偡㺋廲ຓ㳐̗彼制憁爋増矼⢏䪂ጦ緝篊異⚎塁㶗䵽㤩ᒐ⏣䜣濧猱⼩欥孞砞機廁ᮭ堝吨櫹í㟺㧢䞮千紡ラ㳿澋䄟㲮䰝刓妃䀾䟻٥粼ǧ榉婥癭】ⷔ䅖匣丘᠗倿ୣᩗď盢ϔ燘ྣ⯃ښ杝᳝搀䜄㚥桚抋᭻Ỻ熷․ཛİ㭯婾夭傻昮吽㛱ゑ䊷০ᑷ❉昸គ㩁瓱笧砗䐼㽗䂙➏栤䎱ݟ⛭猨㩹᫁斡ⷼ簦婐㑧͛佹⇻ぽ߅䈐ᵠ㤀猺尦Ԯ琶梔ㄗ睒᧨䢦じ㶷ત〴ᜮ稾㟆ᙹ焘戔䏓ߒ໘ᾫ傃㊞竺⾧笯帽矀䒕焄戞儯މ咢䟇嵔₱瞆⦧堗昽㨤增䣭䋹ϒĎ凄㺨窱悆Ũ ᔛ⡊ᳫ挻䅗Վ↘⪮宰⩘䙠簶嬴倶䝈烥㪐㾲⮠ǤḢᤨⶣ婝ས椄揠崳噔窬㷯ㇱ獷ᝧ㴾ਣ璒䲸ㇴ揁䜯䆓渏䓐Ģଣ坕Ⱙᬾ塝)椂戃ᦙ䞖ĶṖ⓴ב皆קޓ᪢攧䀯厑再搛䠛۬㺠⊑渠᧧榨伾络§爌㾃ˤ'ྀ㬃क़ᠳ丘䎮夿璙ࡲ䉉䨚ጐ仝䦗➡䔳塶ၨ傿务䊐夅䥚Ꮞ搉昑 ᷑ͳᥤ㝎㝦ⒽᑤㆩԆㇱ搎䟐之㻬൩笺ፇ㉯劄䨬火ষᏠ粬㣑Ỡ㽿䈑異Ḏ幯ࠓ履䨮椠怠㑵⃒䃳ɚ䗧╀剳橠楯㴡唢㐡䁹⨊叹⠑ƍП泴畉晳峢ㅯ䯬朑ᜮ⧴ⴰ僲召㡴耀癶Ç沮砢穛ቚዼ槲口➊伍ὺ㻒䨉敳䳇⭠岼൘ڝ甗⧵抋ੁ俕Ἲ㾴簉瓳䜶Ὦᾒ㘸䪑唇䨊㎺瑮云Ẽ㮔硩䏳䓇⽯㊾捚⚚ၿᨈ㏹✺倝ᾊ㨬縹罳文⍯͟♬ഞੌ债枱亙ᷖ㦀㦩皳瑇穮଼獝ʇ䴍⠡㏀来伵Ặ㫌绉橓悇㕡ᶿ墦ຖⴘ槼珒ᓍ伕Ṧ㪔㛒࣑朇㓸嚰ᩥ℮玻ᡝ卿㓥䫸圳ᅜ猰緤⬰ڸᒢ䙖῝羚⤭玾䰦撀ʨ晚仰嘓盤恝䊽幀纖⧮墏琓縄硗甡㻈砗ᛃ䋜ᄀ⠣ⲣ⤣棽ᜬt欈ᆂ⯇Խ०䠫彌䵠栋↘䉮ю惼ᝈ熀弅b縲夫潨卨⸈ଢ䆝嘰⨏Ɨक㣞ᾚ瑰㜫伴ⵧᖍᄃ籧唆繁ఘᝡ䄰徳ᕂ禂Ძ匷僠呿硡冓簠ィ♼⼹ᦑ㥰䉜୰嬷ڹ㣙籠⌞1ᝄ⼮〈㥹䙅杸⥎拺哞⦟纴昜䯁煽⧻䝹㣲眥碫刷嵏ⶰ⣝䔠㌂◦ƚង➌廉Ồ穈丨㨚㖯孖簯禗塯罶຺瑜⸼尩㪒羘◫搷歁ٿ㩞ᦒ≤ᘀⰐ堄╲嶥㨕⎥氠w䣝堪檤椭⏫ސ⯼埁〜䖀҃炮䡄䣏婾᳛暧匒䗢Ⱇᝲ՜峅㭊监惋啷掺䥦㋘喘⬕É暼垙⸦嵵㬾䞥珋繷䫏殠㿥睭挓☏௶恚⼺彙㤲眅秳孷䩉剾භ疝欖㗤殨↛⺆崵㢺緓ଈ灩㗳仅㘩㪨㰸悚㲗⢕ᓑᖕ欆ᗱ珎䃳ໃᠩಿମ橃䑟⻞狪懚灾䬊Ϸ䗘佼ề㨦燪甲❂ ⡃㎝⒧╻ᳮ㿷濏㽼䇃⎘ⰰข⃘ႊ䥮㿦獻䰨幗ᐠӽໝ擦✃瓍⪨¹嗬ࣳ㿞ᭋ໋狷ێᗁ䟺⊪巬◹ўሼ溲㌓㤊䖉峡☰獜⤂䓞天倰幐宫等僅廫䔠֩幻牔䌑૽㢅#ἲ墴䓞ᘺ潭ഺ܈濙笧ሇ㩯䄒畟Ḡ᪰呆恗䓺澆ㅻ㾥༂ଳᷗᬉ✫犢㸨䌗ᐮ䀢哭悪䋦䂖痣ᷤ㮏昪瀠㮒ҩ淢ቑӸý岛㻒؍笼႗㉈燿慠\"⟺䲽攼⢗ណᇼ性㮞殺摏婴睻䦳忢䀠O媤巺㮡ˮ濣峠Ү玽洆ᦗⷨ◾⩂⒓֝癖剀㢥烻嶎⛴䓽笡ƅ൜檲篝漅ɏ䁓㱃滱佁瞂珷䝵⽌ḝ勼 ᭂ羕ᰥ殩㶷崍䵻ࡾছ綀卬毼矜š佤懶፣帶Ⴏ嵋㼦昀煤⎧纰⟽䮯⨼惑а㚬Ǡɡׂる姬戰屑⪡䶯媯乃ื瞏澄⟀䛄監ಠӘ抅ᾁ䥄朲二碥瀰㿆癬弙ڶ䒈㪦ᷛ䏉吪䝃㏒ဍĒ Ł8¡䁻⃰ᖝ又❡稅ጧ申禥᪣㈣ᘣ⊳嬒⏏䑬Ṹ㰥⇟Ģ䒘帯昦࢞Ἲ∜䐅߇㳞栦ፐ糢眀术椿㑰㙚凪岑ᖐ惼༮䂚䂏㠷浧縯䄾〼㊦ख∎%߲愂ῆ㇈繱縱⥫■┾㚄紴೩吠恁槪ऍԼ㽘禘緃曧掳ȿ穝�㾙ᅓ縏㑱~䂐㲸䠜ה̨⑦ዹ擨㑢䢲琼ᐐ桭ዼ切䆽Ӵ✃檰ய夿ᘡᲘ攒ၕк䊅卙∈㴘㡉簲ᣇ䩘槩熡怡栥㜟␇䠞ཞẗ匘屉箴မ㑧劾䕞sብအ緦伾倌ち፰⏅䫳敲ᠯ∮繜䂜ԛ皿叹ਹ伤ㄡ掸ᆰԮႇ䏼〠㕞抟◠䒮朣瑑䓞ỏ˟䀑粟ಇ䐬▾摲亟䴐娃➲栅侬㢦㲥Ĺ碉ᤇ噧⅓嚜㯥娔ᐌ䎩伿溾㲲曙皓氌ⱘ㉨!䦡䀍┥羡戠ᣀ⿈䐿佟䨠ᰠZ䶥♧ቸჟ區䌟Ԭ௶ፌ⽕棴።綰眫焷牏㎸㣝㢃̟Ԡ/䊷维⩿ჟ熟椘☆2᠋硡ṩ㋲罬䭫犷䵏㩾ボⱜ㌜易堬㮹Ӵ幙㻫䃅禓犼磏䐿㇁▘猔刼屏壩煉晊绯ृნ⫏㉉燆愁÷Ⱋ㮴ܚ带✊羥`㦢㍿募嬞䲲毯晋斂ྪ粚㭋᧷伢櫐ࣟἤ刬眂簿崧⿷漓氚粈⭑᭓⬨累䓧穅ܒ瘁帻埄撾廉Ě碩眑琀ヿ㍐原䗬ڜ㠻埅䱙幊䀚箭瘋煗稰䢤秝㝆朔ฏുᨭḮ磍㶈㇆䛱宲ଝ彡྾ࠉ㜘؛㟙絽态⊨⍪儗↙揠Μ༖焊⡇䐑䞴犴㉮窅㓧ဖȇ仠䁠恣㬘希猬矯䊵⑇㴓枥ݰḠ䩡ᥟ䰳漜㈝搓噿汘㧆䃎耕盛罧䱪⧡䀫Ᵽ㊖ȝ㶫そ䊓嶃₾硝禳殒᠏㏿烂爡㧍縛㈚່䡠㻯㴎㽣万ଗ懀嗿㫝澞怠縝ቁ倻ࣆ㎹ᱥ֝畈ḗ押撱悞犛ᅨЊᛐྫ➡䀳ິ忺䭈ᒯ䂔牟ႝ崇䈜帖߭砘ὤဏ㲀ҝ犧稗䘿捠濞৵䚩␑䕕ɭ仈緩ڀ♩ᙰʐ㣮ᒞ┞㸊ࠍ瞦ᾐ㻀㡁竒㻧甯楇岝ㄝ爝䜢⠀䋔╼ᤔ翺㣜眬ᇴ␉㐱懝呮㐊楉刋潵ᾏ㴰㨣䣛篖ἠ勀⻛Ⅴ擇熁瑀␐⤤ᓹ糶痽恏樨孞渽㎱ʓ夀ᄤ『ឬ㸼网磐矇.∠余沑焀䭣Ĺ塏侽瑑㼗僥禴漴抃潻娏䖲竼槏ᆘ墣♚濎焧ⲑ㐾㞚㍰Ҕ呅ගெ㾟娘ϯ枨僫偢㴌笑篃滨㝿筠徢掁爭瘨⏩߃ཆỈ㾸糐ҽ殤දᤓ癸復吩㟭粏伡Ỡ㾕翉縃潧惿媏䙟ྫฟ刈䏨䠃ྂῷ灨絻災嫿ථ徢⌝Ȑᢡ砚瀖徧ὠ㶕纮Ϸ澧滿Ǟ徝ܜḚᰙ栱ϳ徳㹎缐ዛ禀؏噯瞝瑫Ŭ氊လῷ徦䀮㹬竻瘗枏罿◱羜༙ผ㰄ခ䟱࿆糭碛犥祟湍塠榣熅笪㾽㿡䎍紩烳澏湟懞䞟Ș墚࠘倔濔ణࡽㅼ㧇磨⇏棟渠ञ咘䰒䊭堊ᾮ徻㽞縖䋧灃瀏很�礜稚撗栜矩ᾨ㽓㹽び罬Ὧ玈ᶨදᆪ禸磒თ簮ᚒ䎐ざ紼穷簳敿侯緞崝ȟถ㰊㟹䟡㽖翌«磗犡ް泡㊠砡㭤狤 偐耍䳘斂㮘䰿緺㒟焟現奴⠚စ”牂䐌ᾞ⧻純༿榑⍣䦍橮ᖫ䥔Ņ┗㏨Ở棩ष篜翊仼皥ฟ♚堝ᦹ忪慦缧潯巠ɻ礠፻愝䐎㸜籃砚㒀怖ᱻ矅䆛翈䦟塟檟皩㉩⌽栜娛磱䀐耉羵绣㬛╿琱ҟ槆憮䰞繁择唲䠡羭ᙧ缫ʿ磬珹撶⒂搟妇‒䀍䀜羪ⴃ㦿罏缄㜟枟笟繯堜峂耝䀫怃嚠䀃抨耉泦2瀉态ƫ䀏Ⴀ者吮ڠ⤣Ħᜥ䓤䀻㚡怆ᷫ皪䀸䧉ᛥ䀶廠嚩庤憅䀊瀆䆯䀷庬ඊቨ儬ʠၡ耈䶤簥%‽循 耊⩩″僯寃ᯧ‰怹㢈䩨儢㔭‹庫怶怽ᜦ Ⴇ‷怸怹瑨ဿ怿Ԫᰢ动Ⱜ焢Ёڏ椧့抨倳┌′▪倰倳縅憭倹倿ԣġ⮯媬〾瀎䀶揩䀸㐢〾䲦〺㷦⒥ఫᐨ翃͡ï䈤瀿῁倵6䆨瀼瀴᐀᥆瀻瀶廣瀶Ⱝ嚧䃠࠲࠱ো耉倲撮࠼䀿瀵䀮瀶ᜧ䚦瀺ը簌债䨢䠷ȩ切္̪ࣩ䠶 䔋ନ瀺䠵癦瀳〶࠰䠳〴‵瀲▨瀵⠻⃦⠹瀀瀶瀸疠ೡ⠷)ὣ㖠೭⠱䀱ƨ瀺样喉ᛯ栵格㣮焪倷搯嘎のᠴ㘁〳䯫皭ᠵǮ䲠堰ή歧Ầ湌ु歮堳根〱ᄇ琎㦦報湂ک報湃兇劅⥃ἅ࠳⠳琁䤆㦦䥀幊㹃䥌幀怇弋㨨幣搨Åⶦ砳搡砵砹;栵䤇堵怃砷砻䥪Ẫмԅ砶ឩ灎㰫ᐧ瀁簫㮬尉ហᨥ吧а䐴䐹瀸о䨬бƤ㐫б䀯й唨䐴०㞪䐱窤⽩䐳ж䐶侂漂䐰䐳場н䰇䐾偌♯䐻䊮搷ᗅ瘄悥䓥搱窪㾯搾㋀漤甋䐶䆤ᐺፊᐶᐵ患ᐽ犪筧Ոᐻ搰吼祋ᠴ篤℉ᐲ▭ᐷ搶吼狉ᛨ㐵吷Ռ吿㕄মㄠ⽯ᕮて㐽㐳〫㐷ဍ䀋㠸℆搿ᐸ琼琷ᐻ㽩〣㐵簠㙦㐱儧嶋⒬వ'ḁᐺ搵ᐹ吲ళ琼ᐿహ㐴㐿媦㐺吴搷ᠻ堳ర㐹吾䰾䲦䰲皬䰴㕦ᄨⷅ㠎హ吺ʯ䊏倊琽宧㠿堶㐹ⰰ䰺࿂ⰳ搿ᐸ稪ి㾇⢩吾氱䰻吵䰷ⰻ皦㐳氿䰽氻ᰢ㐆㐿䳅䚎ᄉ吹璈甃ⰿ吱漃ᰰᱤ䚥憡ᰲ尲⯨䀲ᅅ㙁䐺䀽尻尽堹䰲搰ᰱƠᅆ尨㰲沅憩㰳尼ᖬ個ဏ媡倊簱椆撧㬌㐣ဩ倆䘮循-㪯‡ਁⲀ笋春ℂȵ娥䎭ከ愅ବ幡㹪昉Ȳ䥂䨣優ȸ䨃Ⴆĥ౭㹮䬧ᡮ簱ဌ溢簸ⰶ⒫䀫樉❆∰ᨍ箣㴩⼈䌋ᄃ∈税尨氦⨪⚮丬℡堍栆㦩∿་缊∳ᨏ㜏戺榫∱䄤℀戾攉〬戺个戹⨮户䠉房堶∽缌♨刳挪∽房㜎刴ሶ༇∿分ሸ挩ሶ丩⨮挡戱砀刹刻眍房眏戸༂刻ࢬሽ喪琯∏刷▨㈷戨ሲ㈰⠁Ƥ༈ሱ㈷ᨄƣ炮∼⢇イ缍∰簯㈿∴爴戲爽ሶ爼㈷ሺ㈻皬ਾ挥憤䨶交ࢭ㈱召ਲᖣ⌮刹ਹ删㈳਼⠫ሾ砉父䆥䨼䨼♩⨶焏吪䨵䓨ࢭ䀭䨰漫䨽刲ሱㄇ刵ਲ戱⨫␡爵堂▨樳$刹ᛤᨻ戱※゠ਸਲ਼個剧⨵ᨵ∳䨳∶樰爹樸⨽ਲ਼樲⨷ਸ਼⨰ᨺ瑧ᨾ䨲ᨷ㱆ᨾᨸᎫ㠌䯦ฌᨱ⌮ち㠆㨲䉌樽䒤娱伂娰⨱ሾ娶戵娸ࠎ⨳䀊㨾ㄫ㨵⨹᛭㨳稴樺刱▭稾㨱䨹❀ضط㨻伧䨺ሼ稴⨱娾爿ਹ稲犪ػ㨰㨳ᯩؾ䘼ز㨽〭ᨿᚫ㠍ذ眫ر樿غ稴㈷樼䘳娰㊤☷稷㱁㠌㨷⌄☿䘶ఱ䪢昰娲樰稵⼁ਸ਼㒬爽樶戺⨱稳☵晡昿ኦᘰ匎傪昹氾笩ガ☼Ἢ☵䤊娲稰ᘹ☳อ☶㦧ᘿ☳ᯥ嘲曥ᘽᘶⰱ曯宬ᨿᘼܨ嘾䨬嘰䘸ᘾ稹堉嘼㘳爻ႏ㘴显⮮ঁ㨻ⶪ瘺㘸ᜮ㘶䘮☺嘻樾嘽娶㦬আ瘺ⲡ瘳䘹㾡瘰㘺㖋璩ู昿㨶਼娻昺ᨅ樵ሸ䘴ᘻ㘿堼ะ瘹ᛥ丼瘸亠ਹ㨱可举䨷ำظ丿䨷昲为爼⠣㘿ሻ皬⸴ض激䄠⸶ຬ渿娸⸹❀渲㘺⸲☾⸷ع⸶娷瘹娵☸฿堵渽丷㱎Ḽ瘻⨹梅ᰯ⨵券稴丸戸Ḻ丶稲Ḽᘹ嘿Ḳ渳污䀪䨵悇帿ᨾⱨ㸾渷㈷渶☰Ḳ嘶帳ሻ⸰䨱ƣḴ㸻帳⨴ԃ搥ฺԁযԉ瘺樴帱⸼为帽⸾丷⸱ƮԊ總嘱拢ļ瘱Ķ縵ఊ礥ij渰嘾㸴嘻瘽㸶爸ķ㸶䆧ij䭬ԇ爰⤯ᄡ后尭ĺЇ䄵─ℿĶ㘸䄱㘼䄰Ļ㸲䘸攆䐎ሱ䘼ಉ搉刬瘼ℾ䐂愸ℾ䠶愰愵總昳刿渷縵㸰Ķ䄻ℽ䜭愸挡ḳᯮᄰℼ瘼湥ᠩ愻佧ᄲါ愰丳縰ᄲ帴ᄼ⨲ᄲᘿ⸇㐯ᄶļ⚯䔋ᄴ儴い儽渶㸶儱㸸ᄵ㘳㸱帱主皮ㄹᄱ拤焼瘸伊ㄴ⛮然ℵ瘾⸽氉㘱☿瘰㈊ḷ伈愵欥焻ᜮ焱焻磩ऽ焽縳昺昃瘹㸻ㄺ䄳ℳ儺眣श⊡䤼⼅रᣤ⼂儼‧䨷焵ℵ儺䤷⼊ा笧䤾า'䤳䤸䶣⤻ष愱䄤⤴䤰़Ḱู帿堿⤶⊥椿䤧䁤焢焦焩尦㜮漩ᾫ愩㨫ᴠ㔮Ȣᔭᄫ椻昬ং⸅㐣䥪慩ጮ⥡⎢ਡ撁䄪倦怢稭⠪吭絮䦯䨧ᄵ䶤།听ᮤ㥥㔥嘦㈫ᄫ䀦怮㤽㈠┨ᄠ㰠ȩ㸧ᠥ†礶•䀩硩ၩ玦嘲⨭〳搤〦⌂䘀Ȼ⌀ฦ⦤ȧ愯儮℮漦刭Դ愥㐫㐫̠ၢ䌋㊬稷ၤ࠭倩礷戫̂礷儫㤾ࠫ䔽津ഭ㤺ࠫ㤳⠢┽礲瞩ၬ☣Ⴏℭ䰩窬ԴጊԺ琤ᔁԳ┠☠䔻Զ⦣嘣攼愨抯ݡ䁮䔸䀫䈳ᄡ䴥怬‡ሤ㤲䔂㤻䀥ࠪ㤱礰愨ᰧ‥⠫㤿㤲唹縨䔾焣䬯⨡攨ᰮ唴攤ࠦ怤唰㔶ȫ㤵㔲䰋椲倭値༉唿爨ᰮ㐬㔲倣⠤༃䔵唺帤㔲倬┵甶唻㤻ଫ中㔴㔺甲.橆ᷫ簫昮尫㨪矢䰇ᄫဇശ䓥氡朡䈦⦣男ᖥ簻䘦吡含憏縦ࢠ昪殤 "}
The complete round-trip took 45.1 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
formatfield).-
. 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.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate ServerWe deprecated the slice request in favor of the
static-sliceQuery.To slice, you have to send a file analysis request first. The
filetokenyou 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": trueto disable the automatic selection of elements based on magic comments (see below).Example of the
request-sliceMessageNote: 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.8.5", "r": "4.5.0", "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
filetokenofxto 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":{"files":[{"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\"]","filePath":"/tmp/tmp-8371-koz1na19juQM-.R"}],".meta":{"timing":1}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8371-koz1na19juQM-.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-8371-koz1na19juQM-.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-8371-koz1na19juQM-.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-8371-koz1na19juQM-.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-8371-koz1na19juQM-.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-8371-koz1na19juQM-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-8371-koz1na19juQM-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8371-koz1na19juQM-.R"}],"info":{"id":7}},".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":3292,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"vdef","id":0}],[2,{"tag":"fcall","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"fcall","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":65}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]],"_unknownSideEffects":[]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],"hooks":[],".meta":{"timing":1}}}} -
request-slice(request)Show Details
Of course, the second slice criterion
2:1is 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
resultsfield 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": {} } -
The complete round-trip took 6.6 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
filetokenis 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_linewill cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_linewill cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_startand# flowr@include_endwill 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
- direction string The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
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.
LoadingsequenceDiagram 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
expressionfield. Furthermore, you can set theansifield totrueif you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theidfield 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-accessif you are unsure).The answer on such a request is different from the other messages as the
response-repl-executionmessage 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-executionmessage.The semantics of the error message are similar to that of the other messages.
Example of the
request-sliceMessageNote: 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.8.5", "r": "4.5.0", "engine": "r-shell" } } -
request-repl-execution(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" } -
response-repl-execution(response)Show Details
The
streamfield (eitherstdoutorstderr) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowascii Returns an ASCII representation of the dataflow graph (alias: :df!) :dataflowsilent Just calculates the DFG, but only prints summary info (aliases: :d#, :df#) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowascii Returns an ASCII representation of the dataflow graph (alias: :df!)\n :dataflowsilent Just calculates the DFG, but only prints summary info (aliases: :d#, :df#)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :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.1 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
falseby 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.
LoadingsequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate ServerTo send queries, you have to send an analysis request first. The
filetokenyou 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-queryMessageNote: 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.8.5", "r": "4.5.0", "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
filetokenofxto 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":{"files":[{"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,\")\"]","filePath":"/tmp/tmp-8371-1F8ME9A7TkmN-.R"}],".meta":{"timing":4}},"normalize":{"ast":{"type":"RProject","files":[{"root":{"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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}},{"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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}},{"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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":2,"role":"call-arg"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}},{"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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}},{"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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":2,"role":"call-arg"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.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-8371-1F8ME9A7TkmN-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"index-acc"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":1,"role":"call-arg"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-8371-1F8ME9A7TkmN-.R","role":"root","index":0}},"filePath":"/tmp/tmp-8371-1F8ME9A7TkmN-.R"}],"info":{"id":91}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":3469,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"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":"fcall","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"fcall","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"fcall","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"fcall","id":16,"environment":{"current":{"id":3319,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"vdef","id":12}],[17,{"tag":"fcall","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"fcall","id":22,"environment":{"current":{"id":3334,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"vdef","id":18}],[23,{"tag":"fcall","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"fcall","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"fcall","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"vdef","id":24}],[32,{"tag":"fcall","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"fcall","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"fcall","id":48,"environment":{"current":{"id":3391,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"fcall","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"fcall","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"fcall","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"fcall","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"fcall","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"fcall","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"fcall","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"fcall","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"fcall","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"fcall","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"fcall","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"fcall","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"fcall","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":65}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":65}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":65}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]],"_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":{}}}]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],"hooks":[],"cfgQuick":{"graph":{"rootVertices":[90,0,3,"3-exit",2,1,"2-exit",4,7,"7-exit",6,5,"6-exit",8,11,"11-exit",10,9,"10-exit",12,13,16,"16-exit",15,14,"15-exit",17,"17-exit",18,19,22,"22-exit",21,20,"21-exit",23,"23-exit",24,25,31,"31-exit",30,26,29,28,27,"28-exit","29-exit","30-exit",32,"32-exit",33,36,"36-exit",35,34,"35-exit",37,52,"52-exit",39,38,"39-exit",51,40,50,"50-exit",49,41,48,"48-exit",44,42,43,"44-exit",47,45,46,"47-exit","49-exit","51-exit",53,54,"54-exit",55,"55-exit",56,67,"67-exit",61,57,60,59,58,"59-exit","60-exit","61-exit",66,62,65,64,63,"64-exit","65-exit","66-exit",68,79,"79-exit",73,69,72,71,70,"71-exit","72-exit","73-exit",78,74,77,76,75,"76-exit","77-exit","78-exit",80,89,"89-exit",88,81,87,"87-exit",86,82,85,84,83,"84-exit","85-exit","86-exit","88-exit","90-exit"],"vertexInformation":[[90,{"id":90,"type":"expr","end":["90-exit"]}],[0,{"id":0,"type":"expr"}],[3,{"id":3,"type":"stm","mid":[0],"end":["3-exit"]}],["3-exit",{"id":"3-exit","type":"end","root":3}],[2,{"id":2,"type":"expr","mid":[2],"end":["2-exit"]}],[1,{"id":1,"type":"expr"}],["2-exit",{"id":"2-exit","type":"end","root":2}],[4,{"id":4,"type":"expr"}],[7,{"id":7,"type":"stm","mid":[4],"end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],[6,{"id":6,"type":"expr","mid":[6],"end":["6-exit"]}],[5,{"id":5,"type":"expr"}],["6-exit",{"id":"6-exit","type":"end","root":6}],[8,{"id":8,"type":"expr"}],[11,{"id":11,"type":"stm","mid":[8],"end":["11-exit"]}],["11-exit",{"id":"11-exit","type":"end","root":11}],[10,{"id":10,"type":"expr","mid":[10],"end":["10-exit"]}],[9,{"id":9,"type":"expr"}],["10-exit",{"id":"10-exit","type":"end","root":10}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr"}],[16,{"id":16,"type":"expr","mid":[13],"end":["16-exit"]}],["16-exit",{"id":"16-exit","type":"end","root":16}],[15,{"id":15,"type":"expr","mid":[15],"end":["15-exit"]}],[14,{"id":14,"type":"expr"}],["15-exit",{"id":"15-exit","type":"end","root":15}],[17,{"id":17,"type":"expr","end":["17-exit"]}],["17-exit",{"id":"17-exit","type":"end","root":17}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr"}],[22,{"id":22,"type":"expr","mid":[19],"end":["22-exit"]}],["22-exit",{"id":"22-exit","type":"end","root":22}],[21,{"id":21,"type":"expr","mid":[21],"end":["21-exit"]}],[20,{"id":20,"type":"expr"}],["21-exit",{"id":"21-exit","type":"end","root":21}],[23,{"id":23,"type":"expr","end":["23-exit"]}],["23-exit",{"id":"23-exit","type":"end","root":23}],[24,{"id":24,"type":"expr"}],[25,{"id":25,"type":"expr"}],[31,{"id":31,"type":"expr","mid":[25],"end":["31-exit"]}],["31-exit",{"id":"31-exit","type":"end","root":31}],[30,{"id":30,"type":"expr","mid":[30],"end":["30-exit"]}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"expr","mid":[26],"end":["29-exit"]}],[28,{"id":28,"type":"expr","mid":[28],"end":["28-exit"]}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["29-exit",{"id":"29-exit","type":"end","root":29}],["30-exit",{"id":"30-exit","type":"end","root":30}],[32,{"id":32,"type":"expr","end":["32-exit"]}],["32-exit",{"id":"32-exit","type":"end","root":32}],[33,{"id":33,"type":"expr"}],[36,{"id":36,"type":"stm","mid":[33],"end":["36-exit"]}],["36-exit",{"id":"36-exit","type":"end","root":36}],[35,{"id":35,"type":"expr","mid":[35],"end":["35-exit"]}],[34,{"id":34,"type":"expr"}],["35-exit",{"id":"35-exit","type":"end","root":35}],[37,{"id":37,"type":"expr"}],[52,{"id":52,"type":"expr","mid":[37],"end":["52-exit"]}],["52-exit",{"id":"52-exit","type":"end","root":52}],[39,{"id":39,"type":"expr","mid":[39],"end":["39-exit"]}],[38,{"id":38,"type":"expr"}],["39-exit",{"id":"39-exit","type":"end","root":39}],[51,{"id":51,"type":"expr","mid":[51],"end":["51-exit"]}],[40,{"id":40,"type":"expr"}],[50,{"id":50,"type":"expr","mid":[40],"end":["50-exit"]}],["50-exit",{"id":"50-exit","type":"end","root":50}],[49,{"id":49,"type":"expr","mid":[49],"end":["49-exit"]}],[41,{"id":41,"type":"expr"}],[48,{"id":48,"type":"expr","mid":[41],"end":["48-exit"]}],["48-exit",{"id":"48-exit","type":"end","root":48}],[44,{"id":44,"type":"expr","mid":[42],"end":["44-exit"]}],[42,{"id":42,"type":"expr"}],[43,{"id":43,"type":"expr"}],["44-exit",{"id":"44-exit","type":"end","root":44}],[47,{"id":47,"type":"expr","mid":[45],"end":["47-exit"]}],[45,{"id":45,"type":"expr"}],[46,{"id":46,"type":"expr"}],["47-exit",{"id":"47-exit","type":"end","root":47}],["49-exit",{"id":"49-exit","type":"end","root":49}],["51-exit",{"id":"51-exit","type":"end","root":51}],[53,{"id":53,"type":"expr"}],[54,{"id":54,"type":"expr","mid":[53],"end":["54-exit"]}],["54-exit",{"id":"54-exit","type":"end","root":54}],[55,{"id":55,"type":"expr","end":["55-exit"]}],["55-exit",{"id":"55-exit","type":"end","root":55}],[56,{"id":56,"type":"expr"}],[67,{"id":67,"type":"stm","mid":[56],"end":["67-exit"]}],["67-exit",{"id":"67-exit","type":"end","root":67}],[61,{"id":61,"type":"expr","mid":[61],"end":["61-exit"]}],[57,{"id":57,"type":"expr"}],[60,{"id":60,"type":"expr","mid":[57],"end":["60-exit"]}],[59,{"id":59,"type":"expr","mid":[59],"end":["59-exit"]}],[58,{"id":58,"type":"expr"}],["59-exit",{"id":"59-exit","type":"end","root":59}],["60-exit",{"id":"60-exit","type":"end","root":60}],["61-exit",{"id":"61-exit","type":"end","root":61}],[66,{"id":66,"type":"expr","mid":[66],"end":["66-exit"]}],[62,{"id":62,"type":"expr"}],[65,{"id":65,"type":"expr","mid":[62],"end":["65-exit"]}],[64,{"id":64,"type":"expr","mid":[64],"end":["64-exit"]}],[63,{"id":63,"type":"expr"}],["64-exit",{"id":"64-exit","type":"end","root":64}],["65-exit",{"id":"65-exit","type":"end","root":65}],["66-exit",{"id":"66-exit","type":"end","root":66}],[68,{"id":68,"type":"expr"}],[79,{"id":79,"type":"stm","mid":[68],"end":["79-exit"]}],["79-exit",{"id":"79-exit","type":"end","root":79}],[73,{"id":73,"type":"expr","mid":[73],"end":["73-exit"]}],[69,{"id":69,"type":"expr"}],[72,{"id":72,"type":"expr","mid":[69],"end":["72-exit"]}],[71,{"id":71,"type":"expr","mid":[71],"end":["71-exit"]}],[70,{"id":70,"type":"expr"}],["71-exit",{"id":"71-exit","type":"end","root":71}],["72-exit",{"id":"72-exit","type":"end","root":72}],["73-exit",{"id":"73-exit","type":"end","root":73}],[78,{"id":78,"type":"expr","mid":[78],"end":["78-exit"]}],[74,{"id":74,"type":"expr"}],[77,{"id":77,"type":"expr","mid":[74],"end":["77-exit"]}],[76,{"id":76,"type":"expr","mid":[76],"end":["76-exit"]}],[75,{"id":75,"type":"expr"}],["76-exit",{"id":"76-exit","type":"end","root":76}],["77-exit",{"id":"77-exit","type":"end","root":77}],["78-exit",{"id":"78-exit","type":"end","root":78}],[80,{"id":80,"type":"expr"}],[89,{"id":89,"type":"stm","mid":[80],"end":["89-exit"]}],["89-exit",{"id":"89-exit","type":"end","root":89}],[88,{"id":88,"type":"expr","mid":[88],"end":["88-exit"]}],[81,{"id":81,"type":"expr"}],[87,{"id":87,"type":"expr","mid":[81],"end":["87-exit"]}],["87-exit",{"id":"87-exit","type":"end","root":87}],[86,{"id":86,"type":"expr","mid":[86],"end":["86-exit"]}],[82,{"id":82,"type":"expr"}],[85,{"id":85,"type":"expr","mid":[82],"end":["85-exit"]}],[84,{"id":84,"type":"expr","mid":[84],"end":["84-exit"]}],[83,{"id":83,"type":"expr"}],["84-exit",{"id":"84-exit","type":"end","root":84}],["85-exit",{"id":"85-exit","type":"end","root":85}],["86-exit",{"id":"86-exit","type":"end","root":86}],["88-exit",{"id":"88-exit","type":"end","root":88}],["90-exit",{"id":"90-exit","type":"end","root":90}]],"bbChildren":[],"edgeInformation":[[3,[[90,{"label":0}]]],[0,[[3,{"label":0}]]],[1,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[2,[[0,{"label":0}]]],["3-exit",[["2-exit",{"label":0}]]],[7,[["3-exit",{"label":0}]]],[4,[[7,{"label":0}]]],[5,[[6,{"label":0}]]],["6-exit",[[5,{"label":0}]]],[6,[[4,{"label":0}]]],["7-exit",[["6-exit",{"label":0}]]],[11,[["7-exit",{"label":0}]]],[8,[[11,{"label":0}]]],[9,[[10,{"label":0}]]],["10-exit",[[9,{"label":0}]]],[10,[[8,{"label":0}]]],["11-exit",[["10-exit",{"label":0}]]],[17,[["11-exit",{"label":0}]]],[13,[[16,{"label":0}]]],[14,[[15,{"label":0}]]],["15-exit",[[14,{"label":0}]]],[15,[[13,{"label":0}]]],["16-exit",[["15-exit",{"label":0}]]],[16,[[12,{"label":0}]]],[12,[[17,{"label":0}]]],["17-exit",[["16-exit",{"label":0}]]],[23,[["17-exit",{"label":0}]]],[19,[[22,{"label":0}]]],[20,[[21,{"label":0}]]],["21-exit",[[20,{"label":0}]]],[21,[[19,{"label":0}]]],["22-exit",[["21-exit",{"label":0}]]],[22,[[18,{"label":0}]]],[18,[[23,{"label":0}]]],["23-exit",[["22-exit",{"label":0}]]],[32,[["23-exit",{"label":0}]]],[25,[[31,{"label":0}]]],[26,[[29,{"label":0}]]],[27,[[28,{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[[26,{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],[29,[[30,{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[30,[[25,{"label":0}]]],["31-exit",[["30-exit",{"label":0}]]],[31,[[24,{"label":0}]]],[24,[[32,{"label":0}]]],["32-exit",[["31-exit",{"label":0}]]],[36,[["32-exit",{"label":0}]]],[33,[[36,{"label":0}]]],[34,[[35,{"label":0}]]],["35-exit",[[34,{"label":0}]]],[35,[[33,{"label":0}]]],["36-exit",[["35-exit",{"label":0}]]],[55,[["36-exit",{"label":0}]]],[37,[[52,{"label":0}]]],[38,[[39,{"label":0}]]],["39-exit",[[38,{"label":0}]]],[39,[[37,{"label":0}]]],[40,[[50,{"label":0}]]],[41,[[48,{"label":0}]]],[42,[[44,{"label":0}]]],[43,[[42,{"label":0}]]],["44-exit",[[43,{"label":0}]]],[44,[[41,{"label":0}]]],[45,[[47,{"label":0}]]],[46,[[45,{"label":0}]]],["47-exit",[[46,{"label":0}]]],[47,[["44-exit",{"label":0}]]],["48-exit",[["47-exit",{"label":0}]]],[48,[[49,{"label":0}]]],["49-exit",[["48-exit",{"label":0}]]],[49,[[40,{"label":0}]]],["50-exit",[["49-exit",{"label":0}]]],[50,[[51,{"label":0}]]],["51-exit",[["50-exit",{"label":0}]]],[51,[["39-exit",{"label":0}]]],["52-exit",[["51-exit",{"label":0}]]],[53,[[54,{"label":0}]]],["54-exit",[[53,{"label":0}]]],[54,[["52-exit",{"label":0}]]],[52,[[55,{"label":0}]]],["55-exit",[["54-exit",{"label":0}]]],[67,[["55-exit",{"label":0}]]],[56,[[67,{"label":0}]]],[57,[[60,{"label":0}]]],[58,[[59,{"label":0}]]],["59-exit",[[58,{"label":0}]]],[59,[[57,{"label":0}]]],["60-exit",[["59-exit",{"label":0}]]],[60,[[61,{"label":0}]]],["61-exit",[["60-exit",{"label":0}]]],[61,[[56,{"label":0}]]],[62,[[65,{"label":0}]]],[63,[[64,{"label":0}]]],["64-exit",[[63,{"label":0}]]],[64,[[62,{"label":0}]]],["65-exit",[["64-exit",{"label":0}]]],[65,[[66,{"label":0}]]],["66-exit",[["65-exit",{"label":0}]]],[66,[["61-exit",{"label":0}]]],["67-exit",[["66-exit",{"label":0}]]],[79,[["67-exit",{"label":0}]]],[68,[[79,{"label":0}]]],[69,[[72,{"label":0}]]],[70,[[71,{"label":0}]]],["71-exit",[[70,{"label":0}]]],[71,[[69,{"label":0}]]],["72-exit",[["71-exit",{"label":0}]]],[72,[[73,{"label":0}]]],["73-exit",[["72-exit",{"label":0}]]],[73,[[68,{"label":0}]]],[74,[[77,{"label":0}]]],[75,[[76,{"label":0}]]],["76-exit",[[75,{"label":0}]]],[76,[[74,{"label":0}]]],["77-exit",[["76-exit",{"label":0}]]],[77,[[78,{"label":0}]]],["78-exit",[["77-exit",{"label":0}]]],[78,[["73-exit",{"label":0}]]],["79-exit",[["78-exit",{"label":0}]]],[89,[["79-exit",{"label":0}]]],[80,[[89,{"label":0}]]],[81,[[87,{"label":0}]]],[82,[[85,{"label":0}]]],[83,[[84,{"label":0}]]],["84-exit",[[83,{"label":0}]]],[84,[[82,{"label":0}]]],["85-exit",[["84-exit",{"label":0}]]],[85,[[86,{"label":0}]]],["86-exit",[["85-exit",{"label":0}]]],[86,[[81,{"label":0}]]],["87-exit",[["86-exit",{"label":0}]]],[87,[[88,{"label":0}]]],["88-exit",[["87-exit",{"label":0}]]],[88,[[80,{"label":0}]]],["89-exit",[["88-exit",{"label":0}]]],["90-exit",[["89-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false},"breaks":[],"nexts":[],"returns":[],"exitPoints":["90-exit"],"entryPoints":[90]},".meta":{"timing":2}}}} -
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": 0 } } }
The complete round-trip took 24.7 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
plottovisualize). 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
ggplottoplot). 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 offto 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
fileFilteris set, but a nodesfileattribute 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
pointsto 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 alternatives [required]
Test regarding the function name of the last call. Similar to
callName, strings are interpreted as a regular expression, and string arrays are checked for containment.- . string
- . array Valid item types:
- . string
- 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 alternatives [required]
Test regarding the function name of the last call. Similar to
callName, strings are interpreted as a regular expression, and string arrays are checked for containment. - . string
- . array Valid item types:
- . string
- 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 and optionally also updates it.
- type string [required] The type of the query. Allows only the values: 'config'
- update object [optional] An optional partial configuration to update the current configuration with before returning it. Only the provided fields will be updated, all other fields will remain unchanged.
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. object
A query to compute the Call Graph of the analyzed project.
- type string [required] The type of the query. Allows only the values: 'call-graph'
-
. 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
Either returns all function definitions alongside whether they are recursive, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'does-call'
- queryId string [optional] An optional unique identifier for this query, to identify it in the output.
- call string The function from which calls are being made. This is a slicing criterion that resolves to a function definition node.
- calls object [required] The constraints on which functions are being called. This can be a combination of name-based or id-based constraints, combined with logical operators (and, or, one-of).
-
. 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 df-shape query retrieves information on the shape of dataframes
- type string [required] The type of the query. Allows only the values: 'df-shape'
- criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
-
. object
The file query finds files in the project based on their roles and path patterns.
- type string [required] The type of the query. Allows only the values: 'files'
-
roles array [optional]
Optional roles of the files to query. If not provided, all roles are considered.
Valid item types:
- . string Allows only the values: 'description', 'namespace', 'news', 'vignette', 'test', 'data', 'license', 'source', 'other'
- matchesPathRegex string [optional] An optional regular expression to match the file paths against.
-
. 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?
- direction string [optional] The direction to slice in. Defaults to backward slicing if unset. Allows only the values: 'backward', 'forward'
-
. 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? Defaults to false.
-
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 read 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 write 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
-
visualizeFunctions array [optional]
The set of visualize 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
-
enabledCategories array [optional]
A set of flags that determines what types of dependencies are searched for. If unset or empty, all dependency types are searched for.
Valid item types:
- . string Allows only the values: 'library', 'source', 'read', 'write', 'visualize'
- additionalCategories object [optional] A set of additional, user-supplied dependency categories, whose results will be included in the query return value. Allows only the values: '[object 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'
-
ids array [optional]
Optional list of ids to filter the results by.
Valid item types:
- . string
-
. 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
Query to inspect which functions throw exceptions.
- type string [required] The type of the query. Allows only the values: 'inspect-exception'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. object
Either returns all function definitions alongside whether they are higher-order functions, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'inspect-higher-order'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. object
Either returns all function definitions alongside whether they are recursive, or just those matching the filters.
- type string [required] The type of the query. Allows only the values: 'inspect-recursion'
-
filter array [optional]
If given, only function definitions that match one of the given slicing criteria are considered. Each criterion can be either
line:column,line@variable-name, or$id, where the latter directly specifies the node id of the function definition to be considered. Valid item types:- . string [required]
-
. 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'
- withDf boolean [optional] Whether to include Dataflow information in the result.
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'origin'
- criterion string [required] The slicing criteria to use
-
. object
The linter query lints for the given set of rules and returns the result.
- type string [required] The type of the query. Allows only the values: 'linter'
-
rules array
The rules to lint for. If unset, all rules will be included.
Valid item types:
- . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'network-functions', 'dataframe-access-validation', 'dead-code', 'useless-loop'
- config object
-
. 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.
-
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)
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 @configThe 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. -
abstractInterpretation: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.
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": {}
}
]
}
}
},
"repl": {
"quickStats": false,
"dfProcessorHeat": false
},
"project": {
"resolveUnknownPathsOnDisk": true
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"instrument": {},
"slicer": {
"threshold": 50
}
},
"abstractInterpretation": {
"wideningThreshold": 4,
"dataFrame": {
"maxColNames": 20,
"readLoadedData": {
"readExternalFiles": true,
"maxReadLines": 1000000
}
}
}
}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 tofalseexplicitly 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 atypewhich is one of the below. Furthermore, they may define a string array ofnameswhich specifies the identifiers to bind the definitions to. You may useassumePrimitiveto 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 constantAdditionally allows for a valuethis should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }functionIs 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.tsor open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }replacementA comfortable way to specify replacement functions like $<-ornames<-.suffixesdescribes 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.
-
repl object
Configuration options for the REPL.
- quickStats boolean [optional] Whether to show quick stats in the REPL after each evaluation.
- dfProcessorHeat boolean [optional] This instruments the dataflow processors to count how often each processor is called.
-
project object
Project specific configuration options.
- resolveUnknownPathsOnDisk boolean [optional] Whether to resolve unknown paths loaded by the r project disk when trying to source/analyze files.
-
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.
-
instrument object
- dataflowExtractors any [optional] These keys are only intended for use within code, allowing to instrument the dataflow analyzer!
-
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
ignoreSourceCallsis set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
applyReplacements array
Provide name replacements for loaded files
Valid item types:
- . object
-
slicer object [optional]
The configuration for the slicer.
- threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
-
abstractInterpretation object
The configuration options for abstract interpretation.
-
dataFrame object
The configuration of the shape inference for data frames.
- maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
- wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
-
readLoadedData object
Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
- readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
- maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.
-
dataFrame object
The configuration of the shape inference for data frames.
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 RShell::tryToInjectHomeLibPath may be of interest, as it enables all libraries available on the host system.
Nowadays, instances of FlowrAnalyzer should be used as central frontend to get analysis results from flowR.
For example, a program slice can be created like this:
const analyzer = await new FlowrAnalyzerBuilder(requestFromInput('x <- 1\ny <- x\nx')).build();
const result = await analyzer.query([
{
type: 'static-slice',
criteria: ['3@x']
}
]);
//console.log(result['static-slice']);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, a slicing pipeline using the PipelineExecutor looks like this:
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.tsfile 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
initialExampleInfotype holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfotype 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, withInforeferring to aFeatureInfo(likeExampleInfoin this example). Next to anameand 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.tsfile insrc/statistics/features, add your feature to theALL_FEATURESobject.
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).
Currently maintained by Florian Sihler and Oliver Gerstl at Ulm University
Email | GitHub | Penguins | Portfolio
- 🧑💻 Developer Onboarding
- 💻 Setup
- 👓 Overview
- 🪟 Interfacing with flowR
- 🌋 Core
- 🧹 Testing & Linting (Benchmark Page)
⁉️ FAQ- ℹ️ Extra Information