CARVIEW |
Navigation Menu
-
Notifications
You must be signed in to change notification settings - Fork 7
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-07-29, 13:35:17 UTC presenting an overview of flowR's interfaces (v2.3.0, 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.
As explained in the Overview, you can simply run the TCP server by adding the --server
flag (and, due to the interactive mode, exit with the conventional CTRL+C).
Currently, every connection is handled by the same underlying RShell
- so the server is not designed to handle many clients at a time.
Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).
Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.
Note
The default --server
uses a simple TCP
connection. If you want flowR to expose a WebSocket server instead, add the --ws
flag (i.e., --server
--ws
) when starting flowR from the command line.
-
Hello Message (
hello
)View Details. The server informs the client about the successful connection and provides Meta-Information.
sequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: hello
After launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server
(🐳️), simply connecting should present you with ahello
message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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).
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate Server
The request allows the server to analyze a file and prepare it for slicing. The message can contain a
filetoken
, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).Please note!
If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass thefiletoken
field. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
content
field to directly pass the file's content or afilepath
field which contains the path to the file (this path must be accessible for the server to be useful). If you add theid
field, the answer will use the sameid
so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.Example of the
request-file-analysis
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let' suppose you simply want to analyze the following script:
x <- 1 x + 1
For this, you can send the following request:
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
The
results
field of the response effectively contains three keys of importance:-
parse
: which contains 1:1 the parse result in CSV format that we received from theRShell
(i.e., the AST produced by the parser of the R interpreter). -
normalize
: which contains the normalized AST, including ids (see theinfo
field and the Normalized AST wiki page). -
dataflow
: especially important is thegraph
field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11162-SrzZNG7baVuk-.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-11162-SrzZNG7baVuk-.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-11162-SrzZNG7baVuk-.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-11162-SrzZNG7baVuk-.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-11162-SrzZNG7baVuk-.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-11162-SrzZNG7baVuk-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11162-SrzZNG7baVuk-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11162-SrzZNG7baVuk-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
-
The complete round-trip took 17.2 ms (including time required to validate the messages, start, and stop the internal mock server).
You receive an error if, for whatever reason, the analysis fails (e.g., the message or code you sent contained syntax errors). It contains a human-readable description why the analysis failed (see the error message implementation for more details).
Example Error Message
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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\":\"file\",\"content\":\"/tmp/tmp-11162-qprOk232tXSN-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.3.0%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D11162%2DqprOk232tXSN%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A207%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A266%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: true
to its list of options.Requesting a Control Flow Graph
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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
cfg
flag. However, additionally it contains acfg
field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-condition","15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-name","25-exit",24,"24-before-value",23,"24-exit",26,29,"29-name","29-exit",28,"28-before-value",27,"28-exit","30-exit","31-head","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["15-condition"],"end":["15-exit"]}],["15-condition",{"id":"15-condition","kind":"condition","type":"mid","root":15}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":["31-head"]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":["25-name"],"end":["25-exit"]}],["25-name",{"id":"25-name","kind":"name","type":"mid","root":25}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":["24-before-value"],"end":["24-exit"]}],["24-before-value",{"id":"24-before-value","kind":"before-value","type":"mid","root":24}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":["29-name"],"end":["29-exit"]}],["29-name",{"id":"29-name","kind":"name","type":"mid","root":29}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":["28-before-value"],"end":["28-exit"]}],["28-before-value",{"id":"28-before-value","kind":"before-value","type":"mid","root":28}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-head",{"id":"31-head","type":"mid","root":31,"kind":"head"}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],["15-condition",[["2-exit",{"label":0}]]],[8,[["15-condition",{"label":1,"when":"TRUE","caused":15}]]],[14,[["15-condition",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],["25-name",[[22,{"label":0}]]],["24-before-value",[[24,{"label":0}]]],[23,[["24-before-value",{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[["25-name",{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],["29-name",[[26,{"label":0}]]],["28-before-value",[[28,{"label":0}]]],[27,[["28-before-value",{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[["29-name",{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],["31-head",[[16,{"label":0}]]],[30,[["31-head",{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[["31-head",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.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-11162-SEUcrBJRoMce-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-11162-SEUcrBJRoMce-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11162-SEUcrBJRoMce-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
The complete round-trip took 9.4 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output as RDF N-Quads
The default response is formatted as JSON. However, by specifying
format: "n-quads"
, you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.Requesting RDF N-Quads
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<https://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\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://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\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<https://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\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 6.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output in a Compacted Form
The default response is formatted as JSON. But this can get very big quickly. By specifying
format: "compact"
, you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.Requesting Compacted Results
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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):
❥撄筒ᅨ汘紏㉀䭞㓹者Ƶ⻌Եᣕጢ䐫㨇串ᡇ䏇६ᣚ⭄漸㙽᥍柯ᔸ挓ね疸䊢ୂ盡Ⲅ稴⎷⢵摗ዔ䤈Ȩ烞捉獳䦾㞉 偷癪刈ᙪϢ侒䨯ナ⌛㈽Ͱ㨙䗸圊櫃㨄ស᥌廣⡋ࣉ㳂㧌瘎㭩暩瑽竟ᔋ技◢囩灣⼾ѡͥ䴞㱹ᑦ侹冈䗕┈嬑ফ噏㱽括Шੀᠠ捈ౙ䖭嬘怂涭⩋❈⊭௸䫱◥娷绪㰿䔡ᗍ悂䉫⅌ئೊ㤼ೄ㨥㟅䞩䦘▢ᒿᲢ厪翮棎ዊ瑂矩₹㲶极வ慳䇐ૈ➁ࣨᠾ劶℺⥄ᧅ綄ڶ册祱ᕉጲ䴪ⳬ䵌㱖䩚⬉⦒㭙䙴榌⺃拄涔媁栤ἱ⢔Ƭиׅ禵ᚸ妒攣䇌巠ūࡈ㣘匈䮼⨹す䥡洉妞㳻៣竫啈ᠪ猇⁐ǹ⼅綴憾䓄և䘚៩ѽὈ糞䬼⥙㓅墷ټډ灰䦀娼䦨皗糂甤㲏瑁䀑㓐夨䖛祒墒砲ྨ狠㍼崵怶兼▁燕搮Ϝ粓獵峃ଋዑⰥ㉅恵煺չ旙昒䋒䢓幬•䬂卸ⷖ㲚Ɫṍᱠ喀Ī倪綪㣌ᅚ唊⽉≥䶆ո碲狂垪幑⦰揦ૅ楘õ⃠敷窹ઃᕥᜂ圴繊ࣘ煝⮵⬥嫵↓澅╯旐塚婢柒㽬僗粥猅⼥㛼㲽䜿嗵䖏₀⏊㥈⢸⫨⢩⓵楶ㆰ䩮㦣䑦剪䤈䧌ṃᾝ⫧䲗卵ॵ㶴㦉唧➺岔筋槉嫍梲樥ႉ⧅䪠ራ㏅㖽厺篋䉉ᓋ檫⬩⣙⻕仠᭷囇㔭吰楨⑃䣌⣂ܽ愧⧑⏹㬶獵ᖞ楒吣糊堥໋䪾ᢷⶁ⣸柅犱Ϛ疭唻ሊ䢫Ⳏ竜猃瓡䡆㫑⩡⤪උ椪Ꮎ夺寋㯎㛄檫ⰼ✕擵㙪綁焿吸̓㔂忍㋰檤⩡㽕姵ㆰ䶒沟垤ᜈ携篇ố㎜⣍ߢ孵矵⤯͵Ⴈ㔎兢䐊Ⳋ㻖ⴞ椀溠ᴭ㬁ᩀ⍢㓛䕨ઁ呄廅ㄋ歈殄व燶ྰ斄嗌⚇ᵌ箓ᛌ昼竊ᬸ楃㺭橖塾㶜\"䍊ͦ䘲♆য়䨸ä涕㊕⛷究㕡瘓唚奈ᒻ⊈刹㫓᧴榳㍭⅕⤩࢞僜ᓐ溚憺厢䣛勃⭸渺㏵奴哴㶗ദ㘺҆䖺䮵᧙朓ᬧ䯨䴼㶇✳玞渠㞍ᐦ庋㇋㝍̖櫐ࠓ㫹㝥⋷崩煯构喚䦩熋剐ᜏ吏ⱳ⃕敗ὶ籶䴠▐ᖂไ瘼⚷犪棴Ӎ㥔壵ᵻ撑帶䌊剕䢢囜嫲杋㋍䏦Ẵ㋉ⶫ妕夜橻籉瓚ᬀ᭢濋ⳅ啔ཆşⶬᓢ効ᓺ֊䲰Ὄ⇀ڮⰮ念Ἄ宕ԗ⊁廂獊䪍懜ܜᩖ楻㮍ⱉᛲ㮌⡺⤰䗨Д亢䐶㠾婀玀ᬍ寔 㮙㩵㔭塲䣺㏋䛛Რ珹⺛㮰埗建歨瑠瓽嘠᷺ྍヂ婸㎧⨽旇恴க䷦栎傖䁛ά⏉框䒑槚⽂粕∥ʰ╱ᄳ剮䩛榊懓ᛰᰃ⫧㦌犗ⱅ䋃Ḗॸ䑮嘨洬◖䚳৹湶勭䁕凷嵫㖖㔅忺⽚㌨ᣜ⻝椁沎丠㞄ዷ嗶⃝孎糚Ύ卞⚬嬖櫫㌽䰇檲坮㪒疣刱ǚڣ⯚壘㪑ڧ␍⇵㧱᎒巠畻圖䱛欉❋県⮊櫁⺕冕⻩㞕左盕叛ℍ䏈Ỽ㭩欹撕勺䙰ᗧᔁ剎帻㼋ߙ㓃溷╝投᧽ᱴ㵹眸⌾厒爉Ǐ目ᩂ泬ક叹佨媤皇凮䉚瘋珒仸窹⾯㾍䔖侃嶗㟷峮掛癳㏅盜禬҄厽䖕䍳杰絞ኯ取军⎏㚧ᩪ䊿⒝ⲥ⯼ސ絓畽尮憺ฉ濙曹筻湏ⱍ䘖Dz箎綝砏嬥ṥ䊏䏱眄斏浧圕䶗⧽垍ḟ㘋怖␚ᡀߊ稶渁ᣚ綑㹶ኗᵫ壒డ亊倓恆睗綩焟䡞ሤ耋➢䶏璷僶䓻ᦢ�窚畀Წ䱐ⷘ⏾傡̽㰓媮䣁㠫握⽸بྠ梡㖙ၚྪͺ痗収䞛甉⡤䆾嶒匀滾ᨓͲ憮ဢධ㶸琦吽篩⼠糩炀簞☯䠻宋Џ皷壶嶱䈽䳠∑䑄℠昉〮圌亍䗵㖨㌟ധ婶⯺⇏籕獀ぽ汗寽睲㷝㈈㼑ᚦ洴〣㪡㉷ⶐ樣䨯ౘ➼Άຟ氿㈧爻俗皳竡⩿ⵣ➈㑗䣜ࣸ⎇岦䫤困ῄ⇷䊬Ề矣娯籘䄌䍶历䙛氼翉籸䞲᩼䓃氕ⱪ疨笮岹ᕦౡ⒑㣔䙄ᰐ橣®ᡛ䤊Ϊ࿀㪞把ⶠ㒉㦚䜘ᴭ䆠㕠沊ᤞ䌳嘸㸁穦缓傜懠䜄Ố暽ắ䉞敵粃༅⅑䃅ᆥਪ䠩ᗇु⾃ो棬捍ຄ㛱癧ᘺ毹㇔ۢᮅ✹嶯癒劻內㏑瓭ဦͨ䇸Ἐ綪̔ⴼ椞džർ㱠乧㜻撝༁㬌ᴏ㭺羯ᴡڻ推伣⇝൦眉㽄絩牕溸湾焮䅘挽ൢ㗱爚掋ⲇಲ↲⪁⾲橯Ǡ⏕㦬乔㰩秧ҿ䲝凨➟皤桽䟶ſᓿ珍⣩祘咥Ʒ爆䓍圴甃噯煓烼捹ౢ㎑睆撿俐㋣毹⾠ჳⰵᓨ㒱䭰䊽㔂⮉❦⧯㳹ᥐ梳乯ᕜ愋緽㇉愂⚺㸺⮽᥎㞤ᠢ䌡攲䶚㗔⿆暼㿢榬䛡ᡠ楳刦䥒愙ጫ癲㰩㟇ᆥ㪛ฤ柾⼓ⴼ䈭糾䴉͡䴀ᝉ泧ሿچ↻➢䋷江筑熤ൎ╹䝽籓⎵䡿澥屯巻ៗ帤乺痧ᆹ⪚᧒柒棌樘揤孛ᆣ㐋✣䌛ᚰढ寣窲樅㪓⠢杒ឫᐆ丆㆑墇琸墏姻☴絳筗奸癈緋佻柼猇枾಄⠯察盰玕㪭潖範揬㟖㳌ࢆિʈ姝晫㑃੮Ṝ孉ၦ揾㭣⠶⾾θ恰ᱽ䓠⠺۵㍥λ俒㣉倆䄻岞槠‑娫桉烒眹Ḳ䴰ộ炆⡾皍晐娄曣㘭慑惵汄ⷙ噯ᄓ寰⺌Ƨ㳜ὂ瑓⭮筝⌊匠⻦㐥礲ⲣὶ䧔巯ᵂ▦惜䟔䭼⺖㽉䆆㮼ⲓ冡朤婜柽㨷擟络䭨Ѡ㎡甃ᰨᦇ婲នᱲ罓嚮୕⋲捔Ⳍㄉ爇ήᦒǦ㗰॒揳㭃ᴨ烤却ங㎹䞇倔妒爋媬滳䏯䭟ԅ糿坘㬅䱶㱥䇎v哂Ŭᮘ㜯ᶲᵖࣩ⻅㋛၆᮸妋㧾ᙃ 絫癕ӓ䌞൩⼘厵䳻峊斚嗣ӯ⫊縍∯瀠ฟ峵匰浿柑֡㮰塊甫濬泖匘⮣伋偉絶疄䜎坉ֺ旼曍嬂∩䷫⼷ⷸʷżᖇ娂垌堲泋䵏ݖ厚毋ⶽ媕曶䭾▔䠦䞟⺊朋ᱭ巴䋨ጴⲭ㨵羇捸榒ᖦᚣ柚桨珏⻔ስ毞ᐺщ巷䥽Ή䚯猑ᨺ瘋䥑竡猳〒㗦䠡卼䎎㖨㙥᧟㧋㋣箆嬒⮘漊暅䁶〹熗㘔᠖嵊滍狎᳑Ύᭅ媃㰂兖偦΅ᗉ怵۟䂻櫌㧓7᭄沞㷥堇烺犟㦰䜮弚棃Ꮟ㋛期ᮎ㝕㎽⚔糾⭭䷆戼ྊ箻⢡嗖ᐦ嬢渭㷕烶⋾ᚓ֨嚧᪪樘槏㗚ᑎ尒潅㖍䛖泼䡣᧮囦⚺槻泭狖⌌ᰄ湱㼕壗►綌涿囟溊緻渮淛煸㭗佭㗄ᔀ珜ஃ宄侏䳐㛼ᭊⱃ䀍耆ዺފⷌ�屔繛গ䓘䀱㮑涓㛭犖◿絥渋殺姎笞䁯竞⃫歞淝㶽怆㾋枒㗴㙋奮稠摬Ἅ㮩⽅㿃ʅ৺䐲㷉㕻崰琓敏ग़㭁㘧㟽妚棾㖖㷆㚇嵱䂝䗗眍⍜㍭㵹媗⓺皃巃㞟ᥖ礻穌捱篹䵛⚝嶆㣻完ჭ㛍嫺治憍㏒廽簋泃㧝旖忸Η抿盹報䚨翏⟓ǣ毟浿䀝猗䛻妞爌ᜉ峊祋п绑⃘᱑ണ䙙䑾㖘磄ິ嫒性㐼໓⛱氆潫㰂礮ၘᄃຂ້敀縧䪓俟Ἂ⎫浰窣渗桚憖䷍ᙣ姡箧᠏∄䝝㧓㗉䧉⤌㡝㟻奡竳ℾ梕睸汻㳕廆⯕㾟␍➽愞知㗑㈊䠜ἥ㵣暯哾椎仧盗幪櫧簼Ⲛ囸⇓⺰稝涃⊦礟旡㟝影澫⪎㻛滨݊ච砃䁮䙝礘㣥囬㪨șᲪ㗒䨅磶ᴫ㓝䚮╿Ԏ䏩㛆床絇垬䟔⧲僉ᷓ㗪ᆵ崩礁喺ᅺࣁ桋淮қ䧲ᯠᱟ㡳癷猩ㄊ厦仹彭㍻ƾ㊜ਖ⟁ᶭ㛳䑮ᵟ瞛嗱ស涖暇槲േ澉働䤵ş殏緱伖弹类粿珙槣⮴⭨糓礗㹈ႚ塎䯇峙枘䚼盛盷㭠Ṭ珃环卽崂㋘乎㿯༇㚎⑵⺍❱М秢曮橙洒䷝丣妙槧⎽Ɠᅠ᠘ἢ简剮媦ᾖ▧箺嵥揻帽乕䧠䝙ᶤ煓䇮䔓ఊ曞㨥殎䞍ㅩ圈烱甂等䣯磛ഌᗂ⼼㤟㘷㩾矕昜䞌Ťు甖〣猍↫皢㣮笛㬾媟娛㌃䡫䋜碅䏁〙㴐繧⪥ᒑ嘐栂岤篓歏勝姊㏰ྶ嫵缧咧ڲ✢忷㥆緶䫝̆搆丩㲥睛找⊗ᘔ殱ຼ簂瑦噆䔘㤖囂ՊḨ໎嚝睓Ⱆ激л滀⇟崐淩⼩㡕惃⍾䦟ਚ孱弦熠⼗ᇞ䜝睶㬯墦撰ム⌭Ҹ㞁獕㰉ㆎ✽ଋ㐄㴺罷⡽嶒䷧圵崶牻漗ᗘ眗䯅่㇍氷晽疘䛲㟐仜笫像㯸伕ⷘ戵檡㆓䮌枚睡䐏件祣涮ⵜ✉容⹐᩿↗ჵ彾放眠琻䇀➭沓ⶨ呉托湗䴌㞒痯㯭嶮絓慖柙弅䏋濯㺍媋䙨擞挝嵟巆ƣ͏祹欞察㝷庽㨷徒॰ླ忡盭澺㛟យ嗝㈽㯥綗松ᮚ瘖矝㲵稾ᓛ孉Ꮖᆕ姙犰ᮏ箘痱⬰崁礛帾熾愂珪ᾬჅ沯糾确䛾忡㮛䓏矟刍㸈ᾅ㷽拗ṟ炗揻ᯇ䵄ኧ穗䮿爗⯚ᾧ㫽烷柿එۢ佌ᳩ瓰忏䵾悈恳寇塓疍䟏វ竭༴汖狇渾檙䌖ާ瑬嵓瞛፟㛶曡侺沙緋盯Ϟ⨇ᶦἌ禣捯張㴟䇧侟᰿ⵝ䛒坦刓߇㧓恏擿唚丏䗱㼏㺷敯匭朖ᯠ⾚㫁ݏ⳿㴗⸏俶䀙籇吏皞ᘌ当㮃篷檐⯽〇´傽岿嵺㟖ំ⻐硫糏⡞⬔ఊ⾍㺷㭖篮⫺┃ɔ〟㦞㪋⧟㆖泥侑㻱癷搿Ἄؔ⠖⬆罅懏秝撔䨊滮㸢碗槺ᢙ瘞េ瀚罻祏⫟ܒ㰌⡌´盧ቮᏬ殕砂廷㣛濯㗟牚ḍ濍待㛜縯⾟㨉৯ỡ礛槇ᗜℜ稀澻㳞忇䑞憛Н标䘮ᤋ祋瞯⮒Ϸ宀㺵猯炯⛹ጀྰ廱祉泛槍㈑䒲❊嵸硋彎湞瘏彎稛昳㹬宖ᐒ⯔羟楛䍟㴜礆Ꮰ湺簥櫻廎ଗ欂漣Ⱞ狯矿ㄜ㈘◦ᙃ㬑硿ଟ䇸忊縆竷櫫憠毻緕㈕粧戇伎�⠝等㲳痍懞∖朆瀂䷋夈墤㴓杗᷸͑浛犧æ䴙稖⿵怅磻林ⷞᯙ矫忛溿ഏ儯䁐ሤ伺埩䦯曏㓎ᔞϳ栆翔福匚ᓭ䠑嗔厽ѯ瓧弘ᐓ绿卥羠皗獞徟簍ᾱả簼⭟ⶍ䰗摾㽰ὧ瞿佷榙᠍徥噛罏矿䬜ਕ刀䀘㾒ᗿ歶㸚㠄侖翷Ű㒟漿✿㴃纽徟儝⠐㾻度箵憟淑Ῥ欮滗牯ࡅ癧礉䒘缓祟竰ᛏᐟ䠚缮ᴯ瓧歒ਚ怒㐻繙䳟捨吜瀓Ῡẉ眀叟„䢤唹窶〉㻳瞺罓㸻紞福瓯悿怟⠡崝䀧匦䑋翵䎥缲㳬ᶛ碵琗恟䈟✞碝䂰ᐖ怿忼䏚Æွ縇硇瓀ႝܠ搡⭝砥犐Ⰱ⫹翈羑纎䒗硲ӫ撟弍ⳮ姽彈⟶㑣 䁲睉䙋岅簗矟泠⋞⊐∦ᚖ‷恑ₚ¶㚒⧈؇獰ᶯ䩿ᮖ䭝ཛ ျH䁨缲㱺ϩ竭埏暀Ⓓẞ乡䓩*䐫し丯彼ŲȬӨీ墠䶡璨瘤က⠈灚悖㽆幰E窀ಋ浳䑀䣞稢儚ᠮ䠶时₋ęƙ縒穤୷潷䃥㶞ᒣ℧倭䀏燼䞪ྚ给Ȣ㭘ࢀ῀⚧↡ຜᨚ㕑䀅翺羾置ŕʑΟ瑟桿佟㈂尸㐪总ᇬ柘䃅弇㳀ྐᒀ㏠䦡嘼ᴤ楐堲⁇傀ℐ䄭Ḍӄෟ枠⹀䤎䪣羛怮槯悆愀䇓̷ͥ猈ᔰᾀ妞ኢㄥ䨯夌ᡍぼĊ䆙綮ؘ牰ថ㢑ⳡ⊢吤ਬ㐽翧忉悳㹗泅㫉焐ᱟ䶠爞媢瀘㠨搾硚羯ö䅠䊺ݺߨᙻ婼㡁䧀䰘琨⾌寶ၻ䄘䈟ʿ祄廀塁倜ゥᄬ爏䢥羿᜴悷⣍dž�漁䓼ᒥ嬦刴塕恰惬⅃ȡԂ㧢ᐠ曠䲧侠而㿧䢃ᄇ䨾⸋窋热暰ⱀ擁傣䜛掔ਈ䯢垫Ìຠ䈻礫犴᷏䡰竁Ҽ嬚掑搵嗰炙坘䉌䌦Ѽ྄ᖐ㣠嫁换㼻㘮 嗽�㜹ↁֱ՝㚷柀㓿ᭁ喢ਊ㨑尲➩梖僇∈˒㌋ሸ㠡ㅽⰛ優稷硃䢖Ⴕ㠩緣ՈᎰ㢦㱁䞐撦䴩䘾㑛梍䍊䆕糓ފઽ毠ェ⯞䄣氓ᘽ䱜炏惻Ṹ䌄نஈᛒ嘧æ㈢ⶦ႗※⒬႗ㄙ↗巐祊࠻拈Ⱨ▢㴝㶥洪䐭汑桪彰漈屔ୗ熼፸㏰溁㣣ᚦ䘫⨹ᑉ₆焀愵䇫叠̨ሿྐ潡㟭紤Ⱃᨷⱉៜユ懃䉩爾ଠ࿘㭰币緢㤧Ī擃ᯩ⋂აň䌘㧂廐嘁䒢䶦焮娤偗ႌ悼湂紮١ິ៸ā⯝㾙圬爼ɇ⢚㝙ℳ䊀䞋烀ᆳ儀稞㡂䪙Ⱁ䀼䉁ᡭ焗縳䏯磞ࡱ❘⺰慁◢㼧缬帲≚硷ᱦ䆀≁ጐॺ槕廠圱揣僸稰扁篒傤䇊䋙ܑଢᇕ䜓ᜡ㡢㑦䊵ည瑜柛僿懫䉏ҩࢌᐤⲨ䜾┣婧溂䡡ᓵ睋玞ᇇ䏃؞าᑘ㑨䤁夙⨱ツᤶ梣Ⲿႄ丰ඇߞऽ℄⸠Ꮁ稰Ѥ吐户䱎䖡ᜎ⍜䟄栕ᡈぱ筃慧⤯▋幱嬰⤈刔∳㮹栤ⱨ籪磃客䙀放吠䌰⣹磢硶㧩୫ش繱濒⌭⼆㡕⒃कᇉ⋌䙎只ᥨÈ噱烂敥坃摢⩃摯䃍⁑⏉⤔∪Ᏼ⨻♊ł⩥Ҫਁ㉃⑺⤁䒣⊙⌕ඊᤄ⢈摱⣉厩㪬┸呑қἿ℡⊘叙ࡺ᎙䯈䏼㌵⭥ʮ愬ᩞ䫈梡䅙䋴䙭࿊Ვ凈硱㏃筥ສۊ㩑氻烗㼖甮䟷ጜᜈ㝠壱Ⓜ፤劮ㄹ剒⡗椗凯⊞䝍ऒዜǨᆬヤ♲簰呁ѻ⛻⏶ߒ呚㨈乑峃慦ᯣ穢㩀䲆乥ূޜదᡘ㠸䙑殣ʬጾ♊ᆣᣲㆾ䨑䙍ຑऌᅎਾ䏃⮓甠䀦䮹ಟマ庈授奈㝼᭻ᚈ樨⺃佥禩䬾晃撑䀽㓯ᘁ䞥੶ᨵྨ䣱ፂ⸧伭唻㩄ಔ棐ㅡ⏵䓋ૢ䢔⓸筄ւ儠䇧枦㸵ⲃ䢻㆗㧶䛃敔⇈暀䏃涫᬴ੋ污棗冐^䑶ଠ測じ珑ᆃ⻥溨穑撙㥈ᩉᐣ䒒擈搴㱱㷑གྷ⧧㲫怋牕㢍ᣋ↲揢䒇స押㎘ᗑ㗸氣奀䪈㩌履㢪ㅈ扃䝷玧慌㵈呱挡旦☮狅⹕岅壮兡⋽拃斿՝䞸澑碘ϥ柖縻䗪瑹䣀ㅨ⎓䕗Ḵ䘨刃佦ឮ⼵劽罃刼稻抍ኇᶼ 䇑瞃䅺ᵂ楚磽嘲䱎笏ዘ℘洑ᑂı㏄⫢粝湇悮感㪝ঞ☹䐘䁺䫃ሦ疮┳ṟᢆᤌ㬏礟䝥咷™㐘䭼埙ᶓ恩弴Ś㱶棰ঔ掶恐ѡᓙጤ撤㠳声╔悿䅖岐壶㺱振䟽൚ັὥᦖ䈳䣙ⱥਨ䅚㢣Ӽ२Ꮞ䘋ᚢ⽘翸昲∁ᝁ炷崡䊞ӆॴᏣ䚰䢎᱘⊤䠠䄳呆曶䢴ᜢ㥗⢩ࣁ槰ȝ⊨ੈト殱擩姱㠤⢺䮠㡊䔕ূጅ箨䳒㭤簰ণ䩄౫爱䍺悢䓫ਚዕLj䧑Ṧ堦㶩惼繉đ刱䫱湛䒸溾ዽ䤹᳄㊘䵱怳⡇粫¼ү扥〠䨗䈰ヤ䴀ܲ㱰綩㱈沢䨄㘭ⓦ䐶唬愨ॲ儨ὼ姐㪀ʹFҪ匹婝ಇә煼爒щᤌᣄ癩Ҳ㩄欗咱䥉剦㕴㤖ጵĒʨǨè㽬㵇㤠礰᥏㊱䓂ᄵȿ䚱㟄壩櫠ፅ汯䲺ᥟ割撮凝礊⛔ዶ曈ჽ֑稝孄ଖ㘫ᝦ屰夘ሕ推䓬䦂ᡁऄ䡡Ꮃ筇宮控㥗㊉攉ᇻቢـຨⱒ㗄婩侲‧㹮Ⴑ㥌≵攊䦯挆⑸䰙ᱮ䀴怡ИⅭ‶灻劋⒯১懹φо᮲㬢≩癐ㅫ༷穕࢈┑凴扠♤佡ᜣܴ婉፱㔪㠪劷䕔Ŝ䓶䥼ǵ䧝圹ᑒ獉両ⳇ噬ಱ⩜㲃ᝓ憌Ꮲ╴佅ᗢ㛼㶩ᙲㆲ祮ⲷՋ䩯ᔖ⥱䆱⑸䤑ᑲ⭄影▕晄㲭⪸楝⪄擆Ķ䏎⚣ෙኪ㿤嫉ᔼ狄啫᪻啌㡒咯ᄫዕ媻അᆂ⇴䛑絲⬤玫ʻ᥄橫哕䦎剶✚䰉ᜊ乾撽䑀ܣ⨯㭼䲮ᓂ㥃✐余ᡤ徱熃惄絮檿煖ᩤ㒸q刣⒆䶩ᖺ┄咉ჲణ禓ሮⱔǝ嵍⥱ū⚲ߊ䢺⟨沁簂廄湬昭ⵖ媙㒶䤶ቛ☵⎑㖎㫰ᥲ᳄ਯ墰ᵌ栰甞⦤功ܲ䣉ᩌ㻫☮␃嗅䝨䨡ᵋ媎䔜℃匵╒䣑ᕊ㧽╀吱凇敮䪴戠窋Ӊ燄剂⛆伕㉴睉揳篇嘕拫㵇䩩瓌湁勁◧ౝᤪ楜柅䉩₺ᕊ窋㔜䔐卟☆䮉Ẳ㐔簉ȴ֛䵯ᮬ畃摺ⓘᥖ厒妴䠦ᇔ⺔䘮儼晄幯䆻⫹犏擸ፒ⛺䰍ᆂ㖎ᖩ✳细შ㢲党䚉壀⥩剝❖䬵፲㵔崹唳细ⵯ⺵⍑檗㣍䥤㏺✞熠β⣈瓘硲⊆䩨ϴ摠ಫ楠㍶ᢡ仍ᔪ⩬嬉䡒℥哩䆾楐媜㓏楨㊟✉䧭Ⴚ㴬䴉䱒摅൬ᬱ捊ੱ䳼楜㉔斦䮭ᲆ㮔緉㖳⿄岮缴兤㉿┗ᨎ吗䕑ᣚ㯬窑߲ⅤⰮֲ櫠窖䲽䨘㍫㮩丑ᑆ♌樹̠並䳪ા㵒剸壅᧦劏♅䥣ᩦ⚨㦡湴⪇ࣨ璾啚俀䲪ᥪጼ⛎䨙ᕶ⽤紹嫒䲆᭫弰婮⳰及晕䫽ᄦ㊬䵹ⷲ⇄㱭妷梶䚐洐楥叩䑖䫮ᓺⷌ嬹㓳㦅ᚱ᭒ᩳᣚ⧆厶教䥪挆㑔潹㇓繆竮㖳᭕噽⤒ৱ挶栆䩩ᢖ⨔䛹⯒ᭅᕯᆰ㍇♪沼槃㉧♅䤨ቖ泹叓Ɔ烨綸獛᪖沨ᥖ㉾枍䨻 ∄䇀γ澅ᛪ⒵ݟࡆ墫出捪ߩ䳫✬秹仒焆幬㲾千扢Სᧄ䑂昳䣍Ꮑ䫔䥙㶳儅ᇪ䛋䟮♩ᔔ㧸㐈㬈炥ᬆ⡔啙䒓檆嵨玴❓榮ᓿᦕ㍎晥佷浖⾘俹綂羅嚱煀⺝䲹㧁㊖枭䫻ሆ㡘䕙寓ą୬䰅ᵂ㲚Ⳕ㥸㉤㭓云济㍔塙ビ䖄捭᮳孙ڄ₦⧒㳑⚨↙ᵪ㼴矹Ꮢጇ嫪妱㭒ړ⽻㧔剒ٛ䨗ႝ侼䁙孒⬆⭩㽂⭙皒岷㥗≘⟭仝ᶮ⨌穩ᄓ檆䇪䞲ⵟ䚞ၮ榢犋⒇䯍፮㏹ 慳�㋨㦄୕劉㒭㆙珴摷亙╾䏉⾳&棨㞳瑲䤟㉽䒸䮖‖ご䞱䜓燥䯖嚲潑ੲ㤂㥽㈺曈䠿ῆ㎬厩樓翄᧯殴⟽毆㽱槽㋇曗佳ῶ㇌甙笒䥋ᱯ爼ᵞ湪ℾ䨛猬䶽ᆆ㷼妙ᝲ栄屪ಿ㍍ኧ䣣ु受斑䨇᙮㈓ℹ竒ঐ櫭Ꮍཝ䉹ᔀ㊷⟏仃ሞ⮜堥岓唆ᗯ碾㽟㚌┓祧㋥曛䶯ᰡ⏼䊙僲䠴滩掲网癱惒楋⎁撙ထ敾⌜禹漒凤姨熺ẝ䳺ם半晇䤨ἡ㢢䎹⌆澩䞴Ûᙦʨ稉Ꮠ៍伝Ỳ⼢匥㼴歆塎Ά֢ᙧ˔娔獏晰⭛ᵡ㏼䏉䄪缆噫璺ნ㺐䊽䥇媧曯ᶎ㘄纥㔸㊅槩欴⽁♩㲥槝猳朼上ۏ咏㧙㳓睄᱉翪罊ƅ㳌秔㋿摑䭬١㤢圥䀫ំ硉徻捏纍㳚ᙕ䬐壡㭢䞱已ࣄ*ܶཋ晱瓗嬓猢ᝀ䫐冮ー䃆櫲䤵㉎䑰灎窆⋭秱㍔斘䦿᫆㫂礥⼓揮⦹ፎ冝䳺䖡ኖ敄〟ᶾ⯂䐥窫ᝇ♮徻ピ兯ᔎ䘖㎚ᗜ䶠嬲⚬嬥ʓಆ㡉摸杀湡❴㛦珆ᙑ䥈坑㞼春勲ڢᅰ㸻⍗ㅼ�䘙獇⨷䣫ᓞ⋿ᑩ䩳昇ⶮᱸ缩物岛१੮ᕬ⩩ᬶ⚜仉˒⦄Iઽビຒ䋬տ┵伟ᑎ␂継㽳ᄵࡊ䡼梤五ዳ䕐涕晏䫟ᓱ␢籅缪儵ы㎳ف८洟ᵉ̸ԡข㙈癉嚲Ҷ匢ቲⓗ熑㳜䕋ୗ孶䳄嬣䃨ࡓ䲴眦ቲὪ溉ⲱᥕஙᛔ⡸妁⦂猙形瘘幫牲݀⥧⋪䗦଼᠒⾉េ㹲罥ၳ̵克灿Չ⥯繉▪䫼ᚧ暫ၷ剢籹㲲⸴墽䣘⦅挔绷䣜䭰呞⻲縙ߒ户粓䑹罖䢉Მৎ䬑ᓊ⹑ᣱ㴢塥Ȫ溷哮穹䓞ᅰ㲿禣叚ᔘ⢱Թ⿂䗅⢴͎౼嵆ಜ㊲䗉䯀ᚓ䡔娖ⰼ䢘婒䘶泩ᦶヅ㾥䋤斪昢 偷䣒䪙勓㖴䍪瑳瓖䙳㋐斨䭎䝂⡰怉㑂烥囫ᨇ櫁ᑷ泎庞ˢ◌䩧歄⩠ᢁ⪲夅ᳲ夵Տᙽ泔庐拱敼䮇ᚏ䪴勩㖒䔅㐣破旨ᨮᾬ㻇䲨લ▦媁㭼惉礪ᐶᝉ塵亙狇ր䭣▾⡫䯇䅂扪嬹宵ᯫぴ罛祻㳞䅁ᓾ岹㼒糩縓䔷ㅌ繲嵗㹨犿槱䫸ᕢ䬸彙⽼劅ừ恴瑍㡹ᣇ⦚┟祙䩕曍䡴叒Ⰼ濅⦳ᜦ⭊᮲祔䕻⌚斀珯ᆨⳬ彞♒圀䇲玵摋ᙶ䋂奰括ᘋ勸城⿓ᓥ⋂簵ݠ֙㔥扠Ⳕ嚘䬖效珊䓂⼂廉げ冥楊疶䓉в勃憄糇ढ牸土䲋㔪粵寪µ⣈侷動⊌岬数ஜ曪⥲啙㷄嶵Ӫ屷摺壞ઃ䪲䕰剔堀Ⱌ務ⶲ玙縒繷㥋ᅼ䵓檂䬁䗞⯇ᛎ⬇ᠵ⩊䵅ɋ䨇泉ᅹ㝄ᕫ妀⫋⥪孥愵ᳲ⒧߫Ⲵ䦟⢧㤺ਬ暎⮄唅⣪栵ో䫏нⓘᖃ糂喑⯙ᛪ⯻ᒥ⠔懹䍊嶶櫊拁暕洈ᕰ匦栀Ⰼ卞⊊橵罓㾄磏啳嵌兦㴕ᤳ⩣⠘猰䇊⡠卅㼵䈳⛏ஶ䃎喉䪫ঋ⪖埰幁ྜ堅ᵋ㾷矨ᥱ拕⪪ᖓ⬮基䧚僎∬怅ᭊ㹶䙩侰奖䦎⋆㤬䩴ᨵ⨄㰊泅➓ዉ宾䕒ඕ⫞喯⯢嘭⪥ᄭࣵῲ⣷彈䙼惙ቼⳭ৯䯺൫ቹ∠岵碋ۅỈᑲ棐ኈ䔠牤摵䤜儊⮷㚙⚊㓚盍惀㖜檼┮˹哕ⰉᏫ弢娞㟋㒇刪㵎൨ત㔹⮾吰Ⳓ崥ⱺ呹↊妴懭䉵嫅ս櫲㕲毩噃⼆吹㵒䋕ᖋ潄㉌㕳᳒㖂欂喟⩥ᕼ⣅ᮉ⓺旕ࡒ䤶ⷈ䎻ु浢˄䤮歅呔《垙⽺䞩例ᬷ籮㭿䃓嫖ׁ櫺唤乧ᐥ㬒矕榊ݶ⧋ᵀᶔન疵⯺咩⧹ᛆ⥊䅾洊廴ُ䝵曖䋜疾⯅䁥㡒井箲㺷珍⩸⻗涑㫲姵檒圈⯤健㰬撵峋悇毋穳盄斂㪽Ո㌟◗⤾噞⬺亙Ꭸ㐆䭮佾曛䅨⋂畣橜䛯⣘䪑Ử欕ඨ嬳召ⅶ囙煱嫋㕶䪋硍䧸傝∬䖙ࠫ㊵䏋潰ݓ涏⬍㕉刳嗙ⷞ夽㕪穩愊戴喦枵经嶙ઽ㕒殷堒畲Ħ╸⫵㮫⼷㏯礇壁熁笔ᕫ殿唽⼡匣㶲刭㐠㲴篎▶ፏඍᬁ畄㍚❩䳜孆㎪䏵耊俶᥋憹䇍綞ⴜจᬐ坖⬊壉⻚縕㤋悏ჰݕ嵹㫦ඍ䮈㛷岉㲲嘵○珷Ɍ⦶懈ආ劭䖈毘㜻⼍㩊皙勲矶㗌匰绌ᕠڤോ氄㕵⥈哃㘚䄵今㟶炊㖼懀嶋ۆ疠᪬ᜭ⽰岃Ⲋ墥恫櫅りṵ兇ઞಢญ犩✡⦁夝㱦眞圻ᑔ⃨㣲⥍熏瓴䘄珣栘派媃⇚禭䈋ᩖ䍭睸໖ኔ೬痙櫜✃⺑徭㳚䰠⊋ї䱏嵶⛇捥䜘䵅毲㕰櫈嵭㚦䅾⯊䙕汉л㫘䵴ඥ㖰梱媉㹺䶭㪻䌄䊳⧀⍹⫁ഭᬒ㚶⡉囃㖬䚭瘺䍕廋㝿⧁⺌劯䕰櫪柆ש刃㪔垭㌺䕕把䳽䛑㎌朅䶥㋊㘐澔吂⓲熭湓兗篌㝽姝厙曉ൽ朼椩嗉⃢篕㥫媶翍ձ卿䜕㥏ᮝ摚Ⱉ埉㌺春䦇࣋惷啄⍿挚▧ᱪ㔞俣㈶夹䙊倷⿈ೲ㽌敿അත᫊䛈漑嫳㟦欙ⱺ㖄又㳻烛⍦㫑կ犞啄喡僅㊆淭៊態廋勲盉ች䫗䶮⭎㘟⫹嬅➆梉ཋ側㱮祺䗕䖐۽ᕟ檙㖜潪吓㢶撅总ɶ捍⤠⋙䕣ڽ䨌⮑㞼⺒偝㾶卍䞻羷䪌ൔ亍⳺ᧆ媚哈毎ጳ⾶恕徺ᙄⶏ嶾卑歿ᒰ䶊宊㚦䳵剓Ⓔ繍䶻ӗઈ૱煊գ曀淢⩽ᕳ䍾卞㿧ᴕ侺楶曍死ᛚᮄ㚴ෳ歔咎䥽ῳ㬦柅┋揇ڋⳳ坖ᵿ圏䵤孕伵冻⚆喵狺ↇ䗋㺵竇暈⳾㘜傞嗙䲍峭㙖䳵㞒�㪾獉宊㶈ᗝ嫻㓲猡卑⏶梅᥊ㇷᗄ官努◢᭮圦俠婺㍖晭婕玌ű潃㍭土ⵗᰍ㚎泍崥㖖糭Ὃ簆矈拽Ⴢշ犭㕺寪⓮澭士ㄖ䰵㓪㡶Ῠ廹㻕⛧旤⯊㜞溥坩›屍ź䘶彈Ṵ㗜ݨ槢ᬮᙎ溵圻⯖琍祺婗㣭棴嫄歧糣ⷹ獭㖚濭喙㪖䅍拺Ǘ疍懰ዄ兹禽૪ុⶅὫ◪巍ᑚ⌴捆⏝䮒Ⓡ්牂㟋䯮傧㏖绵㧻兄礊確ⵤᮟ䓍ᦹ檟㗞ⱜ嗧㵂僭Zᷕ盌獲⏅筴ᓈᵯ䩗㑙佳崓㺦䟍ⶫ綶➉滸㮑ຣ浬㰔琤⩩弮⏚稍ٕ⾋䉳㷅㪅圛洸㊨目楳哧〒疭䁻㠅洊㫰⋝୶㜞㡏ኑ㞚檉噓㷮名㥻◖䵋ዻ珛卧窯敩ભᜥ梳ኍ㙢殽伒䗔㴋᧻ு㕯ᔛ☁㉒畚⧻ᰁ⚜祽䁛罷ᙉǿ嗒坲囍ᕛ㍫⟍⦾嚕㴈浙冺嫵⌊⇳㭼䚶帇櫺璤濆娑㱮奭⫛囷ⵍ孴✧੨滠䶃㭊㒦䷵ᰵ㚬狽⤊ᶔ綎嫵㧖嚷涋㯴栍泰佌䵐Ѡ圬⮶᷷4督#ć㩆甿Ⲏኝ⪐ಞ⯚林巽㯖督፮ࠨ碲ŝ換嵘䃰㠠羔ܣ巸參䶂端ᵇ䶓ǂ儧怗㨪ⱝ忚क敆ϺߝJ䁆⚈窾犃濛圣㨾愂ₚ焗刍揸ྜạ悸筱眳橂栯㲾穝穛㫖ᤉ䏽䟋摹Ỷ㵄䉉ؒစ洼䓊勚凚ഗܧ䟁䮏⻙㊷⢙睶ɬ暆~擝焀Ⳳ礪䜁ᷢ⧌弅㴰稷喨桇幏㮾嫝➉⬗梂䲫៉桓ʘ㊨䡵癋楪桃ᓾ櫭添ṗഎ添㗖坼坃㵶笵ƻ橼䌏⓾寝ڋ㱂昈Ḥẘ⛥沞穟Ⴋ䫕剢⇾缍巚䰈䐈ߴ梶ώ㜎㈶篷䎷ↁ䠏❫㫝儻缷␏㋎俕ᾟ窄続ⶺ澋ⲧ嘲泝匛翥㌍滹࿔杮㻡戵箺檖Ƀ月凞煺ቜ䨔☈厬奈䊥弎累猘畉檧垷⇞徝ĸ❘䯿濙榁庫㶅稼盫潣桟㈾曝ማ嬕⎑㟹῎㾌Ẃ緼穨⯕睏冏㾞䅉籚䑖⌉旽ௐ➟㑹㷧簃甿沬ŗ叞睝䗅狱吋俽榥巕㼛㷜嫃睓洿兏☞缴⸚,䀋惁ៗ⩱粥紶穀䵟徳⯎䘝Ớ堕⻥䯳�羘Ǭ䦻⍶ք̗⛦㣕䯛ഗ⺏埶䚷ĝ曒癘ܨ⍀㫸Ջ⬚ᔴኺ⠹䠇మ䄀倦ι突㜡湇擞䦡峰囍ᑁ堹䢶瓠䄓ȅڬ凰仠㉀澡痑ⵝ䚻偓古羍引䷿窅㙿櫷勁š䬣┧䖳㐻࡛傚䄑溶Г竲皆柰㫵䦞碝恳㘖猉ၕ傆䃩䈈㲎䖘ᤏ啀燡墣⒠⫳珴ၕ惫ȏϥ㗶琷䢝巷暣㓸ᘬ⎍絬ℇ䇶噡ޜಯ⎚䠀熓Ҁ㹣ခ࠹混翅Ὂ⇵甙و椬ㅓ⬰竃㙣䞛尭㜕ᑖ汚ە↻昮Å矈ॣ惰橁㚡烚磕㜉翷ᄟ㐶䏪⢺ሔɅঠ㖀⣼呄嬣å僸憥烆ⱘഡ構奰炑㓣浳☏禢墜ワ㒁䎰¬መ偱ዣց囉犧䀕Ḋ⿄㢀烶ਫ䍚ᎀ櫨䏦⊆企惁禧喖䕉洸拱焚懐砿ك抟☳Ⱌ妸䠲缬举瑖㢝䪰ᇐ患玆桢ᢾ剈៘撀⽃䓦Ჩ䧎䢫Ǯ州婬痸ᨈ㖖ᄈ䩃㚛䳤ឨ≒瑶偗姐䭩൭仐㳦㾮犽㘛㭧䊫ቜ穉䣵壦�悲⛅据ᔰන啜⢡Წ䘈ㇶҞ䲘⢾⌼䞺焛ऴムᶱ彃曘囧ྦ猱⒈ᒜ冰⏸䚥ล༪扱掱敦囤帓䒉څ䔻㵇䋇㞿櫤㇀纱湃ᚃ⢱㔼ᩚ䒪汫卣㑼䜽ೊᣔ㾀櫱硱ᝧ㚭∡㩛咋䁙ᆧᶧ≇ᅲᬟ塧ㄡ䑣䭧秦Ხٜ穆ᣵ壴|䘳ప᪇囈憱掱ⓦ䗧䊨♕㙇䨤ᣪ煡⎓ౠ\"劈森境獦䠮∺䙟潊ಗ凢提䜑渔䏨✽㒪湥ि枤沃;⭷⌵䝃བྷ㣸璄䮃ᘂ䎯ᬹ癚撊⣵Ṏ⏂䞛౦ᾔ㕸箱唃ਛⅥʭ乚撋䨿⩾Ȧ䟙ຎᲒ价㑁宽烦璬๑牋ፒ偍挤㌤凎᯼㯴ᨸ枩嘀岭㐗匊ಌ植䇗⍘䜷ೞጿ䂽㊑㛂㮐眺塖粁ę㈙捿䛯࿌䪡瀩悲G媬䤠⏧窸䈸傐䑴䈆䠆ᣴ㒤缰ເ昩⊣傼慜碒㞑笘禧∯́ᯢ㚤溈瘃糸䪬点⅟䊐䔋梱⎗䜥Ě᧴ⳡ山噇ឯ眸煒氰杽廒挿䜛ιᤄ⌑歀繇爀殬ኍ䓩ṹᐞ戫䐪ř噩Ⲧઑ㕆玬似䅑ኝᲖ䨏⎇禿ԗࣴ㢁ᑊ፣䕦景㑃灓劘㾘䧃ㇶ⚬ዹἔぴ姩歖升Ꮔ⩥撀曃倰䎇ૢ༾ῒ㟄燩垳罇ყ㲸禈㩗ヵ橤揃ُែ儿⯁櫃▧檯匸║収䓶㇌匯䙱འؼ㴘沑墝假䒸䅚䲃椀燮捥⟝వᬌ㯳⧮䞱庅ᙋథ勵糕唟ᒖ叩䞨ລᤃ᠙⯉揲ᣋᵭᷖ畒ᔆᒧᵇ䨿刅Ḋ㎰櫉䳽疓፯㊹媏ᓥ檵榺䘢喞㱤戎䒩䇊羵皹ᑼ㪖⤗盅揲䠙ྗ⧹ᩈ晱惑橦ⶄ㘎柿檓湱䋛吜䛧咤च㺔汢犵ç屮Ҏ瓴撞㓥↵稙㮡䷍䢙怔抉冴ള毗㎉掷亣㏒缇叐寲䳼⩦㜬缼義撆㐖⟊ӽ䥟䮸樁叹猩倊噆ち岉桓厦ᣭ淉掶燒䳻⦼㏩᭐㕓Ἲ㧔椬翃ໆ⯄挹博Ҏ䳲槟ᷜ柙仒欜圸瞒壽⟦擭▸ሧ㊕㽣䦮ኟ涩ᐘ悪僳Ệ㝬ଔ歟ᚅ甂榵㡏᎕企⧶㉬緉恽ʲ尺Јɘ䚑ច妼䒈䙴శ椲㪴琑䇓ॲ熗涼埍ᇇ㉿擋㏜ᬿ෫᩹勌羉繝绦ử҉ݕ懝ኚ妫卲⛏พ漚㣄潹穓炆綗㪏䝟岈殆㨛搌㬙䷜氆㨼瑾爣ↆ䌆姹㟓䀣ય昄柹亳ᮙ徦⻙佳⌇ʮּ᭞坑崑姙㧶叞ᕗ᧻ᰅ㸨ɜ᾽囬㵋ⵜᚎ棰秱䍉曘ᨳ幜敋ℓ⪘叭䖽獘庘㳠㦵匰宆䷜晰㉸硩簃垆扮庽˳絓㴎ર䆻昨喿Ỷ㆜溉䮓ᓦ淬⎾瓶㺋甖秘吀樸䵱ᡂ㍤殙䔳屇⡯㾸慐㲐ᓱ爐Ꮪ⟽仓䢓熩申‶䣗⎔児ƙ䓠㧏⍗♢֚῞㟴戥疹ῲᡏ⎿⃓)椇᧠珫⒖䳎䤮㪬歞檓ㅪ珯ᦏთ粄㔝ׇ掽櫂乇ᢛ䫢羹婳娇ᣯ㪋祓犄洁⓶୷歃嘗᩹屵㑥昫ׇ⁺䊾ᆋ崞תⵙ厕俑涼㍌癄檫䤶惬桹烚ൃ⋥㨕掲㮑⑊Ẻ㼪⾉攫丧ଯ㡿卝䛄瓯妻㥅扣坊檁㐼牶礉⍓ẛ⌕䖩䆣勃仇⪑㾊↥焫变䴧✹㍿彌ዾၸͮ昨琿ὰ㒜笥䪥⢶䄔扼ヒ檍ጔ燹◦曰ⱨ彑バ瘁䷅匆ງ摻壗溘⌝┟㎂ᛝ䵓哱㭬櫥䥫夷㕍䷪擾楏泣妰䴽ᙩ样ᦉ㵜狥侫绵穽⭑盏勡વ㍗晨〔婉㵗㷙熭·僬Վベᚖኊ䘞ቐⰴ妘㎍㱴搫༲硏泘ↈ玅㦠㌨曧久洶㽲恹捫禶坍⮺ᚏ甉ⴈ枰⡡䀜榩倓丶滯⑹惛䫍狲䯏枡ⴜ审㻧坍ყ洯㖉ჵ再烰星ी柛令䦄㮇㞹撞焱ߑ䡺↽䖘ᮬ旽䰌㉲⾫ᡅ㌻䍅䩶牶༚噺⒳窘挀᧡䵢琉ⴲ媻埒楹義ᙷ⍎⺽牙撖⥣⧚厙ᘥ⽖ᶅ㩤秂嵕ⵎ㔍⦹ᖀᴊ䗜䬺៖ⲱᲛ弾㾢石旧灌౹㳛䫞⬚嚢庪噜Ⳁ⬑げ椵緫ͺ穌綿櫑喝䞎▭䯑ዛ䵊塚㪂り䞩㊶抗浻᭚㦏؏⮟ᚲⰢ定㩶㟵氓潷Ɨ⬢悦憉栥ဨ殞坊䰦奞㮵⩕䲋堆䧏缸繶כ熟䁱ங䱚展㐱⋥泫癷Ǐ婭曙疜糡暪㏪ᙎ伪婋敒盕揓㸇⨬嶼ⓗඎ狳禣ⴭ嚭㖖崎囬盵䟍〉旍⦽ፓ㦋䌀旓⮣圛⾶嶞㑚禹库烷浸筰嶔⫪嘑⭘獳ⳓṽ㴺浕攕⡳㻍牾ۘ疌ᴂ妲氉Ꭳⱈ崭㢂段䋋旧睮坼ᵗ囊ᘝ䵌垅ᔇỼ㻋⥙弳篧㇏䁿䛖喗㣯痾ˏ垳䳈幮㛂溵䐻凷罏孿泙斚ܞ䗐ᯔ回Ⳡ尡㦤渆硋堶䑯ཾⲌ權ᓯ獀圀⾒嫣㺦竑㖅摺㑣㍻櫕⎄伾㗒厽ݻ〞宣㠪楌澓㝶ঔඌ睙疀䖖槺᭦ᘿ⽚媝㬒籱塋忇槌罯杕綌狰䶾票櫄潼塱㴒曙義繖窕哻䎕崋෯㧈勤汷᧴㊦澥擣㖒೬㡹䇟疗⛰ዓ⤶㙋䲹堮㴪晭橋浖⳼ǚ䖁⋦ᘍ⭰㉘ⴆ壓㬆欥䀻げ皏䩸㧕㻅㫸䗨家㛻⾮复㭂積犻ᗶୗዩ凐ᶁஊⶦᮐ嚢䶠太㲲慕吹䳗双ᑹ燜ᶜ泪殰㜜⫪尝㞶硍伽棍ቩ盒䎎⌙㗾䰉檴⽮尫㕂緭义㛖斍㝼⣑⦂甚昔寙⫖〆屸唊繭䢻❌ѹ穒㦐䗏㧟䥆㕲淍巋ヌ礙掓䷗䱺囸ᒻͧ渳絪䨤Ⅺ៣ᶳ儧”⧻⛡枍擺偶秸盯紻孱崆狟㊛㞇Ǡ添浘ル㭴ᲁ媬ⶶᮑ㙎⠣姍ℒ俕⨜冧砈磣ῤス纲ዕΨ㮂溺娂愗㔔璖槊怶曁ᓡ¤⺗එᛯ疡ᣊ㰮甽䴀Ზ各叙⻔罛届㍐盬恤䙍漤Ľ䞅⒗㒭櫾姜极仦Ḋጔ睹瀉堆ც挅晶͔㋥痑槒ސ巘嶡㈜㖥澝↝䄝`它擩斓ᗻ࠴涐庣☉㮀梵淬矘俎疥⬊㲴ѡಀ້箌漄巗ᯚ瞏ᯣⓗ㓸ᚦ㷛ៗ㆐䨂察箍漃帋㭡㟌濎匛㕊翬Ί㎗码村穛璫䔈嶯磁癟䘩ᱟ⮒盽淜ㄗ㈍ツ⟓ྛㆂ㷇ₙ棈⏉ᵊ僂͝礔⅘䉬寷䟞➋^㷌符䂺Ꮇ屏㟚ඐبը؏㏹ョ⾁廥㷂篺癫漴宏䲑㗝䶛⊈㸎㏹埗ま弛▔愮㩻溯宯㙚瓝䵴ᐏ篹࿔↯㨠*ବ嘖䨁ԁ২䎬❒沕筫䥷淌⒌ओְማ禑㑙穦䝹䞻Q⑺㰮౯氧孫Ĉझ戛埗㣌儒㿚羖ጐ傓笹ư灎ᛟㆰ毤簖瞎沩�箘͞၇恃杮㞀⊠磺澰ရ䚡᠌㊡応ҾǢجࠄ熁䯠ύば㼰ᙀ尮࠾䀢ₛ㈦碠ϳ`ྍ怰㩀禡朣峚ቢᆣ倧籚Ẍ⢭碂推࿉塿彀皡摫㌧ʧ簾㊷㈯㥧Ớ榛䨼⥨ḟ堺Ⅱ渠ᔧୈ戾͓⟀儃旁ћ瓄ၴ㭮ᕰ牢ᅧᨛⸯ䀌偞ᨫ愊瘶䐅⁚ືႸ㽰灿䪄䠧ೌᑡ墕羗嬧∿ࢋ䃝°溥ǣ䃣ʱ㨃ᴣ⟷焛漏ⷻ㮰∃瘘㵧ඪ㥒ࢮᨀ௱䢗ᄐ⅔␁癣猲᱒㓿㓩䵃䜛㡘ᄀᬦ怿䑅࠱窛墀ǔ卞ౄ姸ⷈ䍩碣垃咪刐乤㶉௮ޯ泱繼Ⅷ杀┼⮷ᒙथთⴺ䟩╺Ḙຈ瓱攚ᬠ尦ⴾ䙟ಖ椞'⏉情ຄ殔㮱௱纐ㅤ熯䐤噛ಟ畮䡦揕䟇磑⍼煣欙∠ቑ墸᪡牟ย便㈊穋䞎䢵㭮ዼΗ㨼᧧繀ਡ旇嬄皡爕ㅰ2䷞ὖ♻槺⠠咑㶯倂ԉႁ竎㿰祏ీ⒀ก湠ᘦɮԁ̺Ꮠ⣜၅ᦂ㤂䔟ᗨ㎀劯乣ᐧ㹠丣摟㐼❮榘⊂㫤絘嬠็䟈碽ీ➯ᐨ䧩ᐞႄ从懲㪈䗩水 ሶജ倅扒㡄狩映ㅇ彨ৣ僄ઔ岿䧸ᐠ\"ᘸઽՙ揯䔙䧬v✲倘䏁≴瓙ų縘㈖瘿ᵀ䘰玹㙃∴符箘⌴⋇䂑┯ᗇᜡ➂䵞Ἧ㔜樕合盧≚笭࿆此糗㖂璨架䂨ᤴⷱ汄栧⠝儝ἦ㪤㷪屓栱㥨䖊⯸䪆㷶≜㏟䞶眰䒘央斛啑ૃ✵ԡ抪ᬆ䁘§慠妿ѱ旣Ῠᗈ㝤ţ惡ュ棁㐂栒甎玶㽢䃦৺ٸ㲩ࠣ˥䉽洔᧵汞杸⤛ᱶ⟦ⲉ噪⾡ٯҋ焣嫫璬㔄䚞℃争囥⑼签榙䄳❀⮼╓ⸯ伽㨓䢜㈼⢑ᆯΠೀള䉸斀厼డ互㧥㏹筛佄⊎㬼⾙掓牒啑Ⅱ獟暘窭渵䙝朵ॻ 㲌特相灰Ꮑ桲Ч暔皼砥⢂㇇ନsؙ掮ᠠᏮ呃犂ᡪ涿ɓ栓㡉Ķ㨢狹潨㨴硎䴳ࣙ䆛̅ߜத៑᧟ᶉ硱–爧ᠠ䡼僜旮䌂稝璀峘⺻Ặ㤢熸ࢫ缸Ր仲⣛溠,䉅斦ᢷ梑稁㤦炭䌁懴偿†Ǵ挧ⅩጋՄ䯐⤂⹅ᮉ㤂䵅癫䘛祎䩼哟些匉浘䯐⠠�ᙼ墆妕ጂ,䮮᠔*⁉㦠於㖰ᑯ緁泚慧㌊昍䰛ឮ⼄峙㹒爅掳潸㹽睤妞⌖६Ⱎ朱⼤巚ឪ疶ᾬ填ᦁ勘▟笳ᗠ汇㓙⿅橓㋞ᑵ敓濚ዎ樊᧓ʣ‵䁔熊培⺿䇵㫢䝵羦ㅅगតፄẖ㥖ፇ⯉㲋儴峖˴ྩ犘ᰂ囎ᦽ嫵ඔᜲĵ⍐࡙睕╭㦌͕稼ཷ怑絽绂ඖ横㰼ڙ型处亐磕椦ཷ枘䝿旦ⶒ伵㘀母ⰻ䁳炽䀂⒕档䉚捈♐᧲奦瑣ᜣጩ‡༉皝㴔窹栋扝翏沒䮥䶔ၞṗ徇堝僡嶭㫯భ盝䭀ܖ瀎慎❠䜑懽їⱣ妪䎏Ȋ省纈㨴撏怨∷䎙⎬ਸ਼ႚ䫓ڐ䳐敆簉්Ź潐㇟㔥䜔㗮ྋ䩦g䬄р㒋㔯施凐㨦㾩⪟㑊㠄漙煎ℶ獭派ॗᮀ婣ࣰ䪅䐦⸐両絥姱峓㳦煨ᬻ捖汏泾㠤玑丌㓳ޚ∙峒ж翱獐˗倨狿䗜⮚煊扇籔⧇恡幎ゖ犜ς⚎䞽嗞憟喥丘嚆þ₂㥶⚮⯗橁廥ᝇޔ眖廿ᔶߐဝ১㺧浐㟗ఖ緒疇㼨ᶯ淵㚐哻懭廌䉮瑭ज़暦俷シ剁ǒ䪸痒䛙暏凇濊獾Ṟ僘籡孳灙▶媠娕ぜ仫ḉə੬䴈嘇ᯮ䝀㤦瘨妴⡚塇䅥 °䀠䞽※အ匈⣀ል◥䫽紊̠窒䳿䐷㷳搎矼⾠徶㠾熙碛啓摮梢㳗ྔⲊ㸖ஹ砓漷彏㺓䫝愛林ฎ㯽㟝矯䐻塜㮭ፉԟ嵤浘粝缫得Ꮑ柾ボ庘⪄㸏摻瞐G屟㣟㔝憛戯堎䞓忘ᠯ缎䇮ࠌࠟ瀕Ꮿ瘡穈ὲភ⹏恞磞従怤⠥篸ཷ潜峿㬾碣缛全累⡜忘ᨦ缈甴Ȣ࿘ἣ䝊⛠盳Ჹ⚙⯏猂Ý瞙∁䐕ߡ石伈㶵Ծ粑禧攗嘿䠿墟ℙ戓Зޱ༰憕ᤎ¦ࡃ歶ℯ眎浒䢜㵮ሇ䗹簘དྷẀ㻮㿁烃漛犯樎䖯῟⤒弋⏾䟦Äở岸禎猿䣠ク㼿㯭礧ᤚ㼟巵䟺࿖ 㿠突璣敧涰㔾䯼㒜揥䈓榭㢡⍊ˤ࣠ῊӆⲾ㥟亭ႜ嬿ᐈ掏❃偪䀕╧ੈᓲկᖧ⪝畡ᐉ⠈㡥ἀご緉炣χ卯ʾʰဈ㧱䲑画⟎⑭産剟檹Ⱥ忇懇癑͞抆ഛⶣᣴ⎌揠ᨏ㎳ᕹ篁潇⬗疾ࠒ嚟盏ڭ㒅㢡樧ṄḈ㰆䩚备呦⎾筥ⶮ䊙ࣹ䔳侻Ὲ㌗࢙罄维瞪㲩ি卝澙4৪ཏ伦䂞㵛ࣹ瑫崪O㠠䃞⏚㭮ؒ௭猯篐徯湖e爫羇㨴硾␂纞䎑ㅾ绢៨摚ᤃᆊ٥粉強盀摿ཞ䆚ᵩ䡠䯹ៗౄ弩㲂窖ᅹࢷ䨾Š擝ڝᴚڡ㧭ិА㠹㷻瀉犈㷲兡Ẃڝ㐸Ⰸ垴⽭峱㾪稵糡橷涗䅿⊢▘㝏㼽ᐡဪ恸䆞㺖ʃ䟝熖╀嫜疛欚樃䰉厭⼸㧕㷦◵籼䫝族捾㛞䶟⬔㘂眊嶾ᢦ录㻃㢎ấ寻㝤络楿宐瘝煠毿㠲䴣㺦簚主粷橏⏉ᇜἃܛ慆漨㟤濱幝惚笕皻熤淇哿梋㽱セฆⰜ㟜瀝ഫ㳆綕綻眤暏ౙ澈ఠ䒡⭽樌ኤ濃栻㾖щ纋汛檏囿䘢ᮛᔒ²寯㟞澛倳㵰䎕琿∮⤏⠡廟暟綥ḅ㤌涙潃彫㷴笠悻罗姏➾糳垝攕༅㰒矪潪䡒㟕㤕窻椗朏寝侘悤崍ᘢ㠓潕徂⛭ܽ玌漗檏柾៝掚弙⸃篪㸗潑䈑佽Ӎ翑㋩䎽Ӿ娹火Ḟ楊㞨ῗ幧⎡粟ѐ潂בག⛝涘䪊䐖㓥⿲彽㯁⋣级樁叔䉞仝涛挐␠䄫៚⾿徫㸓⋅琠抡䴿䱩拶䫁∍帴刾渤㽸簮⮔⇧攄ᅴ᜶⢛担刟䐈畈係㑋ᛌ⍖ʠÉܾ㏗〭㊟攛ᷤ䝚ࠓ冂ࡊ㿨噳碎䕸噔Ⴂ窝嫟㬘汸䉛᭵ᾂ㿘籩筓璇欷筈奟暟甛摢ఴ楖偮ࡐ༠㷊悉眇朘▿桰崞䙮琉兀⾿ὄ䏗䇉憁䄷箇筏᳟ⷿ⌛崅䊡᠓╍ᒧ䃑ij氇䎾䵏䙿㕟ᷞ緶昞⟏ມ 㷲琪纑竫缤ᵏ懀䗟䔛獧ت堇熅㼤縳卫籢䀧溛ẕ涟朠炒ℏ⤾往Ńᴑ䂋燷瓏敿䣞埥匚丛Ⰺ栝⾹忻ỳ橍縙曷狏獬撬ᖝ怦ⷁ妴凌澼帺粍築㳗綏滿બ卂̜᭤⬚㢵澲堛㻟㺒篛羭䬪㏿嵹ᢿ彙∍䀳稌☣⣊佪ᵙ㡏࠙結ⷀὀ癲⭜戣ਅ䐜琏彵丬⫣篽ท琏汅⒟嫀ᲇ縞㸻װ‚ᝀ绌ㅛࠒྐྵ樿掯寮㠡⃞犖⠚䨒ᾧᶔ亞纺ᐛ瓩怿噟䗮⛂䈜㬮࠙ᙖ呂㿨Ắ僳箧白垿扟咞ⱐ樝吕笾俨厼䰫乺დ篧绯歀⅟䔿ㅜ戚క䊤〔䒍烉罬糷皯砏予ಟጟ㈜墐〵倞ᾮ㾰缵罣祇珏槂ෟ曉ᐁ䨘䪉堔〉䊝㼬网籿婗獏氿徰擐ଜᲞ琗暹濿Ό嫡羋液Ǘ痙扟䤘ស䖀ผМ栗怇ㄞ纴㸧紅煞Ṱзӥ刜ḟⰓᐗῶ㿍㾱砌縷禠ए纚㲟⚟匝ᐛ㐛砞〇Ύ㿤缑嶷磏焰嗟䶇௨㩒⮑䶞〗ᨕဗ搱ᇉۧ纃տ珿抟ᩁ✝昝⠔堄倊⟂滝翓簸垿瑟歟纟氧帜လ〄簄㙭翋翫粯羻ٟ罣域嬞朜ᰘ尐ဎ㊝羫纷絑簿羟綟梌漞㰜䴝䕦耗ῗ㼲縳糷粿疷矏熿狗睢䕩炟疻✠ট砄Ο瞟炽矜䖠༟猷瘟獴砟瘧琠灇璏盟瞼眠ࢠஔ摠લ恏Πඝ畏Ն疓ş癠獟烠煯盠୯營盟址य眅⒏ԏ眆❀ी疨䌀璌ˀිǀॗ爠९焠ຏ牚䞀੶␀๑∾㐏璙䟘圀ÀধȰ¿田ೠབྷ烖ʏ睯瘥䙰ිᑐऀહ;㑟砏睎煐൰༷畠睠૰ீૠ璀ྼ睐ஏ玔➐กú䍿烛冺䏯烏ݰષ炐િ瘠ࢀ猥獝䆯疀൴䚨నਜ਼倨瓐嘐࣐ਨྗ瑗瓰ନ༰ࢨഠਗ਼䍨ऐࡑ⑈༐৵Ԁү瘏坈নࣨట矐১痀ࣟ炰ໟ咬ү焗喈່ࡷ勈眀皞䄈ਈကய瓨ୠ࿈ಐಈઈॠ〸圈මਾ⚀瘈ഓ瑠ʀ甴ǐॠಇ眿瀠༸珨ರఆ䍸রઇ㞀畈ଋ畸൘ࣸరसை๗燨ຐৠे睘ඨक़ൈ࣐煕Ø✘ཬǘའبरಘৰࡡ璨ਗ਼䠘ূ٘ࣸ㈆盰瀤ຠતࡐҗ瓰玤皤తฤରઘ༤ఆ䉤ੈ摄ൈࡺؘਰፄ॰ਸി珘നତଇ犸࿊♰熤ऐ䎄ຠૄཨᎄൟ盤皘ඐे眄ර₴ൈค烄౼斴ৄ珘ਖ਼Ĥ಄ພƐࢤఆ䁴ઈ䛴ఄ煤ॣ斴ငॴઐగ矸ຈєဓ۔δ玴ଠ悔ೀྡ畴ิಸྼ皔ઈ䈔ྴ矴ඤ傔ௐ॔৸തऴࡘഅ爬୫Ƭࢉׇ䄁́ȁˬÃǟ߹䞡֞ɹƉӳ¼YǢϡӑׇ䍾㛚犄ߎ❶☴ۋ㕢狭捷䌎ծۊ؎ͦvۮ̔Ҽ៹擪Ⱦ̾Ǖ䋲Ȑ㓧熰ۀѺɈ̔ѥ⋾䖒̈́௦τ灀لԣ䋠߬ౌÂߡ۠ۀڼဂ߹α玠ذ甸ߠżૠ͐ᚒ╷䍍䄪۵ٴڹ䓰Ȉ疆盀ਜ਼䂡ݬɹpĞӂΞڜ̒ؔ䉃❇䃈燲⓰ଯ䔐ɰ\\೬ш燼༚ѼఐԢ¢ਐѼ่Ƣੜ༠╷䘞ࠛ!Üഴ˜燜ะଞڭȚĜজూކłଜȅӞͷ䠜ྔ⒦┚ଔà̼ۢର炼ШҼගེ،ԱѼ३،̀ءʹͫԪϑ،ш֩ԐۀȂલࣘ珼ྞֲະɰτ爲ంහͲوτ焢าـƲഐڢՒ༲ऽԖŲੌݬҺ˘⅒曪Ȉƌƒಠ恬īӼ2䋒Ϥζ㞾ֿƦȝ䈠 "}">{"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨⸠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽ᩢɀᐲᲵ䎴䭌ذ綞卒佢ᡨ侶䧴䜉䮂疲䀾䂁拠ᏹ籅懏扟䱁㍪洠ༀ兲ㄠᎠă䅔扐䖪䩀Ʋ㉰៶ਮ䧵㚎䏁ၾ厡暙单悥䊶ᛅ峔囵䪵圙ᘪ㊭姕㜍䯑盦忔ฤҐᨴ䍐乳帪惓喰⻀㦑Ë嶔₴⮔䚲༛儒怷崕ḫ嬒䲗䈖㻏䐖统怔Ƭ䑳ᩡ䕆ᤁ丢䂺啓ຜ䊰槔䦱⚇帨ㄊ㍮榨܃ᡀβ䃽崡䑐Ł全ۮŀẒ槮䶲恂᭐ベ剰Ջ唩᚜䳐噵䛖䈒ᢠ㙭䗓䛤㯐勝嬧ሃ䦵ₚ㒦㋻侫湀Đㆹ䑩ॷ䜒䦯䘓㹿䠓縠┫⸥䁬仳䬦⊫䵰ᣢ᭵檸ᠭ᪡卐婶䨡媖䦰䇑嗰⚯⢐Ⱛ爡峱܁剖䚰⹖ᬋಆ⛚ⷬ春䚈↲䴏㈁㴮䕸㛐ᶤᅌᅉ㎠皉⍊斨ॢ冚㣀疅␢㈓冓Ɓ㗎ᕜ➗燣哎Ẃ㋈䧗引嗒⇈⧭㏭㈀♒䄫㏃䊐⌊惨ⱋ↱〈䗸㾈ጳᨎ◪啍ᆝ䖔ພ᠉ḟ㺩亓䖫Ϸ∺煬䨺ᘍ⸾न汪喲┹䨕㹪㕪⦷ⶊ⍫ٺ❩冚㐠ᥘ䣩FⰣᤶ㵺奖⦷妮㧭㤹䏮⧾⨥祶␢ⲡ㡊惎沸䗀ੌ懑㼿ಽẺᆏ⒯▄㖺℟㝉ḙ⑽溂桯ᖲ猒⍕䦭ㅩ㖼㊮獽㟁疢忉檚䠫匝䜋爤↻㛁搈䠌ん䞥⅝䍩搠啲浝䮕㍘掠疹䪑㉢尼熴Ꮽ挘傳ⶄ呿勪㴦㨰ච㩯塶ᠴ叕㉯䊲䪐ජ榦䍷䪭状ᩚ斳⸩႐亍優擢ጱ⮨ῤ㋷眜༟㈜䪾敪䚧禚ᠬ慔晣㺐ޝტ¿䬉忛Ȃ湇ᗂ♠�⸪ゎ䅀ᗩ䤭̤䤴灲ṁᵰô挥ô↹†㦉ᜢ㼮⪮㤪㞂古ᱦ擂䲉堤êᝢ瑟尖၄ਫ਼䩡䁑Ƹ䃸憕࿊⥂А悬愌ค́Ⳣ朣ኩ⍑ᖳ㿃૨朧䢪⑱加ᅠ⅁ḯ䊂ࡤ䛏ከ卆₩ୡ̷ᇢÂ⤦扴㎠炂ψ朤棇甑崵Őᦸ憰掬ㅤ汥㥸䑢䩲䄨嬸Ȗᙂ⡒⏄≅屢䟤扬扌幥Ӗ⠜堷ኲ㡺䊀烨癩ᤒ䣑㢼䥂ᚳ乊⍼⣧屽⠄檪₂䰩䥡ࡁῃ慒ፚㄢڌ❨ࠣи䗰攡⧢᫅ࠡ扠০偻⒬浬‹䮹લ%ᰃ曹䣔⬠皜攬琮哌䤉Զ㥩ᥓ㱌Ⴚ⦄噺撄筪䓇休䎰夝᪒ᝌኊ✄䱳摜䠠_㏭ඍ䊁喾ላᦳ⍁⍁㣫ᔡ琑⠠ᩦ憨ૣࡰըᦛᣇᓉ⚆ੌ䄁䨥⢹ր娍జᘵ幫䚌灌†६呂奘瀻㼶७ଲ䙥ኳ䳬7冷ሒ捕泡☛䛲ፌ㤘⾙㙵প傌棇䮥ଵ᳀吲夨ᡱⵐ煴绺嵋Ú狕⇅♠űტ嫏⓶⻅ㆴ痈巫㳀檑㎡熑唲潫䳬潹╒姊廞殘⤓ᵪ坒竈竻⬹ӳ瘈忋糐欣⡴䵹嗠Ḡ⫙⑲ㄩ嘪/⢺屵⬁㷴㚇呈䶌曝Ⰴ罴㗢媋⇜毣␢孴㓺禌›欥(◍坰淍ᢪ孒㫻⿴獠㔦瞌ᜂ櫠״ᶅ彚燄 ᾪ㰋▵᭺㑈戌⼌栵㳼ൂ寺䗟婏㮖料瘎䏎窦⦕揲䷇剛濓ⳓ⏗㐶縈溨沭歳希怚惀Ƙ炈箳㇕枛ᑁ䀿㛬⸣嶀㿻梒勉ⴔ䲚౮戺⪴䩭㝻ᵏ劃揜䚕㟵⾎㛎格′」穚ⷔ㢠岌ਠྩ߈愴礀乾倾延癖෧ᔜ抙窃ⅦӸᘨႹ亱ᩳጶ吂㖧ኟᯄ掭擨⮑嚼⁕ᠳ牙絴㇆婬㾬ᘡ庹ㆣᯝᥗ淦㖡ດ栌焢紊䵹狋圄ᧃ㍘ၮ㯊䯟➏⟖㳣瞙暄䗟ṃ獘䎀倡Ⓓ㻆⟕ۂ㭌レⷙ屿⼞汋䉝พ㡶妈碒抭忔瘅似旚婋晒帎㼶䚌䩠ᗏ欂併孺斧⿋歚㞆榓ᝦ緌ⓩ⼁䉿Ǟ嶻䫜ᵻፖ㦋ᝉಌ䋳ⴞ繻೬姻㧚玽㩶碉攍圔వ䧻ˬ悋▿孈㏦侑䙼澶挂洕䓊恻徛㷰㓳⹗⾜搾众汍嬻緇犧䂖㍰瘫瀠Ľ㦀皘紿∇㔁屝䧾姧⒟獘窮瀭ໂḩ湒塼槲㣇⪘㓘綦劃栁牳刓ᳳ惻☎㻇㷽杼ೈ㒶仟㺽⛨眫䏅湽ᦧ珛箤耖㌔⽲穽᧨弎㥛⏌Ⓞ爆߿圖暝༕淫旾ΐ睾⯇畗綞坻ណ湬ૉأస㊃營秷㾗嚓笤瘇㶇湝撽匐㸎吁檍┗䮱物刂滹母䫵濧抛玱潯ⵧ崺䧠ʹ㤭牾卨瘇䆛篸㱓ᮙᒅ烈༝䮋濱䆓—៝婗夒ᵍ盾ᘑ⸣煎端㶈嬲䆾ḿ㱤澶ᕓ撦享犌䯶曯徙NJ簯翜忁牛䰌ਖ਼ഋ栍乏筋澵翧㘘Ἳ焠坬㻬攝䆞嶉㰠樣㤏挛絻ᄞ根罯櫾吏⺟君䞳ḿ狶᠙Ե༎瞠చ⣢㚧瞟㭉巬ᡰਟચ⻨亰㶙≱Ǩ㏂Ꮰ续㗟㸤珩睟㋸㤠怹營㾹⡚Ỉ獧ᐣ⁑嚽炇㽙ᡈǮ㓣˚埣仵狠ఢ㡋ƃሰ猥睢hয㬤䝲✀煻篢䈝厰䢤ᑵↀ劼㜒〼⹖㉀摚䁢䡚ഛ༦ⷵū㠍ᚥ్ⅆዐ僳⟷䌋憄ᾲ瑖Ț୫Ꭴ屄憪ఀ痛埩精㙰ᇙ玠⻁વ戀熰囩侢ᆒ眐䝺籏缟㎨朢≘ĭ眨穧㗡慀Ѵᕀ⤤䢌ڰ哚ᷧ䩥ै夦⯿䈞ଇէ憨H敥睪࠴䃴⥥ግഈ略ᑖ儷犞⽥ᩄㆀ傔ᣚࡋຆジ䨤⻢慷㖸灧奶㈃ᕂ瀲䁽ྠ周♓㆓ᵥ〯ㅻ滧噟ㆋૄ㾣㙐瘪Ⴘ䷧穙ᆈရϥᩍ焰௶ᑥ塌儨Ꮵ俰㎗៦㉛Ʀ◿㽉柵縫燸壩焺堧┥ⅉ儨䩔ᡋ㞤䢈燡㟥忮煆ዤ乄ဠয়熘向ॗঀ䬹╄ာરдॅ♋溉や媁ᅙⅷ㎄䥇⥁⋼䯽㝆乙䥽狹㥈ਝ匴姥䙬⦺৭ᙀ㔦8ᗘ伸ൡ⥪伴徥ْ⢊䱴狇╁⋚䣴縘怫ञᅴ妹唬椸⓴䩥ᾪ樆䡔䦨ᵆ榀嗶ᚰᏢ樞㞔吢㵔䨆ഇᘠ絏槜䥑ゆ㩌ਢ䁴囃•ï烶Ṇ慀䦨ʬ盂捞ᥡ౨糸ً⧫㕬䲆ᶣᥭ窅医⒱䵔䐛エᇢ䦨等⍊天䫬姻ṁ㇝れ囓⭘妵䴌䛐⭋࠳ᜡ㵍ᙱ䰼叁⌿樓బ暁䝝ㅣ䲼梄協樃丼羇䍄㧒ൔ䜅❐燺䫠ᒄ睉㦧䱅⿄⍏ᅱ䫀濇矦ঐ昇ᴺ秖佄擀Ὀ恄䛟ᕨ磭祯䳰匰瑖姟ᐣ罙禍倛࠶圩冰⻐寅✳㲩䯜伸⤾ր⦼獂僉榞ᕢ寄匲㦠⼈壨㩛㓛乤羋࣑㧔୫Ե婒㒵ŀ朅㙨惂䟂甦䡙姜త溇筹䗌⧀堅䳷䔬⬥㉃攱⣎䑢箤䝴┪䏺⤶㥗噒⼲潙⣚▒䖲毁䅣䃯熐䄵慁⋺⡐ឤᑉᅼ⯔擂ೋ懊⤨岅妙ངⲵ旯◩䲒拀ቄ旹䶌稵峃ᇶ᫃峆䤝䥾Łㄭ䂮揬Ⓑ♟晱䴪䐣䋒ᕜ䴒䮅䳅礧䵔籶ዄ牸⮪欓㋏ᣭ矪䑴狅昃癊創僀↹䋪䥵⋉㧕Ⳋ寄ዅ䤄䆀䯸繐䔪ᎌᙂ嫅塵⩘暀竏啠ဒ呫ۍ嗠熄㼐䟱䘌垢澛擂⥷ぺ泵フ㖳珽⋵䫌暫⤂妧❚嗦㔿·㵖㖀厄ᬀ歖祲⫹◵ᭅᖼ⭄砵ι疹䬺壩廏㫴狄Ƣ䡇㘞㈚忴۟㦹䈦笴㻞熦䘚亚⍂䣼ᚪ䭆摞ീ毬䩖狅෭獄ᳵ≥廈瀍ṕハྜ丄恚ᅠ⾤搄㽟൷㋜䵕マ䴥䌥ۂ䃑ൂ䢏᭗盙ầⰺ䇑㧒െᖆ吶烀奘橂媆㍑甧⯼狸㩌⾶琠՝uࠦ歆嗖䷝㌠⛕デⵅଥ!ⱅ॑ᯉ䕺ⶭ圠㆖玙ζ寶䮎宀嬰čŮ㥹媱婉ཎ䗉䮾庥〠⑳尝尵㲪㹊燆廾犌疞䩬⨽⌯ݶ尞欽琧䝶ળ弽穩㉀傀Lj彫[⬉撹ṓF㭭⎽ባ杢㪿䱽ⴋᝥ㬕剽洍枘̒რ㍽㋂⫽㵲旽䞍ᵺ⸛埚姥Ḥš漍ຊ䓈穙ൔᮉ咏㮚捝爊㒒笍ཀྵԓ☹᭸ᾩ⌌澚炛庅Ⱓ^筟ᑦᇱᾜ㎹垱❦ႫჂ熈⣍竇ĝ嶏佮㊯妸᠏徃竐吝㠈᭾⊵䤍潩屐ⶍ榉玌尛∣⚯䃸ᓣژ⠉ᣒ܇崣完⾟淰㫝ᐻˉჸۍ䨈睸攨㕱ဎ祱毨㩑抪õ䐠Ǎ㱴เধⓩ⇔哝㉰汔梾ජ䜳倠ぎ⃐恧䰼ᇣ矅㍑≔ᇆ䝨硦䛲汒擐烻笏㖙㎧桲冣ň欫婔冢殣橚䫿㝰璂ሱᒖ⃐粚婪ӬⰛ粥ㇰ╛㛧噙像䟋⒕噛厅嬘榒ṗ䤙拖ɚ㯸⻓ᢤ湑爲ㆰæ☡┣幝灲ᥠΧ0䄰渡倈懒ഘ䇋沞⁶ࠩ緅ਅ₽㴚睷伈与嚚䛠䜏൏岛畝ܮၐ᭠氦ࢍ獟侉浧縮䶔揃ⶥ㝳䪴Հ╗✆亐ĺ䮷⨉与嵠卐榲Ⅵୖ6俫䷆͝槜㊎㭔᧘悬獐愦ᦩ伕嶇᭔峋俬粂䭒戜碌纆孔ユȼ柇獭戣五瞇䝕歱侬禌佝㧇㒢漇䁐稖盌擤〥֮ឌ砆䝕稞䢜碆Ú㨓伢㸶价؇侐䰴塏䖶ല笇ླྀ䗡亜繑彗䑔〜湍Ñ㨟媲昆䮲斢⸄㝠僘樖⦒碷⽚橚Ⳃ磬䋑佬䬷緇旰ⸯ⒕勑ୈ᮶⭕檳ॊ羶ࣖ稖䵂檷端榽⿂憷ᣔ؞毊晷ᕞ敓ⱊ檄&噵堬⊟暖壵祍㖔⮚娙敎ඛ媬幻㏏䶊嚉㠕痎硾氁ᩢ妻憕殢塕潬ᾳ殟Ṵ㣍亄歷泍㙡猤ᬭ䝷䂟昤䆕汬⦑ᰑ䞭济掉ᬸ墵檎章嬡彻㭉殄ᭀ¨ຌூᰞ㖍憍ᣯ䣥幥榎冂宂嫍䪍ᦉ籽忍巹䙢㯭庀㷛↕⮨ν秛㧀恴ᝪ组珐揩尠秥᪄㱮ኗ㳳⥩婬㊘糹—ያ㴲䢽䘰ᆶᜠ⢝₼挅待ဲ嘠̓㯃⣭等羖厂⢠㕐រᶨҿᱍ䄕㰋妠✍㔻㯙᪠㹯煰卼Ѽ爍ኌ築᭼☍㊞ᙁ㏝伒ᾅ䣯幎ᰎ㔣屢㠎㲷噰㴣佅᷑䟴挥ᐃ 冎梕䞍揳䜹ມ嬍‣㭻壥伌儏㮈㡝昼Ԥ篩ᷣ穮㊚箋◝乤ᾉ簙烃䘽⤂塔㸄ᴿᛣ䟢㰒䀽≨杼㸮喩ඬ㱌ồ熬箇泛忽洆ྎᏒ㻣缐ᔟߪ㩃媾䤜䟏廳熳⤋筟岴䏃羂歱Ꮣ䃄⌌榐b住⌎䁢䜷ଢ⟮㩉䲼ኃ标寣劾आǤ㽳夾㔐៎㤝桿椟皖㾫婾υᜩ㯽̠怨氲ᆁ歿嬋㣰烫樾巺➸䋣樎㴂箥㸌⾿澟栅䀊ၼඤ។㬫徕嬇ᇬ㵓壩㬕㟕砾峇㠉㪓咼崑㥦ࠅƣᲬဴ䟂煮⊮ᨘ䊨ᕂ結㣜㫐⬣Ⲙቝ箼䜟ឪ㫝兽徤埳㦝泾⬁㠚㩻䌿眅䝋榆唨ど䥊墣攩‡㱛䃿༕籸坛䰢⼚睱䗛娐డ睯㹔㟂ď㻲⟽崗㬓磼澔㑠磳䡞⤘៚㻋狸刍ဟ澧嵅牌䡬㦁烜愑疝㲳晟㌛྇㣛嗿㔈倗㲛紨ጢ侏㾢ൟᒸ㠒㬻翼✘垞㮇嚽䈋侫㧋緄㤦ݮ欷惝Ɫᡬ«䬬Ḇ᠒璷噽朔矮䞷䅞䬮睄祷珿嘊侺礐㛟㼗⼥㿷獞┨澅㾇峽⬜濫㆗叝フὖ㺏ᤒ◟ᴲ璕婻Ꮝ䖢ὧ晽༆⽿㿇撝缀䜦簧岜̔ဏ弧兂∟皥积卧尀姭櫑ᯚ傣㱺▗剾䑛㱮જℝ吀矅纷峼瘇ޚ秏䲟๊㟦磋厝丂༶笇⤜ࠊÎ穼徝䠂㾹篨境 㽨繬娝砒㼲磧稾崋濘翧拜綿濄絷䯾⨚侁磏岿栊ὥ籴熇廞᧘㨏ᮦ繍福棤㨝ᐒ㭺缸屩僟䞮寋瑞纗筯感ৼ㤑篵缲凿琯岾埘䐁篘㺵砠ᵿܑἳ㷷甀⠦⡎䁼ȋ㡈䕡∢礱樽⡽岘戀㻮⿓帆⿌縱穰ḇ]⪕偁徐ʳ瓿妌ĥᩈ傊䆘榟㙙⨩垌ʦ猰㒎䀧⠷⿔䆀ه泿㈡⸕害ᔹỠ嬬妪Ȇ殗侀壀娪䯧⃟紒璇婞怦搌ぢ㻆穐ᷯŕ⸩䳩浕懲䂐⡼丱䞥呒䂰⌈江ʨ〥䑏甤䎽ױ䪞洦܅灣ḫ稸ᕀ䤽Ⱄ㟧➀䎳玡䵁碦ሴ泎ᙵ҄Ꮓᾄ㟵☴ʋ咼ख䇜ᚥ⡮灧廎㧯激唣ሩ@ᄚ˪㳡栧㿅梛欌ԫⵐ䃅က佽僉璅ᑸ⟁ᄥ稷傏渲۷摰楼㈭ᡒ©䎟㍸⽺㖥䅠懊䀠I同䡩䒷Ӽᎇᯝ砕摎侟簦৸⦞よ䘶徸慁ս䄐嬢冓ರࢳ糌₀ᱰ宧吶㌤ᄸۤ汀䴝ᬨ偃烆㴜壁㨦縹柙−ࠖ䬨偃Ǒ࣐⋆搧䎊䂖̏䭜攐癢ḭ㱟儍䍱䌱ΥȾᡡ亐ᣲ῟⹌㲪㯩͇恉෭彞ᇱ䌤ᒍ缐䓜ᖯṢ嘔籍ए䋹ॐ⎱羥េᑽሐߊᓩؔ㱗Ὕּૹ䥤ᴂ⩔刅秜Ḁ䅢䌯硉⣠䈸ഄ⋡䥣റ和憨Ú᷈漩ؖ孊⋦✔⓱℧䴺႒ᇬ䜘绣䪨㩕⣖糧䘄ⷱä䤻愠䆚䓐抸悂㰰≓惫␒ࡐ⛱瑦⌿㑿愵ս亸毃䂨⢬壯⌁⊨Ɒ哥砶㍄↪䇶ᆸ潈妬㉋タʠࢬ㠾冧ㄸ璄慕䝖ᩈ㶂൳ѕᤞซㄠ㒒䜹䁮⅒䔆ᝈ䭂㐫婏墨ʑ㿔姤र涴䕆ሠᩘ椁穏ᱧ♜⸱卧嬸屳ᅽ䘴᱐嬂墨湀㤅奏⪖Գ弸㲑煳䝢 〃ⶭᘸᣄ⏾ବ㯑嗦ା屼䅻䕽䠤禃Ҫ沾Ԋ戽琜㦁券ᑪ䉰₡Ꮇᠳ瞯晑⣈Ꮏঢ㤁绱グ䉾熃ၱኤ匡伓兙烌ɛബ₩嶦Ἴ⊉∝䓦ᔜᢀ౪䔕瑏ၴᇰ古റ桴␥炩ᶤ掼䱭幓夋⋸䷔⎩夥䰵摺㛢⒊༸䖂♄䥓⒡∼哮䈠Ԓ䒶烁凧爹ᲄ璲暭䥂棛戴䬘㖾䱦㢲粗ল䊐䜫△ᑬ繄抗ኬ䯲ㄑ㉧䯁澣㇄烲ᰴ絃㴫慊棜挴䡌㟑ቆ咴璀䊁➗患ੳ䘒極儂愕Œ⊺䗻ଥ⅖⨈žᐸ䶲↯慞撥⌼侄㩑ዦ章⩴e▉ᢤ筈൪㕟Ⓥᴂ炤㛮⻄暏ᱣᆒⓑᥴ侂┩⥈烕Ꮥ嘊⧂㫛㪿Ⓖ⸹㤂⅀Ⅽ㉾㓖ℶ俯ᶁ䑥⊻䲀懑┱ἴ玳⑨䵖坕叹ɺ㪉㏄㚸榃憂ಢС斧橔攑ኅᎫ䈉⟅㚽䱽䥑ᨠ冂屫啔瓛剞䩑ጉႅྨ穸᧗ྔ糀ᔱ畂ಶ䓞亂⋉必⪿窔☮ᬁ䣫歽甘㌪ሷ°堠墈ᑔQ᭾ᮤ溢䍯⍄㓇ዦ䳼ⲩ⯐⦶⚕䇄敯䖂ңطᓈ疳ሆ㉢㌳⚌刂ӎᒀ吂䝮捇佑熥䤜➬ↅ禱橴撀Ɗڗⴕ㚐歙桍㌸䡼㛩祇榹ʁ楬曞᥉໒揳佰ᵫ㋕䵧Ԛⷣ禷䷟ᰮ无Ɍ宂拪⹂ⴐ扭䴺暄亻㝋姭╱ኰ炓⫭炯⣧る̩䑱珥㙥ຝ桴暵ႌ祳八浏璿䊅伺⥉䳢Ꮃ⌙极哨ڤ㷬▕䕂冁䳙ͣҸ箼ш昭ᚬ䚒ᣪ杌泷ዐǎ⋙笆岆瑷㦕敷ᒣ㎥吰௹澁玙癪䩱㋆䂾亜儬擵ᱸ湂垀䘻ά珳眾㒙䡫⬤皈八煢⼌瀳叩浙㢿㋅乲㿹玅槏庂姗獿ᢘ儩玢䉝Ҹⴰ�ℙ᱅ྻ⚓㦓望ᣬ䘒ᷬ昭粻琜戡ㄑ䠣ຏ❥撄筒ᅨ汘紏㉀䭞㓹者Ƶ⻌Եᣕጢ䐫㨇串ᡇ䏇६ᣚ⭄漸㙽᥍柯ᔸ挓ね疸䊢ୂ盡Ⲅ稴⎷⢵摗ዔ䤈Ȩ烞捉獳䦾㞉 偷癪刈ᙪϢ侒䨯ナ⌛㈽Ͱ㨙䗸圊櫃㨄ស᥌廣⡋ࣉ㳂㧌瘎㭩暩瑽竟ᔋ技◢囩灣⼾ѡͥ䴞㱹ᑦ侹冈䗕┈嬑ফ噏㱽括Шੀᠠ捈ౙ䖭嬘怂涭⩋❈⊭௸䫱◥娷绪㰿䔡ᗍ悂䉫⅌ئೊ㤼ೄ㨥㟅䞩䦘▢ᒿᲢ厪翮棎ዊ瑂矩₹㲶极வ慳䇐ૈ➁ࣨᠾ劶℺⥄ᧅ綄ڶ册祱ᕉጲ䴪ⳬ䵌㱖䩚⬉⦒㭙䙴榌⺃拄涔媁栤ἱ⢔Ƭиׅ禵ᚸ妒攣䇌巠ūࡈ㣘匈䮼⨹す䥡洉妞㳻៣竫啈ᠪ猇⁐ǹ⼅綴憾䓄և䘚៩ѽὈ糞䬼⥙㓅墷ټډ灰䦀娼䦨皗糂甤㲏瑁䀑㓐夨䖛祒墒砲ྨ狠㍼崵怶兼▁燕搮Ϝ粓獵峃ଋዑⰥ㉅恵煺չ旙昒䋒䢓幬•䬂卸ⷖ㲚Ɫṍᱠ喀Ī倪綪㣌ᅚ唊⽉≥䶆ո碲狂垪幑⦰揦ૅ楘õ⃠敷窹ઃᕥᜂ圴繊ࣘ煝⮵⬥嫵↓澅╯旐塚婢柒㽬僗粥猅⼥㛼㲽䜿嗵䖏₀⏊㥈⢸⫨⢩⓵楶ㆰ䩮㦣䑦剪䤈䧌ṃᾝ⫧䲗卵ॵ㶴㦉唧➺岔筋槉嫍梲樥ႉ⧅䪠ራ㏅㖽厺篋䉉ᓋ檫⬩⣙⻕仠᭷囇㔭吰楨⑃䣌⣂ܽ愧⧑⏹㬶獵ᖞ楒吣糊堥໋䪾ᢷⶁ⣸柅犱Ϛ疭唻ሊ䢫Ⳏ竜猃瓡䡆㫑⩡⤪උ椪Ꮎ夺寋㯎㛄檫ⰼ✕擵㙪綁焿吸̓㔂忍㋰檤⩡㽕姵ㆰ䶒沟垤ᜈ携篇ố㎜⣍ߢ孵矵⤯͵Ⴈ㔎兢䐊Ⳋ㻖ⴞ椀溠ᴭ㬁ᩀ⍢㓛䕨ઁ呄廅ㄋ歈殄व燶ྰ斄嗌⚇ᵌ箓ᛌ昼竊ᬸ楃㺭橖塾㶜\"䍊ͦ䘲♆য়䨸ä涕㊕⛷究㕡瘓唚奈ᒻ⊈刹㫓᧴榳㍭⅕⤩࢞僜ᓐ溚憺厢䣛勃⭸渺㏵奴哴㶗ദ㘺҆䖺䮵᧙朓ᬧ䯨䴼㶇✳玞渠㞍ᐦ庋㇋㝍̖櫐ࠓ㫹㝥⋷崩煯构喚䦩熋剐ᜏ吏ⱳ⃕敗ὶ籶䴠▐ᖂไ瘼⚷犪棴Ӎ㥔壵ᵻ撑帶䌊剕䢢囜嫲杋㋍䏦Ẵ㋉ⶫ妕夜橻籉瓚ᬀ᭢濋ⳅ啔ཆşⶬᓢ効ᓺ֊䲰Ὄ⇀ڮⰮ念Ἄ宕ԗ⊁廂獊䪍懜ܜᩖ楻㮍ⱉᛲ㮌⡺⤰䗨Д亢䐶㠾婀玀ᬍ寔 㮙㩵㔭塲䣺㏋䛛Რ珹⺛㮰埗建歨瑠瓽嘠᷺ྍヂ婸㎧⨽旇恴க䷦栎傖䁛ά⏉框䒑槚⽂粕∥ʰ╱ᄳ剮䩛榊懓ᛰᰃ⫧㦌犗ⱅ䋃Ḗॸ䑮嘨洬◖䚳৹湶勭䁕凷嵫㖖㔅忺⽚㌨ᣜ⻝椁沎丠㞄ዷ嗶⃝孎糚Ύ卞⚬嬖櫫㌽䰇檲坮㪒疣刱ǚڣ⯚壘㪑ڧ␍⇵㧱᎒巠畻圖䱛欉❋県⮊櫁⺕冕⻩㞕左盕叛ℍ䏈Ỽ㭩欹撕勺䙰ᗧᔁ剎帻㼋ߙ㓃溷╝投᧽ᱴ㵹眸⌾厒爉Ǐ目ᩂ泬ક叹佨媤皇凮䉚瘋珒仸窹⾯㾍䔖侃嶗㟷峮掛癳㏅盜禬҄厽䖕䍳杰絞ኯ取军⎏㚧ᩪ䊿⒝ⲥ⯼ސ絓畽尮憺ฉ濙曹筻湏ⱍ䘖Dz箎綝砏嬥ṥ䊏䏱眄斏浧圕䶗⧽垍ḟ㘋怖␚ᡀߊ稶渁ᣚ綑㹶ኗᵫ壒డ亊倓恆睗綩焟䡞ሤ耋➢䶏璷僶䓻ᦢ�窚畀Წ䱐ⷘ⏾傡̽㰓媮䣁㠫握⽸بྠ梡㖙ၚྪͺ痗収䞛甉⡤䆾嶒匀滾ᨓͲ憮ဢධ㶸琦吽篩⼠糩炀簞☯䠻宋Џ皷壶嶱䈽䳠∑䑄℠昉〮圌亍䗵㖨㌟ധ婶⯺⇏籕獀ぽ汗寽睲㷝㈈㼑ᚦ洴〣㪡㉷ⶐ樣䨯ౘ➼Άຟ氿㈧爻俗皳竡⩿ⵣ➈㑗䣜ࣸ⎇岦䫤困ῄ⇷䊬Ề矣娯籘䄌䍶历䙛氼翉籸䞲᩼䓃氕ⱪ疨笮岹ᕦౡ⒑㣔䙄ᰐ橣®ᡛ䤊Ϊ࿀㪞把ⶠ㒉㦚䜘ᴭ䆠㕠沊ᤞ䌳嘸㸁穦缓傜懠䜄Ố暽ắ䉞敵粃༅⅑䃅ᆥਪ䠩ᗇु⾃ो棬捍ຄ㛱癧ᘺ毹㇔ۢᮅ✹嶯癒劻內㏑瓭ဦͨ䇸Ἐ綪̔ⴼ椞džർ㱠乧㜻撝༁㬌ᴏ㭺羯ᴡڻ推伣⇝൦眉㽄絩牕溸湾焮䅘挽ൢ㗱爚掋ⲇಲ↲⪁⾲橯Ǡ⏕㦬乔㰩秧ҿ䲝凨➟皤桽䟶ſᓿ珍⣩祘咥Ʒ爆䓍圴甃噯煓烼捹ౢ㎑睆撿俐㋣毹⾠ჳⰵᓨ㒱䭰䊽㔂⮉❦⧯㳹ᥐ梳乯ᕜ愋緽㇉愂⚺㸺⮽᥎㞤ᠢ䌡攲䶚㗔⿆暼㿢榬䛡ᡠ楳刦䥒愙ጫ癲㰩㟇ᆥ㪛ฤ柾⼓ⴼ䈭糾䴉͡䴀ᝉ泧ሿچ↻➢䋷江筑熤ൎ╹䝽籓⎵䡿澥屯巻ៗ帤乺痧ᆹ⪚᧒柒棌樘揤孛ᆣ㐋✣䌛ᚰढ寣窲樅㪓⠢杒ឫᐆ丆㆑墇琸墏姻☴絳筗奸癈緋佻柼猇枾಄⠯察盰玕㪭潖範揬㟖㳌ࢆિʈ姝晫㑃੮Ṝ孉ၦ揾㭣⠶⾾θ恰ᱽ䓠⠺۵㍥λ俒㣉倆䄻岞槠‑娫桉烒眹Ḳ䴰ộ炆⡾皍晐娄曣㘭慑惵汄ⷙ噯ᄓ寰⺌Ƨ㳜ὂ瑓⭮筝⌊匠⻦㐥礲ⲣὶ䧔巯ᵂ▦惜䟔䭼⺖㽉䆆㮼ⲓ冡朤婜柽㨷擟络䭨Ѡ㎡甃ᰨᦇ婲នᱲ罓嚮୕⋲捔Ⳍㄉ爇ήᦒǦ㗰॒揳㭃ᴨ烤却ங㎹䞇倔妒爋媬滳䏯䭟ԅ糿坘㬅䱶㱥䇎v哂Ŭᮘ㜯ᶲᵖࣩ⻅㋛၆᮸妋㧾ᙃ 絫癕ӓ䌞൩⼘厵䳻峊斚嗣ӯ⫊縍∯瀠ฟ峵匰浿柑֡㮰塊甫濬泖匘⮣伋偉絶疄䜎坉ֺ旼曍嬂∩䷫⼷ⷸʷżᖇ娂垌堲泋䵏ݖ厚毋ⶽ媕曶䭾▔䠦䞟⺊朋ᱭ巴䋨ጴⲭ㨵羇捸榒ᖦᚣ柚桨珏⻔ስ毞ᐺщ巷䥽Ή䚯猑ᨺ瘋䥑竡猳〒㗦䠡卼䎎㖨㙥᧟㧋㋣箆嬒⮘漊暅䁶〹熗㘔᠖嵊滍狎᳑Ύᭅ媃㰂兖偦΅ᗉ怵۟䂻櫌㧓7᭄沞㷥堇烺犟㦰䜮弚棃Ꮟ㋛期ᮎ㝕㎽⚔糾⭭䷆戼ྊ箻⢡嗖ᐦ嬢渭㷕烶⋾ᚓ֨嚧᪪樘槏㗚ᑎ尒潅㖍䛖泼䡣᧮囦⚺槻泭狖⌌ᰄ湱㼕壗►綌涿囟溊緻渮淛煸㭗佭㗄ᔀ珜ஃ宄侏䳐㛼ᭊⱃ䀍耆ዺފⷌ�屔繛গ䓘䀱㮑涓㛭犖◿絥渋殺姎笞䁯竞⃫歞淝㶽怆㾋枒㗴㙋奮稠摬Ἅ㮩⽅㿃ʅ৺䐲㷉㕻崰琓敏ग़㭁㘧㟽妚棾㖖㷆㚇嵱䂝䗗眍⍜㍭㵹媗⓺皃巃㞟ᥖ礻穌捱篹䵛⚝嶆㣻完ჭ㛍嫺治憍㏒廽簋泃㧝旖忸Η抿盹報䚨翏⟓ǣ毟浿䀝猗䛻妞爌ᜉ峊祋п绑⃘᱑ണ䙙䑾㖘磄ິ嫒性㐼໓⛱氆潫㰂礮ၘᄃຂ້敀縧䪓俟Ἂ⎫浰窣渗桚憖䷍ᙣ姡箧᠏∄䝝㧓㗉䧉⤌㡝㟻奡竳ℾ梕睸汻㳕廆⯕㾟␍➽愞知㗑㈊䠜ἥ㵣暯哾椎仧盗幪櫧簼Ⲛ囸⇓⺰稝涃⊦礟旡㟝影澫⪎㻛滨݊ච砃䁮䙝礘㣥囬㪨șᲪ㗒䨅磶ᴫ㓝䚮╿Ԏ䏩㛆床絇垬䟔⧲僉ᷓ㗪ᆵ崩礁喺ᅺࣁ桋淮қ䧲ᯠᱟ㡳癷猩ㄊ厦仹彭㍻ƾ㊜ਖ⟁ᶭ㛳䑮ᵟ瞛嗱ស涖暇槲േ澉働䤵ş殏緱伖弹类粿珙槣⮴⭨糓礗㹈ႚ塎䯇峙枘䚼盛盷㭠Ṭ珃环卽崂㋘乎㿯༇㚎⑵⺍❱М秢曮橙洒䷝丣妙槧⎽Ɠᅠ᠘ἢ简剮媦ᾖ▧箺嵥揻帽乕䧠䝙ᶤ煓䇮䔓ఊ曞㨥殎䞍ㅩ圈烱甂等䣯磛ഌᗂ⼼㤟㘷㩾矕昜䞌Ťు甖〣猍↫皢㣮笛㬾媟娛㌃䡫䋜碅䏁〙㴐繧⪥ᒑ嘐栂岤篓歏勝姊㏰ྶ嫵缧咧ڲ✢忷㥆緶䫝̆搆丩㲥睛找⊗ᘔ殱ຼ簂瑦噆䔘㤖囂ՊḨ໎嚝睓Ⱆ激л滀⇟崐淩⼩㡕惃⍾䦟ਚ孱弦熠⼗ᇞ䜝睶㬯墦撰ム⌭Ҹ㞁獕㰉ㆎ✽ଋ㐄㴺罷⡽嶒䷧圵崶牻漗ᗘ眗䯅่㇍氷晽疘䛲㟐仜笫像㯸伕ⷘ戵檡㆓䮌枚睡䐏件祣涮ⵜ✉容⹐᩿↗ჵ彾放眠琻䇀➭沓ⶨ呉托湗䴌㞒痯㯭嶮絓慖柙弅䏋濯㺍媋䙨擞挝嵟巆ƣ͏祹欞察㝷庽㨷徒॰ླ忡盭澺㛟យ嗝㈽㯥綗松ᮚ瘖矝㲵稾ᓛ孉Ꮖᆕ姙犰ᮏ箘痱⬰崁礛帾熾愂珪ᾬჅ沯糾确䛾忡㮛䓏矟刍㸈ᾅ㷽拗ṟ炗揻ᯇ䵄ኧ穗䮿爗⯚ᾧ㫽烷柿එۢ佌ᳩ瓰忏䵾悈恳寇塓疍䟏វ竭༴汖狇渾檙䌖ާ瑬嵓瞛፟㛶曡侺沙緋盯Ϟ⨇ᶦἌ禣捯張㴟䇧侟᰿ⵝ䛒坦刓߇㧓恏擿唚丏䗱㼏㺷敯匭朖ᯠ⾚㫁ݏ⳿㴗⸏俶䀙籇吏皞ᘌ当㮃篷檐⯽〇´傽岿嵺㟖ំ⻐硫糏⡞⬔ఊ⾍㺷㭖篮⫺┃ɔ〟㦞㪋⧟㆖泥侑㻱癷搿Ἄؔ⠖⬆罅懏秝撔䨊滮㸢碗槺ᢙ瘞េ瀚罻祏⫟ܒ㰌⡌´盧ቮᏬ殕砂廷㣛濯㗟牚ḍ濍待㛜縯⾟㨉৯ỡ礛槇ᗜℜ稀澻㳞忇䑞憛Н标䘮ᤋ祋瞯⮒Ϸ宀㺵猯炯⛹ጀྰ廱祉泛槍㈑䒲❊嵸硋彎湞瘏彎稛昳㹬宖ᐒ⯔羟楛䍟㴜礆Ꮰ湺簥櫻廎ଗ欂漣Ⱞ狯矿ㄜ㈘◦ᙃ㬑硿ଟ䇸忊縆竷櫫憠毻緕㈕粧戇伎�⠝等㲳痍懞∖朆瀂䷋夈墤㴓杗᷸͑浛犧æ䴙稖⿵怅磻林ⷞᯙ矫忛溿ഏ儯䁐ሤ伺埩䦯曏㓎ᔞϳ栆翔福匚ᓭ䠑嗔厽ѯ瓧弘ᐓ绿卥羠皗獞徟簍ᾱả簼⭟ⶍ䰗摾㽰ὧ瞿佷榙᠍徥噛罏矿䬜ਕ刀䀘㾒ᗿ歶㸚㠄侖翷Ű㒟漿✿㴃纽徟儝⠐㾻度箵憟淑Ῥ欮滗牯ࡅ癧礉䒘缓祟竰ᛏᐟ䠚缮ᴯ瓧歒ਚ怒㐻繙䳟捨吜瀓Ῡẉ眀叟„䢤唹窶〉㻳瞺罓㸻紞福瓯悿怟⠡崝䀧匦䑋翵䎥缲㳬ᶛ碵琗恟䈟✞碝䂰ᐖ怿忼䏚Æွ縇硇瓀ႝܠ搡⭝砥犐Ⰱ⫹翈羑纎䒗硲ӫ撟弍ⳮ姽彈⟶㑣 䁲睉䙋岅簗矟泠⋞⊐∦ᚖ‷恑ₚ¶㚒⧈؇獰ᶯ䩿ᮖ䭝ཛ ျH䁨缲㱺ϩ竭埏暀Ⓓẞ乡䓩*䐫し丯彼ŲȬӨీ墠䶡璨瘤က⠈灚悖㽆幰E窀ಋ浳䑀䣞稢儚ᠮ䠶时₋ęƙ縒穤୷潷䃥㶞ᒣ℧倭䀏燼䞪ྚ给Ȣ㭘ࢀ῀⚧↡ຜᨚ㕑䀅翺羾置ŕʑΟ瑟桿佟㈂尸㐪总ᇬ柘䃅弇㳀ྐᒀ㏠䦡嘼ᴤ楐堲⁇傀ℐ䄭Ḍӄෟ枠⹀䤎䪣羛怮槯悆愀䇓̷ͥ猈ᔰᾀ妞ኢㄥ䨯夌ᡍぼĊ䆙綮ؘ牰ថ㢑ⳡ⊢吤ਬ㐽翧忉悳㹗泅㫉焐ᱟ䶠爞媢瀘㠨搾硚羯ö䅠䊺ݺߨᙻ婼㡁䧀䰘琨⾌寶ၻ䄘䈟ʿ祄廀塁倜ゥᄬ爏䢥羿᜴悷⣍dž�漁䓼ᒥ嬦刴塕恰惬⅃ȡԂ㧢ᐠ曠䲧侠而㿧䢃ᄇ䨾⸋窋热暰ⱀ擁傣䜛掔ਈ䯢垫Ìຠ䈻礫犴᷏䡰竁Ҽ嬚掑搵嗰炙坘䉌䌦Ѽ྄ᖐ㣠嫁换㼻㘮 嗽�㜹ↁֱ՝㚷柀㓿ᭁ喢ਊ㨑尲➩梖僇∈˒㌋ሸ㠡ㅽⰛ優稷硃䢖Ⴕ㠩緣ՈᎰ㢦㱁䞐撦䴩䘾㑛梍䍊䆕糓ފઽ毠ェ⯞䄣氓ᘽ䱜炏惻Ṹ䌄نஈᛒ嘧æ㈢ⶦ႗※⒬႗ㄙ↗巐祊࠻拈Ⱨ▢㴝㶥洪䐭汑桪彰漈屔ୗ熼፸㏰溁㣣ᚦ䘫⨹ᑉ₆焀愵䇫叠̨ሿྐ潡㟭紤Ⱃᨷⱉៜユ懃䉩爾ଠ࿘㭰币緢㤧Ī擃ᯩ⋂აň䌘㧂廐嘁䒢䶦焮娤偗ႌ悼湂紮١ິ៸ā⯝㾙圬爼ɇ⢚㝙ℳ䊀䞋烀ᆳ儀稞㡂䪙Ⱁ䀼䉁ᡭ焗縳䏯磞ࡱ❘⺰慁◢㼧缬帲≚硷ᱦ䆀≁ጐॺ槕廠圱揣僸稰扁篒傤䇊䋙ܑଢᇕ䜓ᜡ㡢㑦䊵ည瑜柛僿懫䉏ҩࢌᐤⲨ䜾┣婧溂䡡ᓵ睋玞ᇇ䏃؞าᑘ㑨䤁夙⨱ツᤶ梣Ⲿႄ丰ඇߞऽ℄⸠Ꮁ稰Ѥ吐户䱎䖡ᜎ⍜䟄栕ᡈぱ筃慧⤯▋幱嬰⤈刔∳㮹栤ⱨ籪磃客䙀放吠䌰⣹磢硶㧩୫ش繱濒⌭⼆㡕⒃कᇉ⋌䙎只ᥨÈ噱烂敥坃摢⩃摯䃍⁑⏉⤔∪Ᏼ⨻♊ł⩥Ҫਁ㉃⑺⤁䒣⊙⌕ඊᤄ⢈摱⣉厩㪬┸呑қἿ℡⊘叙ࡺ᎙䯈䏼㌵⭥ʮ愬ᩞ䫈梡䅙䋴䙭࿊Ვ凈硱㏃筥ສۊ㩑氻烗㼖甮䟷ጜᜈ㝠壱Ⓜ፤劮ㄹ剒⡗椗凯⊞䝍ऒዜǨᆬヤ♲簰呁ѻ⛻⏶ߒ呚㨈乑峃慦ᯣ穢㩀䲆乥ূޜదᡘ㠸䙑殣ʬጾ♊ᆣᣲㆾ䨑䙍ຑऌᅎਾ䏃⮓甠䀦䮹ಟマ庈授奈㝼᭻ᚈ樨⺃佥禩䬾晃撑䀽㓯ᘁ䞥੶ᨵྨ䣱ፂ⸧伭唻㩄ಔ棐ㅡ⏵䓋ૢ䢔⓸筄ւ儠䇧枦㸵ⲃ䢻㆗㧶䛃敔⇈暀䏃涫᬴ੋ污棗冐^䑶ଠ測じ珑ᆃ⻥溨穑撙㥈ᩉᐣ䒒擈搴㱱㷑གྷ⧧㲫怋牕㢍ᣋ↲揢䒇స押㎘ᗑ㗸氣奀䪈㩌履㢪ㅈ扃䝷玧慌㵈呱挡旦☮狅⹕岅壮兡⋽拃斿՝䞸澑碘ϥ柖縻䗪瑹䣀ㅨ⎓䕗Ḵ䘨刃佦ឮ⼵劽罃刼稻抍ኇᶼ 䇑瞃䅺ᵂ楚磽嘲䱎笏ዘ℘洑ᑂı㏄⫢粝湇悮感㪝ঞ☹䐘䁺䫃ሦ疮┳ṟᢆᤌ㬏礟䝥咷™㐘䭼埙ᶓ恩弴Ś㱶棰ঔ掶恐ѡᓙጤ撤㠳声╔悿䅖岐壶㺱振䟽൚ັὥᦖ䈳䣙ⱥਨ䅚㢣Ӽ२Ꮞ䘋ᚢ⽘翸昲∁ᝁ炷崡䊞ӆॴᏣ䚰䢎᱘⊤䠠䄳呆曶䢴ᜢ㥗⢩ࣁ槰ȝ⊨ੈト殱擩姱㠤⢺䮠㡊䔕ূጅ箨䳒㭤簰ণ䩄౫爱䍺悢䓫ਚዕLj䧑Ṧ堦㶩惼繉đ刱䫱湛䒸溾ዽ䤹᳄㊘䵱怳⡇粫¼ү扥〠䨗䈰ヤ䴀ܲ㱰綩㱈沢䨄㘭ⓦ䐶唬愨ॲ儨ὼ姐㪀ʹFҪ匹婝ಇә煼爒щᤌᣄ癩Ҳ㩄欗咱䥉剦㕴㤖ጵĒʨǨè㽬㵇㤠礰᥏㊱䓂ᄵȿ䚱㟄壩櫠ፅ汯䲺ᥟ割撮凝礊⛔ዶ曈ჽ֑稝孄ଖ㘫ᝦ屰夘ሕ推䓬䦂ᡁऄ䡡Ꮃ筇宮控㥗㊉攉ᇻቢـຨⱒ㗄婩侲‧㹮Ⴑ㥌≵攊䦯挆⑸䰙ᱮ䀴怡ИⅭ‶灻劋⒯১懹φо᮲㬢≩癐ㅫ༷穕࢈┑凴扠♤佡ᜣܴ婉፱㔪㠪劷䕔Ŝ䓶䥼ǵ䧝圹ᑒ獉両ⳇ噬ಱ⩜㲃ᝓ憌Ꮲ╴佅ᗢ㛼㶩ᙲㆲ祮ⲷՋ䩯ᔖ⥱䆱⑸䤑ᑲ⭄影▕晄㲭⪸楝⪄擆Ķ䏎⚣ෙኪ㿤嫉ᔼ狄啫᪻啌㡒咯ᄫዕ媻അᆂ⇴䛑絲⬤玫ʻ᥄橫哕䦎剶✚䰉ᜊ乾撽䑀ܣ⨯㭼䲮ᓂ㥃✐余ᡤ徱熃惄絮檿煖ᩤ㒸q刣⒆䶩ᖺ┄咉ჲణ禓ሮⱔǝ嵍⥱ū⚲ߊ䢺⟨沁簂廄湬昭ⵖ媙㒶䤶ቛ☵⎑㖎㫰ᥲ᳄ਯ墰ᵌ栰甞⦤功ܲ䣉ᩌ㻫☮␃嗅䝨䨡ᵋ媎䔜℃匵╒䣑ᕊ㧽╀吱凇敮䪴戠窋Ӊ燄剂⛆伕㉴睉揳篇嘕拫㵇䩩瓌湁勁◧ౝᤪ楜柅䉩₺ᕊ窋㔜䔐卟☆䮉Ẳ㐔簉ȴ֛䵯ᮬ畃摺ⓘᥖ厒妴䠦ᇔ⺔䘮儼晄幯䆻⫹犏擸ፒ⛺䰍ᆂ㖎ᖩ✳细შ㢲党䚉壀⥩剝❖䬵፲㵔崹唳细ⵯ⺵⍑檗㣍䥤㏺✞熠β⣈瓘硲⊆䩨ϴ摠ಫ楠㍶ᢡ仍ᔪ⩬嬉䡒℥哩䆾楐媜㓏楨㊟✉䧭Ⴚ㴬䴉䱒摅൬ᬱ捊ੱ䳼楜㉔斦䮭ᲆ㮔緉㖳⿄岮缴兤㉿┗ᨎ吗䕑ᣚ㯬窑߲ⅤⰮֲ櫠窖䲽䨘㍫㮩丑ᑆ♌樹̠並䳪ા㵒剸壅᧦劏♅䥣ᩦ⚨㦡湴⪇ࣨ璾啚俀䲪ᥪጼ⛎䨙ᕶ⽤紹嫒䲆᭫弰婮⳰及晕䫽ᄦ㊬䵹ⷲ⇄㱭妷梶䚐洐楥叩䑖䫮ᓺⷌ嬹㓳㦅ᚱ᭒ᩳᣚ⧆厶教䥪挆㑔潹㇓繆竮㖳᭕噽⤒ৱ挶栆䩩ᢖ⨔䛹⯒ᭅᕯᆰ㍇♪沼槃㉧♅䤨ቖ泹叓Ɔ烨綸獛᪖沨ᥖ㉾枍䨻 ∄䇀γ澅ᛪ⒵ݟࡆ墫出捪ߩ䳫✬秹仒焆幬㲾千扢Სᧄ䑂昳䣍Ꮑ䫔䥙㶳儅ᇪ䛋䟮♩ᔔ㧸㐈㬈炥ᬆ⡔啙䒓檆嵨玴❓榮ᓿᦕ㍎晥佷浖⾘俹綂羅嚱煀⺝䲹㧁㊖枭䫻ሆ㡘䕙寓ą୬䰅ᵂ㲚Ⳕ㥸㉤㭓云济㍔塙ビ䖄捭᮳孙ڄ₦⧒㳑⚨↙ᵪ㼴矹Ꮢጇ嫪妱㭒ړ⽻㧔剒ٛ䨗ႝ侼䁙孒⬆⭩㽂⭙皒岷㥗≘⟭仝ᶮ⨌穩ᄓ檆䇪䞲ⵟ䚞ၮ榢犋⒇䯍፮㏹ 慳�㋨㦄୕劉㒭㆙珴摷亙╾䏉⾳&棨㞳瑲䤟㉽䒸䮖‖ご䞱䜓燥䯖嚲潑ੲ㤂㥽㈺曈䠿ῆ㎬厩樓翄᧯殴⟽毆㽱槽㋇曗佳ῶ㇌甙笒䥋ᱯ爼ᵞ湪ℾ䨛猬䶽ᆆ㷼妙ᝲ栄屪ಿ㍍ኧ䣣ु受斑䨇᙮㈓ℹ竒ঐ櫭Ꮍཝ䉹ᔀ㊷⟏仃ሞ⮜堥岓唆ᗯ碾㽟㚌┓祧㋥曛䶯ᰡ⏼䊙僲䠴滩掲网癱惒楋⎁撙ထ敾⌜禹漒凤姨熺ẝ䳺ם半晇䤨ἡ㢢䎹⌆澩䞴Ûᙦʨ稉Ꮠ៍伝Ỳ⼢匥㼴歆塎Ά֢ᙧ˔娔獏晰⭛ᵡ㏼䏉䄪缆噫璺ნ㺐䊽䥇媧曯ᶎ㘄纥㔸㊅槩欴⽁♩㲥槝猳朼上ۏ咏㧙㳓睄᱉翪罊ƅ㳌秔㋿摑䭬١㤢圥䀫ំ硉徻捏纍㳚ᙕ䬐壡㭢䞱已ࣄ*ܶཋ晱瓗嬓猢ᝀ䫐冮ー䃆櫲䤵㉎䑰灎窆⋭秱㍔斘䦿᫆㫂礥⼓揮⦹ፎ冝䳺䖡ኖ敄〟ᶾ⯂䐥窫ᝇ♮徻ピ兯ᔎ䘖㎚ᗜ䶠嬲⚬嬥ʓಆ㡉摸杀湡❴㛦珆ᙑ䥈坑㞼春勲ڢᅰ㸻⍗ㅼ�䘙獇⨷䣫ᓞ⋿ᑩ䩳昇ⶮᱸ缩物岛१੮ᕬ⩩ᬶ⚜仉˒⦄Iઽビຒ䋬տ┵伟ᑎ␂継㽳ᄵࡊ䡼梤五ዳ䕐涕晏䫟ᓱ␢籅缪儵ы㎳ف८洟ᵉ̸ԡข㙈癉嚲Ҷ匢ቲⓗ熑㳜䕋ୗ孶䳄嬣䃨ࡓ䲴眦ቲὪ溉ⲱᥕஙᛔ⡸妁⦂猙形瘘幫牲݀⥧⋪䗦଼᠒⾉េ㹲罥ၳ̵克灿Չ⥯繉▪䫼ᚧ暫ၷ剢籹㲲⸴墽䣘⦅挔绷䣜䭰呞⻲縙ߒ户粓䑹罖䢉Მৎ䬑ᓊ⹑ᣱ㴢塥Ȫ溷哮穹䓞ᅰ㲿禣叚ᔘ⢱Թ⿂䗅⢴͎౼嵆ಜ㊲䗉䯀ᚓ䡔娖ⰼ䢘婒䘶泩ᦶヅ㾥䋤斪昢 偷䣒䪙勓㖴䍪瑳瓖䙳㋐斨䭎䝂⡰怉㑂烥囫ᨇ櫁ᑷ泎庞ˢ◌䩧歄⩠ᢁ⪲夅ᳲ夵Տᙽ泔庐拱敼䮇ᚏ䪴勩㖒䔅㐣破旨ᨮᾬ㻇䲨લ▦媁㭼惉礪ᐶᝉ塵亙狇ր䭣▾⡫䯇䅂扪嬹宵ᯫぴ罛祻㳞䅁ᓾ岹㼒糩縓䔷ㅌ繲嵗㹨犿槱䫸ᕢ䬸彙⽼劅ừ恴瑍㡹ᣇ⦚┟祙䩕曍䡴叒Ⰼ濅⦳ᜦ⭊᮲祔䕻⌚斀珯ᆨⳬ彞♒圀䇲玵摋ᙶ䋂奰括ᘋ勸城⿓ᓥ⋂簵ݠ֙㔥扠Ⳕ嚘䬖效珊䓂⼂廉げ冥楊疶䓉в勃憄糇ढ牸土䲋㔪粵寪µ⣈侷動⊌岬数ஜ曪⥲啙㷄嶵Ӫ屷摺壞ઃ䪲䕰剔堀Ⱌ務ⶲ玙縒繷㥋ᅼ䵓檂䬁䗞⯇ᛎ⬇ᠵ⩊䵅ɋ䨇泉ᅹ㝄ᕫ妀⫋⥪孥愵ᳲ⒧߫Ⲵ䦟⢧㤺ਬ暎⮄唅⣪栵ో䫏нⓘᖃ糂喑⯙ᛪ⯻ᒥ⠔懹䍊嶶櫊拁暕洈ᕰ匦栀Ⰼ卞⊊橵罓㾄磏啳嵌兦㴕ᤳ⩣⠘猰䇊⡠卅㼵䈳⛏ஶ䃎喉䪫ঋ⪖埰幁ྜ堅ᵋ㾷矨ᥱ拕⪪ᖓ⬮基䧚僎∬怅ᭊ㹶䙩侰奖䦎⋆㤬䩴ᨵ⨄㰊泅➓ዉ宾䕒ඕ⫞喯⯢嘭⪥ᄭࣵῲ⣷彈䙼惙ቼⳭ৯䯺൫ቹ∠岵碋ۅỈᑲ棐ኈ䔠牤摵䤜儊⮷㚙⚊㓚盍惀㖜檼┮˹哕ⰉᏫ弢娞㟋㒇刪㵎൨ત㔹⮾吰Ⳓ崥ⱺ呹↊妴懭䉵嫅ս櫲㕲毩噃⼆吹㵒䋕ᖋ潄㉌㕳᳒㖂欂喟⩥ᕼ⣅ᮉ⓺旕ࡒ䤶ⷈ䎻ु浢˄䤮歅呔《垙⽺䞩例ᬷ籮㭿䃓嫖ׁ櫺唤乧ᐥ㬒矕榊ݶ⧋ᵀᶔન疵⯺咩⧹ᛆ⥊䅾洊廴ُ䝵曖䋜疾⯅䁥㡒井箲㺷珍⩸⻗涑㫲姵檒圈⯤健㰬撵峋悇毋穳盄斂㪽Ո㌟◗⤾噞⬺亙Ꭸ㐆䭮佾曛䅨⋂畣橜䛯⣘䪑Ử欕ඨ嬳召ⅶ囙煱嫋㕶䪋硍䧸傝∬䖙ࠫ㊵䏋潰ݓ涏⬍㕉刳嗙ⷞ夽㕪穩愊戴喦枵经嶙ઽ㕒殷堒畲Ħ╸⫵㮫⼷㏯礇壁熁笔ᕫ殿唽⼡匣㶲刭㐠㲴篎▶ፏඍᬁ畄㍚❩䳜孆㎪䏵耊俶᥋憹䇍綞ⴜจᬐ坖⬊壉⻚縕㤋悏ჰݕ嵹㫦ඍ䮈㛷岉㲲嘵○珷Ɍ⦶懈ආ劭䖈毘㜻⼍㩊皙勲矶㗌匰绌ᕠڤോ氄㕵⥈哃㘚䄵今㟶炊㖼懀嶋ۆ疠᪬ᜭ⽰岃Ⲋ墥恫櫅りṵ兇ઞಢญ犩✡⦁夝㱦眞圻ᑔ⃨㣲⥍熏瓴䘄珣栘派媃⇚禭䈋ᩖ䍭睸໖ኔ೬痙櫜✃⺑徭㳚䰠⊋ї䱏嵶⛇捥䜘䵅毲㕰櫈嵭㚦䅾⯊䙕汉л㫘䵴ඥ㖰梱媉㹺䶭㪻䌄䊳⧀⍹⫁ഭᬒ㚶⡉囃㖬䚭瘺䍕廋㝿⧁⺌劯䕰櫪柆ש刃㪔垭㌺䕕把䳽䛑㎌朅䶥㋊㘐澔吂⓲熭湓兗篌㝽姝厙曉ൽ朼椩嗉⃢篕㥫媶翍ձ卿䜕㥏ᮝ摚Ⱉ埉㌺春䦇࣋惷啄⍿挚▧ᱪ㔞俣㈶夹䙊倷⿈ೲ㽌敿അත᫊䛈漑嫳㟦欙ⱺ㖄又㳻烛⍦㫑կ犞啄喡僅㊆淭៊態廋勲盉ች䫗䶮⭎㘟⫹嬅➆梉ཋ側㱮祺䗕䖐۽ᕟ檙㖜潪吓㢶撅总ɶ捍⤠⋙䕣ڽ䨌⮑㞼⺒偝㾶卍䞻羷䪌ൔ亍⳺ᧆ媚哈毎ጳ⾶恕徺ᙄⶏ嶾卑歿ᒰ䶊宊㚦䳵剓Ⓔ繍䶻ӗઈ૱煊գ曀淢⩽ᕳ䍾卞㿧ᴕ侺楶曍死ᛚᮄ㚴ෳ歔咎䥽ῳ㬦柅┋揇ڋⳳ坖ᵿ圏䵤孕伵冻⚆喵狺ↇ䗋㺵竇暈⳾㘜傞嗙䲍峭㙖䳵㞒�㪾獉宊㶈ᗝ嫻㓲猡卑⏶梅᥊ㇷᗄ官努◢᭮圦俠婺㍖晭婕玌ű潃㍭土ⵗᰍ㚎泍崥㖖糭Ὃ簆矈拽Ⴢշ犭㕺寪⓮澭士ㄖ䰵㓪㡶Ῠ廹㻕⛧旤⯊㜞溥坩›屍ź䘶彈Ṵ㗜ݨ槢ᬮᙎ溵圻⯖琍祺婗㣭棴嫄歧糣ⷹ獭㖚濭喙㪖䅍拺Ǘ疍懰ዄ兹禽૪ុⶅὫ◪巍ᑚ⌴捆⏝䮒Ⓡ්牂㟋䯮傧㏖绵㧻兄礊確ⵤᮟ䓍ᦹ檟㗞ⱜ嗧㵂僭Zᷕ盌獲⏅筴ᓈᵯ䩗㑙佳崓㺦䟍ⶫ綶➉滸㮑ຣ浬㰔琤⩩弮⏚稍ٕ⾋䉳㷅㪅圛洸㊨目楳哧〒疭䁻㠅洊㫰⋝୶㜞㡏ኑ㞚檉噓㷮名㥻◖䵋ዻ珛卧窯敩ભᜥ梳ኍ㙢殽伒䗔㴋᧻ு㕯ᔛ☁㉒畚⧻ᰁ⚜祽䁛罷ᙉǿ嗒坲囍ᕛ㍫⟍⦾嚕㴈浙冺嫵⌊⇳㭼䚶帇櫺璤濆娑㱮奭⫛囷ⵍ孴✧੨滠䶃㭊㒦䷵ᰵ㚬狽⤊ᶔ綎嫵㧖嚷涋㯴栍泰佌䵐Ѡ圬⮶᷷4督#ć㩆甿Ⲏኝ⪐ಞ⯚林巽㯖督፮ࠨ碲ŝ換嵘䃰㠠羔ܣ巸參䶂端ᵇ䶓ǂ儧怗㨪ⱝ忚क敆ϺߝJ䁆⚈窾犃濛圣㨾愂ₚ焗刍揸ྜạ悸筱眳橂栯㲾穝穛㫖ᤉ䏽䟋摹Ỷ㵄䉉ؒစ洼䓊勚凚ഗܧ䟁䮏⻙㊷⢙睶ɬ暆~擝焀Ⳳ礪䜁ᷢ⧌弅㴰稷喨桇幏㮾嫝➉⬗梂䲫៉桓ʘ㊨䡵癋楪桃ᓾ櫭添ṗഎ添㗖坼坃㵶笵ƻ橼䌏⓾寝ڋ㱂昈Ḥẘ⛥沞穟Ⴋ䫕剢⇾缍巚䰈䐈ߴ梶ώ㜎㈶篷䎷ↁ䠏❫㫝儻缷␏㋎俕ᾟ窄続ⶺ澋ⲧ嘲泝匛翥㌍滹࿔杮㻡戵箺檖Ƀ月凞煺ቜ䨔☈厬奈䊥弎累猘畉檧垷⇞徝ĸ❘䯿濙榁庫㶅稼盫潣桟㈾曝ማ嬕⎑㟹῎㾌Ẃ緼穨⯕睏冏㾞䅉籚䑖⌉旽ௐ➟㑹㷧簃甿沬ŗ叞睝䗅狱吋俽榥巕㼛㷜嫃睓洿兏☞缴⸚,䀋惁ៗ⩱粥紶穀䵟徳⯎䘝Ớ堕⻥䯳�羘Ǭ䦻⍶ք̗⛦㣕䯛ഗ⺏埶䚷ĝ曒癘ܨ⍀㫸Ջ⬚ᔴኺ⠹䠇మ䄀倦ι突㜡湇擞䦡峰囍ᑁ堹䢶瓠䄓ȅڬ凰仠㉀澡痑ⵝ䚻偓古羍引䷿窅㙿櫷勁š䬣┧䖳㐻࡛傚䄑溶Г竲皆柰㫵䦞碝恳㘖猉ၕ傆䃩䈈㲎䖘ᤏ啀燡墣⒠⫳珴ၕ惫ȏϥ㗶琷䢝巷暣㓸ᘬ⎍絬ℇ䇶噡ޜಯ⎚䠀熓Ҁ㹣ခ࠹混翅Ὂ⇵甙و椬ㅓ⬰竃㙣䞛尭㜕ᑖ汚ە↻昮Å矈ॣ惰橁㚡烚磕㜉翷ᄟ㐶䏪⢺ሔɅঠ㖀⣼呄嬣å僸憥烆ⱘഡ構奰炑㓣浳☏禢墜ワ㒁䎰¬መ偱ዣց囉犧䀕Ḋ⿄㢀烶ਫ䍚ᎀ櫨䏦⊆企惁禧喖䕉洸拱焚懐砿ك抟☳Ⱌ妸䠲缬举瑖㢝䪰ᇐ患玆桢ᢾ剈៘撀⽃䓦Ჩ䧎䢫Ǯ州婬痸ᨈ㖖ᄈ䩃㚛䳤ឨ≒瑶偗姐䭩൭仐㳦㾮犽㘛㭧䊫ቜ穉䣵壦�悲⛅据ᔰන啜⢡Წ䘈ㇶҞ䲘⢾⌼䞺焛ऴムᶱ彃曘囧ྦ猱⒈ᒜ冰⏸䚥ล༪扱掱敦囤帓䒉څ䔻㵇䋇㞿櫤㇀纱湃ᚃ⢱㔼ᩚ䒪汫卣㑼䜽ೊᣔ㾀櫱硱ᝧ㚭∡㩛咋䁙ᆧᶧ≇ᅲᬟ塧ㄡ䑣䭧秦Ხٜ穆ᣵ壴|䘳ప᪇囈憱掱ⓦ䗧䊨♕㙇䨤ᣪ煡⎓ౠ\"劈森境獦䠮∺䙟潊ಗ凢提䜑渔䏨✽㒪湥ि枤沃;⭷⌵䝃བྷ㣸璄䮃ᘂ䎯ᬹ癚撊⣵Ṏ⏂䞛౦ᾔ㕸箱唃ਛⅥʭ乚撋䨿⩾Ȧ䟙ຎᲒ价㑁宽烦璬๑牋ፒ偍挤㌤凎᯼㯴ᨸ枩嘀岭㐗匊ಌ植䇗⍘䜷ೞጿ䂽㊑㛂㮐眺塖粁ę㈙捿䛯࿌䪡瀩悲G媬䤠⏧窸䈸傐䑴䈆䠆ᣴ㒤缰ເ昩⊣傼慜碒㞑笘禧∯́ᯢ㚤溈瘃糸䪬点⅟䊐䔋梱⎗䜥Ě᧴ⳡ山噇ឯ眸煒氰杽廒挿䜛ιᤄ⌑歀繇爀殬ኍ䓩ṹᐞ戫䐪ř噩Ⲧઑ㕆玬似䅑ኝᲖ䨏⎇禿ԗࣴ㢁ᑊ፣䕦景㑃灓劘㾘䧃ㇶ⚬ዹἔぴ姩歖升Ꮔ⩥撀曃倰䎇ૢ༾ῒ㟄燩垳罇ყ㲸禈㩗ヵ橤揃ُែ儿⯁櫃▧檯匸║収䓶㇌匯䙱འؼ㴘沑墝假䒸䅚䲃椀燮捥⟝వᬌ㯳⧮䞱庅ᙋథ勵糕唟ᒖ叩䞨ລᤃ᠙⯉揲ᣋᵭᷖ畒ᔆᒧᵇ䨿刅Ḋ㎰櫉䳽疓፯㊹媏ᓥ檵榺䘢喞㱤戎䒩䇊羵皹ᑼ㪖⤗盅揲䠙ྗ⧹ᩈ晱惑橦ⶄ㘎柿檓湱䋛吜䛧咤च㺔汢犵ç屮Ҏ瓴撞㓥↵稙㮡䷍䢙怔抉冴ള毗㎉掷亣㏒缇叐寲䳼⩦㜬缼義撆㐖⟊ӽ䥟䮸樁叹猩倊噆ち岉桓厦ᣭ淉掶燒䳻⦼㏩᭐㕓Ἲ㧔椬翃ໆ⯄挹博Ҏ䳲槟ᷜ柙仒欜圸瞒壽⟦擭▸ሧ㊕㽣䦮ኟ涩ᐘ悪僳Ệ㝬ଔ歟ᚅ甂榵㡏᎕企⧶㉬緉恽ʲ尺Јɘ䚑ច妼䒈䙴శ椲㪴琑䇓ॲ熗涼埍ᇇ㉿擋㏜ᬿ෫᩹勌羉繝绦ử҉ݕ懝ኚ妫卲⛏พ漚㣄潹穓炆綗㪏䝟岈殆㨛搌㬙䷜氆㨼瑾爣ↆ䌆姹㟓䀣ય昄柹亳ᮙ徦⻙佳⌇ʮּ᭞坑崑姙㧶叞ᕗ᧻ᰅ㸨ɜ᾽囬㵋ⵜᚎ棰秱䍉曘ᨳ幜敋ℓ⪘叭䖽獘庘㳠㦵匰宆䷜晰㉸硩簃垆扮庽˳絓㴎ર䆻昨喿Ỷ㆜溉䮓ᓦ淬⎾瓶㺋甖秘吀樸䵱ᡂ㍤殙䔳屇⡯㾸慐㲐ᓱ爐Ꮪ⟽仓䢓熩申‶䣗⎔児ƙ䓠㧏⍗♢֚῞㟴戥疹ῲᡏ⎿⃓)椇᧠珫⒖䳎䤮㪬歞檓ㅪ珯ᦏთ粄㔝ׇ掽櫂乇ᢛ䫢羹婳娇ᣯ㪋祓犄洁⓶୷歃嘗᩹屵㑥昫ׇ⁺䊾ᆋ崞תⵙ厕俑涼㍌癄檫䤶惬桹烚ൃ⋥㨕掲㮑⑊Ẻ㼪⾉攫丧ଯ㡿卝䛄瓯妻㥅扣坊檁㐼牶礉⍓ẛ⌕䖩䆣勃仇⪑㾊↥焫变䴧✹㍿彌ዾၸͮ昨琿ὰ㒜笥䪥⢶䄔扼ヒ檍ጔ燹◦曰ⱨ彑バ瘁䷅匆ງ摻壗溘⌝┟㎂ᛝ䵓哱㭬櫥䥫夷㕍䷪擾楏泣妰䴽ᙩ样ᦉ㵜狥侫绵穽⭑盏勡વ㍗晨〔婉㵗㷙熭·僬Վベᚖኊ䘞ቐⰴ妘㎍㱴搫༲硏泘ↈ玅㦠㌨曧久洶㽲恹捫禶坍⮺ᚏ甉ⴈ枰⡡䀜榩倓丶滯⑹惛䫍狲䯏枡ⴜ审㻧坍ყ洯㖉ჵ再烰星ी柛令䦄㮇㞹撞焱ߑ䡺↽䖘ᮬ旽䰌㉲⾫ᡅ㌻䍅䩶牶༚噺⒳窘挀᧡䵢琉ⴲ媻埒楹義ᙷ⍎⺽牙撖⥣⧚厙ᘥ⽖ᶅ㩤秂嵕ⵎ㔍⦹ᖀᴊ䗜䬺៖ⲱᲛ弾㾢石旧灌౹㳛䫞⬚嚢庪噜Ⳁ⬑げ椵緫ͺ穌綿櫑喝䞎▭䯑ዛ䵊塚㪂り䞩㊶抗浻᭚㦏؏⮟ᚲⰢ定㩶㟵氓潷Ɨ⬢悦憉栥ဨ殞坊䰦奞㮵⩕䲋堆䧏缸繶כ熟䁱ங䱚展㐱⋥泫癷Ǐ婭曙疜糡暪㏪ᙎ伪婋敒盕揓㸇⨬嶼ⓗඎ狳禣ⴭ嚭㖖崎囬盵䟍〉旍⦽ፓ㦋䌀旓⮣圛⾶嶞㑚禹库烷浸筰嶔⫪嘑⭘獳ⳓṽ㴺浕攕⡳㻍牾ۘ疌ᴂ妲氉Ꭳⱈ崭㢂段䋋旧睮坼ᵗ囊ᘝ䵌垅ᔇỼ㻋⥙弳篧㇏䁿䛖喗㣯痾ˏ垳䳈幮㛂溵䐻凷罏孿泙斚ܞ䗐ᯔ回Ⳡ尡㦤渆硋堶䑯ཾⲌ權ᓯ獀圀⾒嫣㺦竑㖅摺㑣㍻櫕⎄伾㗒厽ݻ〞宣㠪楌澓㝶ঔඌ睙疀䖖槺᭦ᘿ⽚媝㬒籱塋忇槌罯杕綌狰䶾票櫄潼塱㴒曙義繖窕哻䎕崋෯㧈勤汷᧴㊦澥擣㖒೬㡹䇟疗⛰ዓ⤶㙋䲹堮㴪晭橋浖⳼ǚ䖁⋦ᘍ⭰㉘ⴆ壓㬆欥䀻げ皏䩸㧕㻅㫸䗨家㛻⾮复㭂積犻ᗶୗዩ凐ᶁஊⶦᮐ嚢䶠太㲲慕吹䳗双ᑹ燜ᶜ泪殰㜜⫪尝㞶硍伽棍ቩ盒䎎⌙㗾䰉檴⽮尫㕂緭义㛖斍㝼⣑⦂甚昔寙⫖〆屸唊繭䢻❌ѹ穒㦐䗏㧟䥆㕲淍巋ヌ礙掓䷗䱺囸ᒻͧ渳絪䨤Ⅺ៣ᶳ儧”⧻⛡枍擺偶秸盯紻孱崆狟㊛㞇Ǡ添浘ル㭴ᲁ媬ⶶᮑ㙎⠣姍ℒ俕⨜冧砈磣ῤス纲ዕΨ㮂溺娂愗㔔璖槊怶曁ᓡ¤⺗එᛯ疡ᣊ㰮甽䴀Ზ各叙⻔罛届㍐盬恤䙍漤Ľ䞅⒗㒭櫾姜极仦Ḋጔ睹瀉堆ც挅晶͔㋥痑槒ސ巘嶡㈜㖥澝↝䄝`它擩斓ᗻ࠴涐庣☉㮀梵淬矘俎疥⬊㲴ѡಀ້箌漄巗ᯚ瞏ᯣⓗ㓸ᚦ㷛ៗ㆐䨂察箍漃帋㭡㟌濎匛㕊翬Ί㎗码村穛璫䔈嶯磁癟䘩ᱟ⮒盽淜ㄗ㈍ツ⟓ྛㆂ㷇ₙ棈⏉ᵊ僂͝礔⅘䉬寷䟞➋^㷌符䂺Ꮇ屏㟚ඐبը؏㏹ョ⾁廥㷂篺癫漴宏䲑㗝䶛⊈㸎㏹埗ま弛▔愮㩻溯宯㙚瓝䵴ᐏ篹࿔↯㨠*ବ嘖䨁ԁ২䎬❒沕筫䥷淌⒌ओְማ禑㑙穦䝹䞻Q⑺㰮౯氧孫Ĉझ戛埗㣌儒㿚羖ጐ傓笹ư灎ᛟㆰ毤簖瞎沩�箘͞၇恃杮㞀⊠磺澰ရ䚡᠌㊡応ҾǢجࠄ熁䯠ύば㼰ᙀ尮࠾䀢ₛ㈦碠ϳ`ྍ怰㩀禡朣峚ቢᆣ倧籚Ẍ⢭碂推࿉塿彀皡摫㌧ʧ簾㊷㈯㥧Ớ榛䨼⥨ḟ堺Ⅱ渠ᔧୈ戾͓⟀儃旁ћ瓄ၴ㭮ᕰ牢ᅧᨛⸯ䀌偞ᨫ愊瘶䐅⁚ືႸ㽰灿䪄䠧ೌᑡ墕羗嬧∿ࢋ䃝°溥ǣ䃣ʱ㨃ᴣ⟷焛漏ⷻ㮰∃瘘㵧ඪ㥒ࢮᨀ௱䢗ᄐ⅔␁癣猲᱒㓿㓩䵃䜛㡘ᄀᬦ怿䑅࠱窛墀ǔ卞ౄ姸ⷈ䍩碣垃咪刐乤㶉௮ޯ泱繼Ⅷ杀┼⮷ᒙथთⴺ䟩╺Ḙຈ瓱攚ᬠ尦ⴾ䙟ಖ椞'⏉情ຄ殔㮱௱纐ㅤ熯䐤噛ಟ畮䡦揕䟇磑⍼煣欙∠ቑ墸᪡牟ย便㈊穋䞎䢵㭮ዼΗ㨼᧧繀ਡ旇嬄皡爕ㅰ2䷞ὖ♻槺⠠咑㶯倂ԉႁ竎㿰祏ీ⒀ก湠ᘦɮԁ̺Ꮠ⣜၅ᦂ㤂䔟ᗨ㎀劯乣ᐧ㹠丣摟㐼❮榘⊂㫤絘嬠็䟈碽ీ➯ᐨ䧩ᐞႄ从懲㪈䗩水 ሶജ倅扒㡄狩映ㅇ彨ৣ僄ઔ岿䧸ᐠ\"ᘸઽՙ揯䔙䧬v✲倘䏁≴瓙ų縘㈖瘿ᵀ䘰玹㙃∴符箘⌴⋇䂑┯ᗇᜡ➂䵞Ἧ㔜樕合盧≚笭࿆此糗㖂璨架䂨ᤴⷱ汄栧⠝儝ἦ㪤㷪屓栱㥨䖊⯸䪆㷶≜㏟䞶眰䒘央斛啑ૃ✵ԡ抪ᬆ䁘§慠妿ѱ旣Ῠᗈ㝤ţ惡ュ棁㐂栒甎玶㽢䃦৺ٸ㲩ࠣ˥䉽洔᧵汞杸⤛ᱶ⟦ⲉ噪⾡ٯҋ焣嫫璬㔄䚞℃争囥⑼签榙䄳❀⮼╓ⸯ伽㨓䢜㈼⢑ᆯΠೀള䉸斀厼డ互㧥㏹筛佄⊎㬼⾙掓牒啑Ⅱ獟暘窭渵䙝朵ॻ 㲌特相灰Ꮑ桲Ч暔皼砥⢂㇇ନsؙ掮ᠠᏮ呃犂ᡪ涿ɓ栓㡉Ķ㨢狹潨㨴硎䴳ࣙ䆛̅ߜத៑᧟ᶉ硱–爧ᠠ䡼僜旮䌂稝璀峘⺻Ặ㤢熸ࢫ缸Ր仲⣛溠,䉅斦ᢷ梑稁㤦炭䌁懴偿†Ǵ挧ⅩጋՄ䯐⤂⹅ᮉ㤂䵅癫䘛祎䩼哟些匉浘䯐⠠�ᙼ墆妕ጂ,䮮᠔*⁉㦠於㖰ᑯ緁泚慧㌊昍䰛ឮ⼄峙㹒爅掳潸㹽睤妞⌖६Ⱎ朱⼤巚ឪ疶ᾬ填ᦁ勘▟笳ᗠ汇㓙⿅橓㋞ᑵ敓濚ዎ樊᧓ʣ‵䁔熊培⺿䇵㫢䝵羦ㅅगតፄẖ㥖ፇ⯉㲋儴峖˴ྩ犘ᰂ囎ᦽ嫵ඔᜲĵ⍐࡙睕╭㦌͕稼ཷ怑絽绂ඖ横㰼ڙ型处亐磕椦ཷ枘䝿旦ⶒ伵㘀母ⰻ䁳炽䀂⒕档䉚捈♐᧲奦瑣ᜣጩ‡༉皝㴔窹栋扝翏沒䮥䶔ၞṗ徇堝僡嶭㫯భ盝䭀ܖ瀎慎❠䜑懽їⱣ妪䎏Ȋ省纈㨴撏怨∷䎙⎬ਸ਼ႚ䫓ڐ䳐敆簉්Ź潐㇟㔥䜔㗮ྋ䩦g䬄р㒋㔯施凐㨦㾩⪟㑊㠄漙煎ℶ獭派ॗᮀ婣ࣰ䪅䐦⸐両絥姱峓㳦煨ᬻ捖汏泾㠤玑丌㓳ޚ∙峒ж翱獐˗倨狿䗜⮚煊扇籔⧇恡幎ゖ犜ς⚎䞽嗞憟喥丘嚆þ₂㥶⚮⯗橁廥ᝇޔ眖廿ᔶߐဝ১㺧浐㟗ఖ緒疇㼨ᶯ淵㚐哻懭廌䉮瑭ज़暦俷シ剁ǒ䪸痒䛙暏凇濊獾Ṟ僘籡孳灙▶媠娕ぜ仫ḉə੬䴈嘇ᯮ䝀㤦瘨妴⡚塇䅥 °䀠䞽※အ匈⣀ል◥䫽紊̠窒䳿䐷㷳搎矼⾠徶㠾熙碛啓摮梢㳗ྔⲊ㸖ஹ砓漷彏㺓䫝愛林ฎ㯽㟝矯䐻塜㮭ፉԟ嵤浘粝缫得Ꮑ柾ボ庘⪄㸏摻瞐G屟㣟㔝憛戯堎䞓忘ᠯ缎䇮ࠌࠟ瀕Ꮿ瘡穈ὲភ⹏恞磞従怤⠥篸ཷ潜峿㬾碣缛全累⡜忘ᨦ缈甴Ȣ࿘ἣ䝊⛠盳Ჹ⚙⯏猂Ý瞙∁䐕ߡ石伈㶵Ծ粑禧攗嘿䠿墟ℙ戓Зޱ༰憕ᤎ¦ࡃ歶ℯ眎浒䢜㵮ሇ䗹簘དྷẀ㻮㿁烃漛犯樎䖯῟⤒弋⏾䟦Äở岸禎猿䣠ク㼿㯭礧ᤚ㼟巵䟺࿖ 㿠突璣敧涰㔾䯼㒜揥䈓榭㢡⍊ˤ࣠ῊӆⲾ㥟亭ႜ嬿ᐈ掏❃偪䀕╧ੈᓲկᖧ⪝畡ᐉ⠈㡥ἀご緉炣χ卯ʾʰဈ㧱䲑画⟎⑭産剟檹Ⱥ忇懇癑͞抆ഛⶣᣴ⎌揠ᨏ㎳ᕹ篁潇⬗疾ࠒ嚟盏ڭ㒅㢡樧ṄḈ㰆䩚备呦⎾筥ⶮ䊙ࣹ䔳侻Ὲ㌗࢙罄维瞪㲩ি卝澙4৪ཏ伦䂞㵛ࣹ瑫崪O㠠䃞⏚㭮ؒ௭猯篐徯湖e爫羇㨴硾␂纞䎑ㅾ绢៨摚ᤃᆊ٥粉強盀摿ཞ䆚ᵩ䡠䯹ៗౄ弩㲂窖ᅹࢷ䨾Š擝ڝᴚڡ㧭ិА㠹㷻瀉犈㷲兡Ẃڝ㐸Ⰸ垴⽭峱㾪稵糡橷涗䅿⊢▘㝏㼽ᐡဪ恸䆞㺖ʃ䟝熖╀嫜疛欚樃䰉厭⼸㧕㷦◵籼䫝族捾㛞䶟⬔㘂眊嶾ᢦ录㻃㢎ấ寻㝤络楿宐瘝煠毿㠲䴣㺦簚主粷橏⏉ᇜἃܛ慆漨㟤濱幝惚笕皻熤淇哿梋㽱セฆⰜ㟜瀝ഫ㳆綕綻眤暏ౙ澈ఠ䒡⭽樌ኤ濃栻㾖щ纋汛檏囿䘢ᮛᔒ²寯㟞澛倳㵰䎕琿∮⤏⠡廟暟綥ḅ㤌涙潃彫㷴笠悻罗姏➾糳垝攕༅㰒矪潪䡒㟕㤕窻椗朏寝侘悤崍ᘢ㠓潕徂⛭ܽ玌漗檏柾៝掚弙⸃篪㸗潑䈑佽Ӎ翑㋩䎽Ӿ娹火Ḟ楊㞨ῗ幧⎡粟ѐ潂בག⛝涘䪊䐖㓥⿲彽㯁⋣级樁叔䉞仝涛挐␠䄫៚⾿徫㸓⋅琠抡䴿䱩拶䫁∍帴刾渤㽸簮⮔⇧攄ᅴ᜶⢛担刟䐈畈係㑋ᛌ⍖ʠÉܾ㏗〭㊟攛ᷤ䝚ࠓ冂ࡊ㿨噳碎䕸噔Ⴂ窝嫟㬘汸䉛᭵ᾂ㿘籩筓璇欷筈奟暟甛摢ఴ楖偮ࡐ༠㷊悉眇朘▿桰崞䙮琉兀⾿ὄ䏗䇉憁䄷箇筏᳟ⷿ⌛崅䊡᠓╍ᒧ䃑ij氇䎾䵏䙿㕟ᷞ緶昞⟏ມ 㷲琪纑竫缤ᵏ懀䗟䔛獧ت堇熅㼤縳卫籢䀧溛ẕ涟朠炒ℏ⤾往Ńᴑ䂋燷瓏敿䣞埥匚丛Ⰺ栝⾹忻ỳ橍縙曷狏獬撬ᖝ怦ⷁ妴凌澼帺粍築㳗綏滿બ卂̜᭤⬚㢵澲堛㻟㺒篛羭䬪㏿嵹ᢿ彙∍䀳稌☣⣊佪ᵙ㡏࠙結ⷀὀ癲⭜戣ਅ䐜琏彵丬⫣篽ท琏汅⒟嫀ᲇ縞㸻װ‚ᝀ绌ㅛࠒྐྵ樿掯寮㠡⃞犖⠚䨒ᾧᶔ亞纺ᐛ瓩怿噟䗮⛂䈜㬮࠙ᙖ呂㿨Ắ僳箧白垿扟咞ⱐ樝吕笾俨厼䰫乺დ篧绯歀⅟䔿ㅜ戚క䊤〔䒍烉罬糷皯砏予ಟጟ㈜墐〵倞ᾮ㾰缵罣祇珏槂ෟ曉ᐁ䨘䪉堔〉䊝㼬网籿婗獏氿徰擐ଜᲞ琗暹濿Ό嫡羋液Ǘ痙扟䤘ស䖀ผМ栗怇ㄞ纴㸧紅煞Ṱзӥ刜ḟⰓᐗῶ㿍㾱砌縷禠ए纚㲟⚟匝ᐛ㐛砞〇Ύ㿤缑嶷磏焰嗟䶇௨㩒⮑䶞〗ᨕဗ搱ᇉۧ纃տ珿抟ᩁ✝昝⠔堄倊⟂滝翓簸垿瑟歟纟氧帜လ〄簄㙭翋翫粯羻ٟ罣域嬞朜ᰘ尐ဎ㊝羫纷絑簿羟綟梌漞㰜䴝䕦耗ῗ㼲縳糷粿疷矏熿狗睢䕩炟疻✠ট砄Ο瞟炽矜䖠༟猷瘟獴砟瘧琠灇璏盟瞼眠ࢠஔ摠લ恏Πඝ畏Ն疓ş癠獟烠煯盠୯營盟址य眅⒏ԏ眆❀ी疨䌀璌ˀිǀॗ爠९焠ຏ牚䞀੶␀๑∾㐏璙䟘圀ÀধȰ¿田ೠབྷ烖ʏ睯瘥䙰ිᑐऀહ;㑟砏睎煐൰༷畠睠૰ீૠ璀ྼ睐ஏ玔➐กú䍿烛冺䏯烏ݰષ炐િ瘠ࢀ猥獝䆯疀൴䚨నਜ਼倨瓐嘐࣐ਨྗ瑗瓰ନ༰ࢨഠਗ਼䍨ऐࡑ⑈༐৵Ԁү瘏坈নࣨట矐১痀ࣟ炰ໟ咬ү焗喈່ࡷ勈眀皞䄈ਈကய瓨ୠ࿈ಐಈઈॠ〸圈මਾ⚀瘈ഓ瑠ʀ甴ǐॠಇ眿瀠༸珨ರఆ䍸রઇ㞀畈ଋ畸൘ࣸరसை๗燨ຐৠे睘ඨक़ൈ࣐煕Ø✘ཬǘའبरಘৰࡡ璨ਗ਼䠘ূ٘ࣸ㈆盰瀤ຠતࡐҗ瓰玤皤తฤରઘ༤ఆ䉤ੈ摄ൈࡺؘਰፄ॰ਸി珘നତଇ犸࿊♰熤ऐ䎄ຠૄཨᎄൟ盤皘ඐे眄ර₴ൈค烄౼斴ৄ珘ਖ਼Ĥ಄ພƐࢤఆ䁴ઈ䛴ఄ煤ॣ斴ငॴઐగ矸ຈєဓ۔δ玴ଠ悔ೀྡ畴ิಸྼ皔ઈ䈔ྴ矴ඤ傔ௐ॔৸തऴࡘഅ爬୫Ƭࢉׇ䄁́ȁˬÃǟ߹䞡֞ɹƉӳ¼YǢϡӑׇ䍾㛚犄ߎ❶☴ۋ㕢狭捷䌎ծۊ؎ͦvۮ̔Ҽ៹擪Ⱦ̾Ǖ䋲Ȑ㓧熰ۀѺɈ̔ѥ⋾䖒̈́௦τ灀لԣ䋠߬ౌÂߡ۠ۀڼဂ߹α玠ذ甸ߠżૠ͐ᚒ╷䍍䄪۵ٴڹ䓰Ȉ疆盀ਜ਼䂡ݬɹpĞӂΞڜ̒ؔ䉃❇䃈燲⓰ଯ䔐ɰ\\೬ш燼༚ѼఐԢ¢ਐѼ่Ƣੜ༠╷䘞ࠛ!Üഴ˜燜ะଞڭȚĜজూކłଜȅӞͷ䠜ྔ⒦┚ଔà̼ۢର炼ШҼගེ،ԱѼ३،̀ءʹͫԪϑ،ш֩ԐۀȂલࣘ珼ྞֲະɰτ爲ంහͲوτ焢าـƲഐڢՒ༲ऽԖŲੌݬҺ˘⅒曪Ȉƌƒಠ恬īӼ2䋒Ϥζ㞾ֿƦȝ䈠 "}
The complete round-trip took 49.6 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-file-analysis'
- id string [optional] You may pass an id to link requests with responses (they get the same id).
- filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
- filename string [optional] A human-readable name of the file, only for debugging purposes.
- content string [optional] The content of the file or an R expression (either give this or the filepath).
-
filepath alternatives [optional]
The path to the file(s) on the local machine (either give this or the content).
- . string
-
. array
Valid item types:
- . string
- cfg boolean [optional] If you want to extract the control flow information of the file.
- format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
Message schema (
response-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. alternatives [required]
The response to a file analysis request (based on the
format
field).-
. object
The response in JSON format.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in json format. Allows only the values: 'json'
- results object [required] The results of the analysis (one field per step).
- cfg object [optional] The control flow information of the file, only present if requested.
-
. object
The response as n-quads.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
- results object [required] The results of the analysis (one field per step). Quads are presented as string.
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in bson format. Allows only the values: 'bson'
- results string [required] The results of the analysis (one field per step).
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice
)View Details. (deprecated) The server slices a file based on the given criteria.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate Server
We deprecated the slice request in favor of the
static-slice
Query.To slice, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using;
, you can simply pass separate array elements). See the implementation of the request-slice message for more information.Additionally, you may pass
"noMagicComments": true
to disable the automatic selection of elements based on magic comments (see below).Example of the
request-slice
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":7}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11162-JbsMcdox1yZq-.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-11162-JbsMcdox1yZq-.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-11162-JbsMcdox1yZq-.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-11162-JbsMcdox1yZq-.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-11162-JbsMcdox1yZq-.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-11162-JbsMcdox1yZq-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11162-JbsMcdox1yZq-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11162-JbsMcdox1yZq-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
-
request-slice
(request)Show Details
Of course, the second slice criterion
2:1
is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.{ "type": "request-slice", "id": "2", "filetoken": "x", "criterion": [ "2@x", "2:1" ] }
-
response-slice
(response)Show Details
The
results
field of the response contains two keys of importance:-
slice
: which contains the result of the slicing (e.g., the ids included in the slice inresult
). -
reconstruct
: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
{ "type": "response-slice", "id": "2", "results": { "slice": { "timesHitThreshold": 0, "result": [ 3, 0, 1, 2, "built-in:<-" ], "decodedCriteria": [ { "criterion": "2@x", "id": 3 }, { "criterion": "2:1", "id": 3 } ], ".meta": { "timing": 1 } }, "reconstruct": { "code": "x <- 1\nx", "linesWithAutoSelected": 0, ".meta": { "timing": 1 } } } }
-
The complete round-trip took 13.9 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetoken
is unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_line
will cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_line
will cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_start
and# flowr@include_end
will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
Message schema (
response-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution
)View Details. Access the read evaluate print loop of flowR.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-repl-execution alt Server-->>Client: error else loop Server-->>Client: response-repl-execution end Server-->>Client: end-repl-execution end deactivate Server
[!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with
--r-session-access
. Please be aware that this introduces a security risk.The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the
expression
field. Furthermore, you can set theansi
field totrue
if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theid
field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.[!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use
--r-session-access
if you are unsure).The answer on such a request is different from the other messages as the
response-repl-execution
message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving theend-repl-execution
message.The semantics of the error message are similar to that of the other messages.
Example of the
request-slice
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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
stream
field (eitherstdout
orstderr
) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :lineage Get the lineage of an R object (alias: :lin) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.
{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :lineage Get the lineage of an R object (alias: :lin)\n :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n :quit End the repl (aliases: :q, :exit)\n :version Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n :benchmark Benchmark the static backwards slicer\n :export-quads Export quads of the normalized AST of a given R code file\n :slicer Static backwards executable slicer for R\n :stats Generate usage Statistics for R scripts\n :summarizer Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n", "stream": "stdout" }
-
end-repl-execution
(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.3 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
false
by default. - expression string [required] The expression to execute.
Message schema (
response-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'response-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
- stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
- result string [required] The output of the execution.
Message schema (
end-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'end-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
-
Query Message (
request-query
)View Details. Query an analysis result for specific information.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate Server
To send queries, you have to send an analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.Example of the
request-query
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"content":" read data with read_csv","lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.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-11162-LsXaj6zY7m61-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-11162-LsXaj6zY7m61-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11162-LsXaj6zY7m61-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
-
request-query
(request)Show Details
{ "type": "request-query", "id": "2", "filetoken": "x", "query": [ { "type": "compound", "query": "call-context", "commonArguments": { "kind": "visualize", "subkind": "text", "callTargets": "global" }, "arguments": [ { "callName": "^mean$" }, { "callName": "^print$", "callTargets": "local" } ] } ] }
-
response-query
(response)Show Details
{ "type": "response-query", "id": "2", "results": { "call-context": { ".meta": { "timing": 0 }, "kinds": { "visualize": { "subkinds": { "text": [ { "id": 31, "name": "mean", "calls": [ "built-in" ] }, { "id": 87, "name": "mean", "calls": [ "built-in" ] } ] } } } }, ".meta": { "timing": 1 } } }
The complete round-trip took 26.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-query
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts
.-
. object
Request a query to be run on the file analysis information.
- type string [required] The type of the message. Allows only the values: 'request-query'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
-
query array [required]
The query to run on the file analysis information.
Valid item types:
-
. alternatives
Any query
-
. alternatives
Supported queries
-
. object
Call context query used to find calls in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'call-context'
- callName string [required] Regex regarding the function name!
-
callNameExact boolean [optional]
Should we automatically add the
^
and$
anchors to the regex to make it an exact match? -
kind string [optional]
The kind of the call, this can be used to group calls together (e.g., linking
plot
tovisualize
). Defaults to.
-
subkind string [optional]
The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking
ggplot
toplot
). Defaults to.
-
callTargets string [optional]
Call targets the function may have. This defaults to
any
. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any' - ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
-
includeAliases boolean [optional]
Consider a case like
f <- function_of_interest
, do you want uses off
to be included in the results? -
fileFilter object [optional]
Filter that, when set, a node's file attribute must match to be considered
- fileFilter string [required] Regex that a node's file attribute must match to be considered
-
includeUndefinedFiles boolean [optional]
If
fileFilter
is set, but a nodesfile
attribute isundefined
, should we include it in the results? Defaults totrue
.
-
linkTo alternatives [optional]
Links the current call to the last call of the given kind. This way, you can link a call like
points
to the latest graphics plot etc.-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. array
Valid item types:
-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. object
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance.
- type string [required] The type of the query. Allows only the values: 'config'
-
. object
The 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
The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'dataflow'
-
. object
The dataflow-lens query returns a simplified view on the dataflow graph
- type string [required] The type of the query. Allows only the values: 'dataflow-lens'
-
. object
The 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 id map query retrieves the id map from the normalized AST.
- type string [required] The type of the query. Allows only the values: 'id-map'
-
. object
The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'normalized-ast'
-
. object
The cluster query calculates and returns all clusters in the dataflow graph.
- type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
-
. object
Slice query used to slice the dataflow graph
- type string [required] The type of the query. Allows only the values: 'static-slice'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
- noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
- noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
-
. object
Lineage query used to find the lineage of a node in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'lineage'
- criterion string [required] The slicing criterion of the node to get the lineage of.
-
. object
The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
- type string [required] The type of the query. Allows only the values: 'dependencies'
- ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
-
libraryFunctions array [optional]
The set of library functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
sourceFunctions array [optional]
The set of source functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
readFunctions array [optional]
The set of data reading functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
writeFunctions array [optional]
The set of data writing functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
. object
The location map query retrieves the location of every id in the ast.
- type string [required] The type of the query. Allows only the values: 'location-map'
-
. object
The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
- type string [required] The type of the query. Allows only the values: 'search'
- search object [required] The search query to execute.
-
. object
Happens-Before tracks whether a always happens before b.
- type string [required] The type of the query. Allows only the values: 'happens-before'
- a string [required] The first slicing criterion.
- b string [required] The second slicing criterion.
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'resolve-value'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
-
. object
The project query provides information on the analyzed project.
- type string [required] The type of the query. Allows only the values: 'project'
-
. object
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', 'dataframe-access-validation', 'dead-code'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation', 'dead-code'
- 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.
-
-
Lineage Message (
request-lineage
)View Details. (deprecated) Obtain the lineage of a given slicing criterion.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-lineage alt Server-->>Client: response-lineage else Server-->>Client: error end deactivate Server
We deprecated the lineage request in favor of the
lineage
Query.In order to retrieve the lineage of an object, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.Example of the
request-query
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.3.0", "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" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11162-kV7V0x0n52pN-.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-11162-kV7V0x0n52pN-.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-11162-kV7V0x0n52pN-.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-11162-kV7V0x0n52pN-.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-11162-kV7V0x0n52pN-.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-11162-kV7V0x0n52pN-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11162-kV7V0x0n52pN-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11162-kV7V0x0n52pN-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
-
request-lineage
(request)Show Details
{ "type": "request-lineage", "id": "2", "filetoken": "x", "criterion": "2@x" }
-
response-lineage
(response)Show Details
The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).
{ "type": "response-lineage", "id": "2", "lineage": [ 3, 0, 1, 2, "built-in:<-" ] }
The complete round-trip took 6.3 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-lineage'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
- criterion string [required] The criterion to start the lineage from.
Message schema (
response-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] Allows only the values: 'response-lineage'
- id string [optional] The id of the message, will be the same for the request.
-
lineage array [required]
The lineage of the given criterion.
Valid item types:
- . string
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
Using Netcat
Without Websocket
Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):
docker run -p1042:1042 -it --rm eagleoutice/flowr --server
Now, using a tool like netcat to connect:
nc 127.0.0.1 1042
Within the started session, type the following message (as a single line) and press enter to see the response:
{"type":"request-file-analysis","content":"x <- 1","id":"1"}
- Using Python
Without Websocket
In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 1042)) print(s.recv(4096)) # for the hello message s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n') print(s.recv(65536)) # for the response (please use a more sophisticated mechanism)
Note
To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access
.
Please be aware that this introduces a security risk and note that this relies on the r-shell
engine.
Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).
The read-eval-print loop (REPL) works relatively simple.
You can submit an expression (using enter),
which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:
).
The best command to get started with the REPL is :help
.
Besides, you can leave the REPL either with the command :quit
or by pressing CTRL+C twice.
Available Commands
We currently offer the following commands (this with a [*]
suffix are available with and without the star):
Command | Description |
---|---|
:quit | End the repl (aliases: :q, :exit) |
:execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
:controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
:controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
:dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
:normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
:dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
:lineage | Get the lineage of an R object (alias: :lin) |
:parse | Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) |
:version | Prints the version of flowR as well as the current version of R |
:query[*] | Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) |
:help | Show help information (aliases: :h, :?) |
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.3.0, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
Retrieve the dataflow graph of the expression y <- 1 + x
. It looks like this:
flowchart LR
1{{"`#91;RNumber#93; 1
(1)
*1.6*`"}}
2(["`#91;RSymbol#93; x
(2)
*1.10*`"])
3[["`#91;RBinaryOp#93; #43;
(3)
*1.6-10*
(1, 2)`"]]
built-in:_["`Built-In:
#43;`"]
style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
built-in:_-["`Built-In:
#60;#45;`"]
style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
3 -.->|"reads, calls"| built-in:_
linkStyle 2 stroke:gray;
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 1.7 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + x
For the slicing with :slicer
, you have access to the same magic comments as with the slice request.
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.3.0, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│ ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│ ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│ ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│ ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │ ├ ( "(" (6:13)
│ │ │ ├ expr
│ │ │ │ ├ expr
│ │ │ │ │ ╰ SYMBOL "N" (6:14)
│ │ │ │ ├ - "-" (6:15)
│ │ │ │ ╰ expr
│ │ │ │ ╰ NUM_CONST "1" (6:16)
│ │ │ ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│ ├ { "{" (6:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "sum" (7:3─5)
│ │ ├ LEFT_ASSIGN "<-" (7:7─8)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ SYMBOL "sum" (7:10─12)
│ │ │ ├ + "+" (7:14)
│ │ │ ╰ expr
│ │ │ ╰ SYMBOL "i" (7:16)
│ │ ├ + "+" (7:18)
│ │ ╰ expr
│ │ ╰ SYMBOL "w" (7:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:3─9)
│ │ ├ LEFT_ASSIGN "<-" (8:11─12)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:14─20)
│ │ ├ * "*" (8:22)
│ │ ╰ expr
│ │ ╰ SYMBOL "i" (8:24)
│ ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
├ expr
│ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
├ ( "(" (12:4)
├ expr
│ ╰ STR_CONST "\"Product:\"" (12:5─14)
├ , "," (12:15)
├ expr
│ ╰ SYMBOL "product" (12:17─23)
├ , "," (12:24)
├ expr
│ ╰ STR_CONST "\"\\n\"" (12:26─29)
╰ ) ")" (12:30)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")
As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
When running flowR, you may want to specify some behaviors with a dedicated configuration file.
By default, flowR looks for a file named flowr.json
in the current working directory (or any higher directory).
You can also specify a different file with --config-file
or pass the configuration inline using --config-json
.
To inspect the current configuration, you can run flowr with the --verbose
flag, or use the config
Query.
Within the REPL this works by running the following:
:query @config
The following summarizes the configuration options:
-
ignoreSourceCalls
: If set totrue
, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files. -
semantics
: allows to configure the way flowR handles R, although we currently only supportsemantics/environment/overwriteBuiltIns
. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information. -
solver
: allows to configure how flowR resolves variables and their values (currently we support:disabled
,alias
,builtin
), as well as if pointer analysis should be active. -
engines
: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information. -
defaultEngine
: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used. -
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": {}
}
]
}
}
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"slicer": {
"threshold": 50
}
},
"abstractInterpretation": {
"dataFrame": {
"maxColNames": 20,
"wideningThreshold": 4,
"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 tofalse
explicitly disables the loading of the default definitions. -
definitions
(array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have atype
which is one of the below. Furthermore, they may define a string array ofnames
which specifies the identifiers to bind the definitions to. You may useassumePrimitive
to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).Type Description Example constant
Additionally allows for a value
this should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }
function
Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts
or open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
replacement
A comfortable way to specify replacement functions like $<-
ornames<-
.suffixes
describes the... suffixes to attach automatically.{ type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
-
. object
The configuration file format for flowR.
- ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
-
semantics object
Configure language semantics and how flowR handles them.
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
- loadDefaults boolean [optional] Should the default configuration still be loaded?
-
definitions array [optional]
The definitions to load/overwrite.
Valid item types:
- . object
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
engines array
The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used.
Valid item types:
-
. alternatives
-
. object
The configuration for the tree sitter engine.
- type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
- wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
- treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
- lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
-
. object
The configuration for the R shell engine.
- type string [required] Use the R shell engine. Allows only the values: 'r-shell'
- rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
-
solver object
How to resolve constants, constraints, cells, ...
- variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
- evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
-
pointerTracking alternatives
Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
- . boolean
-
. object
- maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
-
resolveSource object [optional]
If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if
ignoreSourceCalls
is set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
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 tryToInjectHomeLibPath
may be of interest, as it enables all libraries available on the host system.
Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices.
However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part.
With this, we restructured flowR's originally hardcoded pipeline to be far more flexible.
Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps.
In short, if you still "just want to slice" you can do it like this with the PipelineExecutor
:
const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
parser: new RShell(),
request: requestFromInput('x <- 1\nx + 1'),
criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information
If you compare this, with what you would have done with the old (and removed) SteppingSlicer
,
this essentially just requires you to replace the SteppingSlicer
with the PipelineExecutor
and to pass the DEFAULT_SLICING_PIPELINE
as the first argument.
The PipelineExecutor
...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
Adding a New Feature to Extract
In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts
, and add its export to theindex.ts
file in the same directory (if not done automatically). -
Create the basic structure
To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):const initialExampleInfo = { /* whatever start value is good for you */ someCounter: 0 } export type ExampleInfo = Writable<typeof initialExampleInfo> export const example: Feature<ExampleInfo> = { name: 'Example Feature', description: 'A longer example description', process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo { /* perform analysis on the input */ return existing }, initialValue: initialExampleInfo }
The
initialExampleInfo
type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfo
type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).Every new feature must be of the
Feature<Info>
type, withInfo
referring to aFeatureInfo
(likeExampleInfo
in this example). Next to aname
and adescription
, each Feature must provide:- a processor that extracts the information from the input, adding it to the existing information.
- a function returning the initial value of the information (in this case,
initialExampleInfo
).
-
Add it to the feature-mapping
Now, in thefeature.ts
file insrc/statistics/features
, add your feature to theALL_FEATURES
object.
Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT
tokens.
So we define a corresponding XPath query:
const commentQuery: Query = xpath.parse('//COMMENT')
Within our feature's process
function, running the query is as simple as:
const comments = commentQuery.select({ node: input.parsedRAst })
Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:
appendStatisticsFile(example.name, 'comments', comments, input.filepath)
We use example.name
to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output.
'comments'
refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments
variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath
of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).
Currently maintained by Florian Sihler at Ulm University
Email | GitHub | Penguins | Portfolio