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-24, 05:51:38 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":4}},"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-11129-aIvXKp8kzy1w-.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-11129-aIvXKp8kzy1w-.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-11129-aIvXKp8kzy1w-.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-11129-aIvXKp8kzy1w-.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-11129-aIvXKp8kzy1w-.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-11129-aIvXKp8kzy1w-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11129-aIvXKp8kzy1w-.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-11129-aIvXKp8kzy1w-.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-11129-4Umva9VJiv0v-.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%2D11129%2D4Umva9VJiv0v%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.1 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":4}},"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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-11129-BQ01Iv4RrmiD-.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-11129-BQ01Iv4RrmiD-.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 11.0 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.7 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):
堵曌糕掀ⶉ綹⫚浣㩙ጦ㜆ⲉ㫜缮糣砙暄ࡆᷕ穞䮮倡㏆⟗筨潍モⲹ粻弄墣ဢ⯤㰶幄嘵❎ཞ尖仢彣ے毅㖛斛柷㉗ᬋⷉ煹痆媕囐玱㹇亝⚒犎笌倕剿᧲ⳬג᮹㌷ᮗᝉઌ⋧ⴞ坺䲼忻◜㍋其㺍㙅⛏份⿱姸劜塵䳦歨ᒖ梞䟾禯絿䃸ᇴ嫠䟓ஹ䃊ڢ㗆氏⌞䵣䗼禵崃寔縨瘯焎čŷ怫瀵燿凼㱧㳷䍈瓇殄©挿哱ᴃ尡㹈䎢⍡筬唶窆倉熾ἁ榼嗴㲴岕柬穗哈⺹燵͊ു㏏殇㧚⍲焈㮨暱瀾圙᷽狙䯀屇亝䝮⾫ॉᒘ戗瞝䱽揳㾒㖒➜玖嬉粍泽瘕忳淚ਥ⫄ᠬめ侮土➝翼稂ⶳ徸厰砯檚⏱礊毧⧕ၝ戚乇䥆⠛㸇毘ᭀ线ᨔ⼃㽝㕃咊✠惗֚㷄㙾ᘌᾱ泯Ḅ凷䋇㰝ᶏ㽠嗭䎨敒弮狾吉ഗ徘㞭㢯ᓑ❃缢䮰廜㪝焷㳸䭯ኆ㫏姓⿴嫞搔ڻ牝漖继圜剧⤄揎彮㧞燌纗璽砄簿䐧ᶍ忳ᰐ喆緅瀣⧭悟⯱⽲䠙倻绗璗⺘⧰ſ甾ᴙ♢Ɛؠ乛緾_盃纑吗ᢁ၄ř瘧՚せŧ烠戧焴绮䓯ؚ㫾䘼䁐ƛ峬圃矟㕸桀幏睳ତ䯧๏䊠㈧嫰㼌牷㜥⁞䄠痿㽛ᯫPȰ箘槺K傠ᘤ叠⇴偰洘䑙㚬༰缙⅒ൃ⺦⇼ȼ≰招⥲㡻擠᚛䏩䆱坐熥ࡋ抖ည㌛硵㱌䠒᳚ᳪ䅑㎐䞥绨܊猰叛㑒⣞৲Υ♬ᇅ玠⻂ળ懈༐䞘打䂑တ䞸᷷ŵ㒭⨒払⻰剈湎ೇ⤤䢌Ő嘙㱱⡴䝈敥ⱑ幺࢟䩂冚ଷ᭦⩁⩰䃄ہ⩝žᘈ罦ᩓ⇡ঈ擃ك冑劸䋈ᴶ⺴ࡇ౻晇Š狨䡘噂ᇪᅸ峤太䣘Ӏä任㆛ࡘ櫦㗤ᅸ姥㙜拷ౘ滥⤿恧࿃㳧Ṕㅡଠ巹幚ㅾመ䈤疾ᇐ癰焦ōᄬഘ帧㗨擗ౠῘ疡⪘䛌择ू睰旺⅝ㄴ獤濥♷प勾ी強ɠ倀榥捨䥄䡠ߥ濹凵㋄楇牜抬䡠ˊ‰⡔䱸傛哣䦉䝘䔛⫯䥔亄戣Ց櫢䱘奅翸爆ᒴ䃄汄༒䶤糆⇳婸䃴ఢ㼥স璌ۅ㕁⨔䷐竆㕛⧐䩕㻇㕝繐ˤ畝⚊䗔稲൜ㇵ㒔巆慝槮䡵㛓㒣䵃⿅‿槔䴠呅ᾨ䴴撇穞⅖仴㐠※纊暴䜚ي㈢䃴囂ፙᨁ༤梥楕榱哬䊇涷ᦘ乱ই㍌妉䇲ᲅ㷮x✨睅ߥ⅖䤟ᎄ嵋煚ྌ䛒㭖হ䤌嫓歞ㄹ猀�孋ࣃ䪔ᒂ䍓ᄢ狠⚇❜㤣䧔猅⌾契䢼岊㍋㦓䭸䌆㌷㤤嘬䣦䕘禘䕜揊㍆䇡佟〙卖⦨ǜ珁潋威䲴అత䣯盙㴹㽍禰犂▤孄মย簇ㅎ癰¢秄榳䃾⪅偉礴䑢搶ཙ䤈ⶤ娴夣㱞䥬ⴆ䃂䥾ᐈ䛳睂焳ૠᤶ杚ᦤⲕᆢ䔲億ॏ㈶ቝ⚬⺂洦壟᤺昶㣅䔵佑₷㣑櫨䞴⋂崭䕫Ҵᔻ㐴ⰴ撋擊╂玀椺哛㐪儀㠘㱘䗵ನ劄య愸䰨憇㭔ᇦⰐ䚷⥷╆⯌䥧䤡◊灒窇ᑹ斪䏨妴㉀礲೬➶剖旷獴឴椾奫恄ᙁ堾沙䆲佇瑆榱⢠㑶拄⥞⻯ᾶ⹈祩⩵乵㥸䙪繵猻庙⦪䅵峉秥⣊屶磓श⤜嘠櫍ᗢⱠ୵乧楉⦄㥂硓眄䱒犩嬫⦌ط糔牃⸊孷۔㗾煈戶䟾ᗍ䮭⋴柼㗹〚ἓ囜榘ⴿ㧄⧺絷䳌ᥰ⢬䧷˘疧⡵ᭂ圹夯䥢紻滅ᧇ⸒攷⫵疙仚哫㻑橬狄Ƣ壊嗏ၔ磃ᗶ䛧䇘ඍⰦ籗摂䣜ᙺ場㍅഻⫂分㇀㦸漏໊㉝狦畸䧖ॄ汤氄罈䴾⻆秱⇉入䤧⸄槖ৌ桌ˈ㔶׀榫㝔圴䷹ජ棇秘愤⻌浗䱯儲橲拄⧺ⷰƺ榄╝-ฆ纹䀵ⶢ橴囔啋倠ᖤ倶ᔕ癍ᆱ嬻᷍ઐ完嵥ᎍ७㦉宄審潏䖡㏮妥〣撏殴☍烉ᑺ硷ޥ缑ₐቨ啒䄈煐㫍垖䤏⁔㮁椏㉫ᄥ̠൦ٸĚ嫮䟯冸ų床ഉሶ㪃唜紋❱㩫勉̏➆㰆宂ؠ᪺ᯣ峂䜏㛌媁兮㜍孯寬ⷽ䝱丩灀മ➈▕ᔧ凨ে㶆⭞夺ཻⰇ嶮ካ&㳳ྙ儈ඛ䬅ᛝ㗠瞓ᩉ櫝擭繬㖙ᯝ争ᑳ偨⋨⢤歺孧動⼲径熏寍樎䍡笎洝ᰋ彻⯟嬝溩ᑶ剭姝ᥬᏇ熍壭ㆬ妄䉀㛵怸ྉ煅墠モ℞窀㭲㐽ઊ宂剣そ筠㮽ᣗ惣⏿哭హਥ⋨㯽⹖儃吠Dž㲄撹摝dž嚆ᖦ浽憥⢲㨠إ撄တ枢䉞䇮ಠѧɖ櫉ന烺ⶫⴄⅦ潵Ȟᑭ㥦ب凸⚈煦㴼䈁כ⾫൱㫩䗕㻚ⵌἍሢ㵻檅㈖⊷㐒አ熡杘愲୳ㆧ矃㥤⬊嬘皦๗㫌痦њ簶Ƹ姮ᗐ樴ㇰΆ☡┭幽灲ᥠΧ0䀰渣挷屖⊿ѕ㶯搪愡ቔ党嚴祰䰋ㅩ琻ᔻ㙚⌺亐ᔻ❲屦Έච愥序箍敎槮且㗑༎㥲䃄ᣆ⳼Ỻ䷕㇇㱀喕ɬ槇䡟᧐Ŭ浽ⵐ悞䶔眸灇䑭丬湑䍐ձ侬抽䭚姱▼熆猰姚䶘旚眳㧤㯌澇嵓ᨾᏠ䘆䍝㬱䶬竍昂姥仢䀆卓䝧佗る晃PⳔ推浑槍䴔縇㭟؝佊ᄆ…ࢃ併䨶Ü槺ം搶┽䅼⽀碷杖㌇䳂瘇熤䗘ʜ愇彔㧿书䲷Úᓶ⻬擃㨦ؚ佲家ⓖ姸Ⲍ檷㣫☚ⷂ熶ᣕ䗨氒紇㑛ᗋ䲴㥠㳗㦨⹀˓Ꭺ暷䅃嘔⺂禶℁嗙⸞♌⛘嗻ࠠ⭤ẚ䱸涓⬴娵仏㎯卂墅瞸纄玗㒕槎俔䚞峕斬֗䭛䪕汬⾻⬾妺А㺆᬴䁕瓌䇺Კ佦涜Ꮴῳŀ⎟皜䓅䃯⦛ᔎ婍埭㶉䭞媞⺏綟䘼⽭䥤∳ᰝ⢩纹ᮏᬡ్䉎掏⬩婭凌⧽寕廓ޘᰜ ᯛ䆛㶂丬巛⟀惴ᝪǐ獂早尣犑㥥᪄㱮ኇ㲛欀㊈糿狦ਧ㴲䢽䘰ᜠ⣽↼洶ᾅဲ嘠́Վ㭰ශ攏岱ল⢠ᷳ➉禫犥怼ញ㭐Ž囁垇፰ϩ幈ઋ䃔⯽剮ྍፇ嫩稍徲篻懝䭁澐岯峴ሼ征ҏ嬒็羌ߔᤣ䀽奀݈ᷰ揕涌淴卾⌾剃ᖫ媠㌎垑䰋宣朌ᄛ㯨㠴㼏ኈ簉ᳩ娏紩ɘ㻝渏䯰䝨㹃䖂䤗䤄㻋㬼礈ᖆ忳㚽淖ၖओႄ枦῭祐㞋㭧䧽䠠儀箛撳䘼攙㒒㩈䊿焉✯女廐䤕簏岭㦽嫘᠌䢔Ƣ济h⬭垫䴒ᝨⵚ熂Ԇ枥ᴳ䉮儉栈㺳侸⋾➘㡃侽洙笡㣃巹挓㠩㼝硿挑樬ƠǑ⑹Ε㢋朂ᇩ᠐㸗ࢾㄡ朲㫫樌猂笾㿫瞼窷枚堓夾̄㩈䣆梆㞭㫆䤔夙洭嫛嬈➽㷓洵ి䨦ƒᡠ⤹䕥Ცኇ焪ၴ䘬愃硼廊惌灷㮂㣫䩭笓ߒ㨺Ṿᔞ篃㩋䓼㔊㝘佻棆⟔廴ᔜᝆ喆㭴አ嬚柢㧻氒ㅠ睐ɛ䧽⌬矇恐◿⼘棾䁰尠ἇ⑯㿓䯾ᴍ矧廫嘿崊篣㸛儽納❅㻋ⱟ或翃涩䤮䟨ḇ堽䳓㝉㬻廿ᴰ矧㥳癜⼊眬ၬ⅟漎ӄ祲ཽ儚倝㷇埽܇矪䀛䭞✔坯怷峽甁椼䏚ˈ〈䄁㹡嗟̃㞨绻橼刟㜲糧榃众࿒秛䋟ਉ⼾ŷ䕞笝⼿㮓囟樇⾥㪝䁝नྗ㏗䷞慁ῆ㼏ऒ䭛Ḓ盭窻換䔢ᡧ牽ሙ濯㽫敟ᴆ便㲴㛝㴑侃㹋䇝䧍䬝槟߱徙硠䨳垻┖禫哩緳徘⼏択澨㯓櫞㌄῎㷫喜ଏ矱翷恞ฐ掐嬑ࠔ某倏嬜㠂搜ጬ㐠簚䡟吣渄㼥窗棞刍潲罆⟝爎㩇䥜И怂㭷咼㘂彷ࢯ疞瘁㽮Ǵ疯妞䙂ဌ῍ۇ窥攅㏀䠑ⷬ㶋禀฿䡾则㬈嘭缈穫檗㸜㤔㿧潛崝璛偞ጛЅ翈㹓稟束፝掔ĆҰ吾إ砏㎷⣨ᤊ່ϝ᠓ᜯ絇獀㪞䇚⠲ᯕƕ祏浶ܣ丐ۺ䩩ͅ捬Ꮶ砦ῇ濜䈙碕揠睼䈔翥朡巐疿䑡嬘搌䀼㹎烈ᗟણ币瘥塻䴴༑峤嗣劥り䅻㯈⯼昖翬Ὢ綤佾…娉൝䆪䆪۵ษ控֡噰Ȩ洺簌儬1ү㑣亦棢罕˰ཇ䒡ⴧ䰉炏绘㩧潟⪼縯埲ᨤ䍂♁㟋熈䡴ⅵٙ⮂ᝈ♶傹͆䏠⏬䔡渦㈱ḢԈᝯţ耒䟸儀ʬഠ㍐㚤娹柊ㄍѪ⨞㋼姗嫣䊼ष岞䴧砽傆幾جᕠ䆣㐫ై⤵䉵ᅸⅴغ吠\"兞㢧䱮㡵憬ڔᆰ牝⸭睡Δ༐‡ᆧ簲ܽ愰ӗ浪ῢ⨑ᑡ䂑⇎庬偧倈碓䇽Ҍᯰ团䀔是₿̠സ㍮䣱ℿ碔䆑冂ᰨ涩ʤ杮å䍸烠尒xḹැ庥禭揰箣搪ࡗㄝΜཤ㣡䆓䤾㿞ᘼ䓻榏ᬑ䒩㛫ὲᣣЄ㤡⩦值硶↜т᮰䔢䲭≛烲䉡昴㎱e捬呯ᅅइ澐䚜帵ⷺ䩍⍥壈煥ఉᑻ䆏ࠔḿ᳂弮㏤儑Ȣा᭱Ⴆᴱ咍䑙簒Ꮍዣ娑༺࣑⋚ࢴ⺱୧㘿䢇些Ӓᐐ唘㺮扎孶簬ڠ㛤䤥ᴴϝ䘺ေ㕂堗ⱛჭ䊅಄㑑晥儱౽泉䙐᭣ংⰭь⡄抎ྊ勡⫥匱猦ㅎֺᬐ唝ᚩ江ᤙ⎍㲁㡰᰿ⲉ㇊䟯䝸检享烺墨⊂憜॑璦愰ಜሔ䟜ၐ枂㚩偎棚̓⚼㩑ᇹ㱥岞ᅍპ̘߃ᨒ穔䙣掝⧑㡧㌽ᑧ䇒䓎᱐瞂䖪㼼礍搊抹ᘑ緧硨㱤煖梠ဂත犪礙抏౼㷑ფᨊ屸䄻䒣䠤愂㢭湏㢶ˍ瘜⒱㵥唲搣S䓢ᛐ漣暫㙘ᤄ⍞ಜⶑủ⫪䉻爔㉱ᘘ岨䰥対䓎ʾൔけ䉅ᄽ箰慥՞ᣈ䕘憤ㅛΚጃᆠᇰ揦田䁷䐵炩ᐤ榀⚭剁㣀揸䥤㨩䌤ㄲ䶢偲⑁ጸ宅䉨樾ᢵ祳傠͜兄ቁ䉷䐱բ撄璳ᅥ䥋ᣉ⏠䩂⎩ユଳ扡簦♹ᧄ伃碳㥗⓷≺⑄㣚甛ႏ牸¡║䬳牫ㅏᄂᏍൂ☩䎥䨾⒈⧂䬥ᠴ亵洮ᘯ⢃ዣ卵壐樲㊾䀥爉䓹ᾤ殂紨㥉ⓘ剴䮄⬠㳅†⩪冨♤↴撁խ祂㮊嵡叉暺炳⒍䤤➵ᣄ䤲屫ᅙ磩ℂ猊╲Ễ╍⮲⹘䎶ࡨ㊂ㆃ䗾㓥卶ည㓉刦ᄽઃ䤥䑊ᾈ勄獫㈡㔒硢癚㶰病䌂ḱ⪧恠ໂ♯ॊ㉘嵰⟚㓤ෆ㌵婮↗䘆ᔤ啲ܭ⥐綊峾䢚㴉ᯆ䆱窕椱㫎ୱᬙᎨ此ങ⃪ᔚ㧑噅ڻ媅⧃⟥ᐬ奼䣫䍜ಸ㎱䯈乡校䊀ᒉ熂瀲ଠ⩓垫奁⓬㉦䴰㫉廦Ԧ⚜۴整拲ңػᓍ璿ሆⅢ⋆ᬲ⩦䆀ᾘ翳壩㍍伱熥䫂⾺禅禾檘z䐍是㋲⭙桭㎇㱹窅⊵ᚁ⇬昣፴暀怡歈㵉痟㛖ⰾᲒ埉屟壳䔌噘噪姿梨剅乖〉厇瘾屢⥀珵敂⍲婨恽泝ᐘ⛴㻸䦹璉ᅾዧḌ౭ឫ焍厓घ㙉ᦇ䶻汪㨑旕⡼嘰峯炠桋嵄司噊搸⮰㑚䥷㠠䭬栲䛨捄泮ይ䨮㜹㒒⺐䦭斢⠳⾒嗨ཀ㵨䋙痗岙࢛勇璓✛習ᷬݜ䓙瓇䮧䓾⛇ᑡ㻳暿俪Հ⻬ੋ㸣牥丢⍙ᛥ㎻穮㤯䘇ᗼ䗓癥ὑ碿䷂㢤㧣䄷籺圏斿ፄ矓班㝇㔖犼䡚㘩ઐ羼纚䰰ᛱᤠन৩ṉᲷ匬䧆ⱉΆ㎳穣ᅗ杫᧼欒䪶⃖㺏渐ⵏຐ䣢㠃ⱪㄙ檛ᲈ耒ͫᕈ˅牠⼂ㄉઐ⡺ⅴ䄱敟≢櫓ሮ坉峍㏴戁㒙吶㚸㚀樔ᖀ值碂㼰⊺玁ᖱ⧙䞄ᴠ傚৯⟤ኇᡄ絪絔⋚乼㬥ᘇ䚹Ⴆ䘐ᢸ坑㽉⯥ၿ䋲ᤀ䅾ศળ↗楙䝿ῂ撫乮ホ焫ఌ⡦寥刨穃䐴⁐Ά⠸㖫品Ḩኰ䪇佮⧥ᴵ⾹䅻䗫敨娂疍Ŏӊ掓ೲ⪩㚉ሂ᧭り䕪ܛ⸷ṫ䷩筐˝્ෞ✥⌶ⶼ⥻ᙵ㬄幛㠡憐屒㡖ŵԌᯉ䝥婱榉┠ᖨ兲䞂َⓌ˜㏚⦄᷅ቢ㩽᪘斳ᚔ崬橭❮㨣#焵ݠᣠ䆡㩰あ斫◆ຠ⫪Π泛䁞䮈⾩⦑䪷ٱ熈斅殥插禘筈᳝㋭䪆Ⲱ嶴噼䙳旧ᝣᚩ㰪扬ᓎ⦐嶞⥙㧥寤ቱ㦛䗀ᜧᰬ䤑䃉㳘啁獟吙ʶ永䀫ၨ土ᶄ汫桉㣜ુ䭁⪁㬅䥠ㅻ忙⚸囋ὼ䄀䟬单㕯䫑⬖⺙厴ま㥡ᕩᕼ崪琵瓌䃔䙊⫺䷂㻹戉ㄮ碭ㆢ喠ొ䡊煉㋂Ҹ勊ⱑ㩥䥡䕱ᖜ䔺攪崑᳤晡༤⪤㏴攀፵̣幏器䗘喢嫪搳Ӌു⫋䘕ⱕ㚦㵷䴎啰ٷ売墢籣今僄Ӓ䨦ⶑ∵癵ⅽ満崎咙Ἐ寋實䝄⡦ă॥⊹坴䓉ൣᗴᕒ娪綳䍭杚勋⭓ݾ䩕惷棥䶘㗩砺奜痜嫌䫄檴欹䭭㹵ᒷ✥䉣喫櫶帷⏋䚑瓊㋪䀲͓䗕仡孺ⶅ秲呵ᓬ喋䓊怹䀩䩚⼍╲价㭳棅ႀ䖰及椹宥仁拱㊑⸍⼵㍶敹㦟唯晎帼枳䩅滕ⲣㄾ䧪⚖援签䚘䖩ᙐ妊疋䏈絚㒶ˉ˄卅♬絢㖾堔寂俊泉廇ಧ牟⨅㪴⁖梺͡䂠壶Ḧ孌婋⍒ᓥ牄Ⱅ⢵乵ᾭ;ᙣ䟞匚硼䵎㻞㍜⣍ɂ底ၕ⤧䍵ဤ㑾弦嘋㻏绖⳨榐溠ಭ㛢棋⇝ธ㕑夊㐊⦡債竕௬┃ⶰ摶⤳ॲ㕲城半廲嶭廈㫬战漃㠭㣲擸፳痞琒䱄戓凌❍笅ি⾠p敢㽱㺅疣ឺ咦咺⢌䨧⛵ᰔ澳⯤䭕瓾卸൴䏸Ὲ⼪⩉䛋⛞᪼汔ℵൽ兹㖲摐忔爺NJ怹笇ᭇؓ▭⽔㢩୭㦜፸䰀竭䇎䴏Ⱁ⥓⚭紇⫬䭨Ổᬅ宣Ȃ㲈ˀң᭷⩓㠕䳗˶㎈ⶹ䄾ᎆ䠃應ባṮ憪步㧍ൢ嫱疁䶴㜹姚䗊�癃囎媓⪼Ⅴ仗䍿㩩䪍㠞ᕖ䠒䊌㣄⚠嬝䱣⭍簆笷᭾畁垸䧖櫓弒戺X猠犣㬎ϔ桭瘥ഫ敱堚畻Ύ喿㛣婎涤䈍珖抣勑Ѽ䋿┈ᑠ㎡䷗ᒯ嫞梠ࠍ挋㫾⮏ⶵ㠕媆巻ᇃ〠ະ务減⇍攲懽摀ᷠ瞦劮査焎㭎潉∽ॗᒽ䭬ᶐ畚۵⹛夏㷕༘㫂6䱅㣲⧽箝ᶞ㗡喖彺䔈͝㜊墹樧▽娺秷❸婅ਫ嶢⏴忩仴⻥㖤〓ⶕ卷䓵䚚㖗嚆Վ俴ᢎ⏌什㫥沕嬉怡發甲畞⯎䚕笋ᗉ㛙㯫⸡㜍婔䇢㝡倦矐忚禩看ᯕ⳼㪑ܛㄽ䎖兿籧嵾璣僖䬊ᜈ嗃ᛨ㫶淡⊼羔ᇸཱི巻㓹.柚㈈揑ἒ㨹欑ᩝ粗勱嶇ᶗ晧垖⚛ゴ柚仯媳樷≖᧺使Ḗ嚶倊戍柉⼉᮪䛏㳝ક寰ᚩ㵱Ʒ巎窛ᄳ㟏廚穻仯ⅽǴ䙾㎍⦣睫婉㒚儦毛廒禬Ԅ屽得绺䝲絋疇僾些ଌ໒㺵㨡泿ⵁƕ然緽睙厮䁚堉䯍亢㬻毿⊝嫖寺䞍緓瓿帆䜺∃䏯皹沔梧峽烇㽶㥸綵坟堦倛ᾢ淞䘠ޟ橝␐㯳篻盂Υ凿妰壜椐揮羂倿眗䂾Ȧ怆⟈㷛瞯凪䰛秳ᮠ䌕㬅ᕠ泙繡䌫ᯒتॐ㺡䓃ᠽ忻üސ繾䈯縌℘ᶯ疰㷚䛻఼㗠㦑ݺ瑤䭕搸焫჻φ䒐㦠篝匒篿ཞٿ瀰碡ࠖ䡞ę̯柨㤺瓭㈻䱪≟䪾䥋㚎㔆ý仪ྀ㗡溴㌐梙罥㲨ℭ毴淲❦挆ృ、佥䘾₎᪦Ʒ⽞㖕ܭ〵䞮Ŏൟ氏ᄦ㨽嬝ݤịţ兪䱒⢼ࡸ⏸⍸书怌⢚罷㱴᧠秣甯扟惧䎶瘥嫖侧崌䚠出笍Ⲍ䰝槴ޱ巙哖äᅧ瘸恑憸䟘ᮨ缡⩒Β呠㯸楀ᴿᣧ刎㵌む൰是ᙓㄐ㶖།恑瑦ἑ炕憤䟔ᴐ笍⫖⓽ݪ㚋┞૦⧲㓪䢉ᒋು㑰㮯克Ẇ捎箫橱厦砿沊刅㲮ᤇ⨝̮笸礓捁㩦ԑ毀㜿ਹ栰㕋涫尳䠣懇棶捅ฬ㯑䣦лಏ熺䙶漐甃宖࿀䓬ᎀ䵔梩朤⯱ሳ凕端Ⳅ柕⢮呛ࣥ⏃࿘㶩䓦⤺䲈ু▉ᥴ嚳㕫Bं&䐒㱞劧嬸㊘㇆❑ᦄ渞ᱭ㱝⎝␙甗᱉儓瀲ñ奐ᠥᾠર൬䕜⣧授䷈㞠哇Э㊈⇝ٙ᭨況畭䍥忕厗叨⍢ʔ㖬᷁ᵽ⠚ᵤ枃䍮硖烩卒䷒㪺䗆ↈ㽅槕燈➍䝮䍙ᝈ〱䌼姉䲇ᆧⲂᆫ㰉ᭈ簃䪭ㅗ瓹厳ඎ吹歒䚅ᒢ栈ᱜ㖣ⓔ弪惻午倊㨉捆䚼梚⧡߹汇〳䭭悱ⳤ䏂䪶㣗॥ޭ㈥排栛ᳱ㘃㐴䔦ᓺ㎛ಆ㣹剦㰉暀㚢✎搌攉ᤸ弤ᴃ唖惏傰㧜咿㧗䛡⠏㛲ஓ㺛ᅞ磶ϕ䱪㽹俇ि粅妱ܓ‑䄓⠡ཝ⎭Л于㷙䌴℉㿢懳檿ᕄø濭楞᳷掳佒㰉厇㨻亊ລ柋㌜缎レ㡵ᥟ玤㊀࠭咺㹭׀ᙝἴ糃䯬ᤖ㐌伆㍶䐒塿᩸恃ᱺ⟠恳ᩍ⭚㴇ͣก㸉䄷⚾㚘⇴䠏ᯃ㼾柗爉㞶॥垁㍹渷榻ƚ秹➮Ἧⅳ᪵摠ዲ㸢ⶓ⊱ˣ㮹ᗌ庂璤孜摫偏൞ጟ匵嘦㩥澂橽孕稃ᛨᎬ⺣㤮怹㋩琈ԁㅙ䙆Ɔ㧰ި徼矣悘ⳕ℔曶⾙㕭л縸આ䆋ٔ岂紳䥭᳛勱ଡ䲱㚑架ⅿ㍹栰嚝掠ߊ⢠匥帩產曠㪵恪仵ޠ媂瑫ᵎ๑ዠ᎗丹㾖湷楺ᡮẼ囲忪樕嫍ᢥ䀵疔㌶ᘰ楻㖃嗰坞᥊筫䣏䫗匕帘䲙㞖ཷŋ疒慱◆帧⊰盏ㄢ氕㬱ಣ秶瘠㖣✋ᦂ砃⳯壞㔌⭐ⱹ孵競㭾㷂瘍圶 Ƌ剢穕⮯⽤宁椇⦹Ƒ旋杦庪罫収⛚䍫毢⍽㚵毶喈⧌坽䮯ሻⲺ盞㴓ୟຆㄥ牦ㅿ㦁冰㠶媦淊沏懒䫺⮅䋂漬坷䈅喈丂涌嬼绫⿌⋓笁௧ⵡㄾ䲶厒Ѱ㜢⮆筪ከᛑ今㩐ʿ槕浶糸⨰ⷊ㝞娺簋噍໙˻䯰⸣㺕卷Ꭵஆ㺶ᮥ并恻䖈অ㇂䐕㭥海㫿殞䗛ឤ墒溻榎凛寬沆删˶䛻䶍ⷔ圽墦测ᘬ笛孲ෝ㇑䟷䕿֟ף囍嶒紻禎㇕ཌྷ⬾滕懭呡击嶞淺埔䒼ت榕㷘㮌䆫㊍畖曽厈ᶴ㙼對ⱛ宏ᗸ仺⮹滇㛎碇ࠠⶒ巡㟕媨ớ栢慚✚䲕湚㕽摔⎾ᷭ塎窓ᯬ㣐㋼⭳ⵇ㧽樜㱶㮃ᷩ登宖灅崸华仴沔ᏽ泚ዼހ痢瞧奚挻䕮ᗘ廪䛵湁㷆浶毸⾑乯㜁ᾝ㛋䫮ᓭ᮲汻㰽冖抉定◛㘶峌暛氏朁孃䔫㌍瀯拸ދ樄㚧壊眓乏⫗⍰ࠝ䟁卽䏗䁜㞟䎊ၡ奾挧炏䂜编筰Ὑ㟝卖忻ខ㖼徺盋਼䇾ᰦ淅㢘䉖婺䮍縂ཟ墺扛爎ᢟ⇵ݜᵿ㢘耖㮼槏㨒ู悞掛曥㟙Ǵ獤᳠牝䁖屚·䏁ྑ廁籧Ữ囑㫽台漿皯媻ฯϜ癿尾湧㇍˹戁箁㐸皊楺檎揦眨ᤡ灅ಟ漞㭛潠熃嵦噙㎞綷縌㮑桇䜎痜嬋䝱Τ粍搖窼礔搏㰚粋投ᒔ㻴❃䑤笽瑮⭾冖嘗犪ᒩ惇ᐐ㲖૬䞂⼝㣭䜯⥞夆✜亵щ癛抽ന漄懋瓉㚪潖㌪䱇ḉဖ屁橋⪼䯚⇫㵽ά沖浚往嫨了㵉炋Ⱦ撘ᨌ寣‘縝歶䷾坖㦊構版域⋜枛Ȿ㢳狮棿綀綠倖㺃㘓⺼㝈ȏⰅ玏珯卍甂О亶㳉文䮿䏛⨙㭓ⷜ簳俻䃜㞁⋗ᩤ㥋↋ࡿᢐỹ束ᱼ犳坚Ù䌋呷ᩡ㶥簷㋮濞㻺⭺䁨籆寧⛿䔑㎪丹帙礷㴗⺘ॡួ丟㝫䀮婟㮓੨佧ɺ␇簿䪖⫥ᝨ幸獳䵎燽㌖Ḗ⻏妠ච⢠ᑒ弘垲弤㧫䦮擙猍䗪〙㥥灷㉗绦埦๗㹰剣ᅛ欉ਙ⽩㼅撋广ⷚ姠堋᱘筰甖睘嶖毋盅㷥澭៍斛ਛ匪庺罭狎糛礊毒㬨搷ⲯᦓ囨焽ⵤɴᰱᵸ憑嘐溰㲭穗డ憕燠枨屺砓榗⍜℈ო㟰ʭ睰䆘省㜯㬄羕摖⒣آᠲ㜃㼊櫗Ⓦ㗹❿ᾲ簋暎哞㟀绠⻂ج䧗畋涖䬟㟕嶪硣㶏孛Ⓦ䌯⿋ᥕ淗╼旗痾ጡ崆焃䴬䏚伊縗≔桡⏭嬎㷩伲矽殏❟✜毰盓㤹柗ގྐ櫣㝎濾疝䱵甄㲒溯༤畗Ҽ⾑淵睽怏匞歖ڢ缞劭滃㴣縗嵽匬勴ួᱽ㬧倏ᬟ簂矏㭹灗ܽᄛ༇እ㙶皵扺⻟漐䞰㲇㢂憇潾ⷞ缜巵᷊綋恪竫羁泧了峄ύᘍᢣ䜸ຜ纛矯∐ࠉ䚊帊綯➌ℕ揥㟝徱㋝礶ⷜ刞㯴ἷ㴍畷橼ᤗ清ୀ嶁㣽䜇ㄮማ෧枰竃涧礿矟稀垚㽴ᄧ喾ഫ攍ᗪ߈䉛㡧巾䒛⬃佦ŝ僇䧮䣸ޯ睍㿃欯䂴㴜珨េ㱽壽䞿ᅞ䘘珤㝪平摛⅝唝渐ဎ㻀㸷䙿惛潥㸕㈹刃棋ᔓ痪传㳅琧总㕻易慺㼉樠㋿ஐ懾Ⱅ㹕犻屾ⱝ㾗㷓Ṩ㳣疗ᛟ䚝℻⼲㳀籍歿䧞䨁㗑㝘禿㲯ች供琛㟅㽅耋偿継緕ⷩổ嶃纝ᱽ寛ۺ⮿䈲缕澖絟爉㟄帢磣斗寿犛绤ཧ㺈羇宮剃ؙ埁缓繏懌䬙㰍ྡ㿉簷䟾庛羖㝐彺㯾㸏㬟矫㵽籇杆࡚㖒༒対⩏扯弖┑俥㽱绣䁟⦜嘁柌㻱緞墳⣟䅚Ԗὴ罖睗樏ટḁ㯟廍潋摯撜䌛⠀矃㱙痯夏ംԝ瞹㬛珏㌿亚吊澠翍籏惞攝䰞睍潒㩭棗盜埓䨐濘絓碷䴿ⴚ䰈俾捰㩡禋䶟㊜埡㜳㶎狌⋝ᅟⳜᠻ㺁筭濯碟缝㯺濗㳛㶏応◚簈卦癯䅁繰䏥㮝ਧ篱棟ㄞ㰅俺䞷㾗浏ㄜ㔡ဆ禇滚璿䪟⓭揹嗀利ۯ绋栎徑翪㟷侎泯栓ᖮ㎽ϊ竟Ბ琑䧲ߙ绷篍憞ঝ縄忼⛫秛昝䬝ᰗ䷭㿘秗烿涞浾嘓⧦翧篾䩟➜⼕濼南㞷矿唟ᒢ䐢㾴卷空竏刞爋㾛総緧兏绺ᘛ縩算穿ଝ㠕䨆羃紿絇羟炰㤴⡥嘯稩㍨堟怘砏睑籏祅䧝վ嚅ธ怖娣翾翎Ṑƃ⇿笏珇⾀嚃㹪ຽ羫簓ⓩ䇸缴ḷ粚秱盟拟囟ᨡ䐢䐛怯☦ࡨ̓㽆ຳ綋穰栟废☞䒜涻灀倻懫䣕Ü㢐ʸ䁯燌䮠䴞窜枙氀恍侲ἰ牻籗秐慨ޟ㤡㈝㭘䀓䴋⁋�ἼƤ綠ނ抿惀ⳡ㲡拴Ⱛ簒玏㣸䞡䄎汏౯窽球摀㬠澮礜砤ᾱᠼ⛸䂁䂶互Α犒ņ╠ⷠ䩤༣䨤䴖瘃ぇ徢㾛ƭ緼ޓ獯朩р瞡ᜢҪᰓ㔊㟧䂌ℑ廊紆堨ᇿ啠䁡☝㸛ȭ堇ࡒ澮䄜纣㰺穻玠ᴠ⸟ܾ挣‥䀗<㿤矆答䅟㱒݄田ᓠ㭼ᕡᱡ怛ි䠹翣偭繌ʹ㪘નࡃ夏ῖଢ栙Ⱚ㐴᧪羡彭Ȍ̦٠ุᇃ䦷ᾲ䒢䔤䀒䴉䁏息䞆䈚籔مᗨί墠哮㠣⊡尒శ㡌Ϗ䃜㻆㵒Ҽ㛨ሠ㛟◡朜ԥ∦㰸ῴ傕₸Ǽ͊۷獈ở徠䅾⠌廘港砻塖悌患䅰˞ן環ᬙ娟ుb៰戫簳т傞潊㋈䎚֭ᙐ㻀䓡璣㜧䄬зけ炔ᄌ∙嶨ִည橰≷篈嚡匡纍䫺湈Ú∎ࣀ͖ΌӨ㷟⍡≣匦ᠪ熎၏炛Ⴆ⇼䋯䋜潨㎰捁㐀瀤㘗搰䡕忙彳㻷ϯ祬ॵ某㶿チ戜⪧爬ⰰ呙ၶ㽀䪮岦غ眎満㼰䡁畣粦㔨䈿塇⡩傪䉴䌽㯪ࢭ欻夠嫌缝㘭ȳ塀⡫⇬εن焻渰㯰篁换瀲痂⨻䞺ᢔ着↑ᰶ稲ତး⭰墡惢熤㔣㽭桞ᢑ儑⸿簫ܚ᪸⻰䥁䡣ລବⰰⱎmހ纶ೱⰗ珌ᯨ㖧⦁◽斤ᴬ昼ᡃ㋆ݨ绽λנ䈟䢐熁䦣㚧嬪搴ࡌ䡴‱憫ʧך๗溨⊗൘䜜㥘嬪瘏瑌墄烲↓Εَବᴎ䉀䢁㳼ᅙ怫篬⺾'羓憀ŏڮ६᧘⊐緡⧣㮥ᯐ嘡㱕῁焞绷䍏ڜࣄᡸ☰笁熜᧙䬗☺桄悶ჷ繴䈠䑎௭拏峗ࠞ勽窦刨ሷ摍墄徛⇺䋛فᬐ㬨簱丢╚挨䀼䉚桸烔ᅀ≐䒆ஈᄟ䱀栁⸝禤慂ᄿҰѢᝡḨ紣ߠ瓌ጩ冰劣㝺ଯ焷㱕ѣ焔ᄽ䍐䝱ઠᡄ㫐缱ɂᒡᜬ稳ᶷ䂘伶ᆐ綃算盼ᅸ⯐咾戣婧⺄⡠ᓮ眲㍟牉䰺ۖलᅤⱨ唱⠁٤ᇀᡢ⢸ന⢙稿䁝ߡ砜℄⼰Ꮁذ䉥䲪┆䱒䑸ࣩ䔊摜䚞ڒẃࡈ尠佃力岨䔴摗⏍ᕁ䔁⎅㪐፴ᙤ㳨䫾罂䆥滦䔴䩁箮㙤凑∸剅ൿ௯Ⴍفᦨ䕦⤡ᔲ剟羨䃰ᆹ⏋ふ䇨ᜇඖ泃䕧᪬ᔸ牛恶偘凑哘扅༊ḱ壨䨎䄣瞦粪渴籇㢄㒌冣⋢䖕ਅϴ㏈屴內⪯倶偆ょヌ刁⌆䚵⟒ᢴ⬨⽱㷽奦ຫⴼ⿶呦⣮ᄴ灮䕸哨悔㿥㻱䝃෩ိ㤶喤璝塾助䍝㧮煌ᚴ㶨嵱⯃孥Ẩ紻婂ᒓ棅儱⊷䉙Q䢴⨸篮ቂ㽦劯സ籊◒缽櫐揀Ϝ痁䶴⸸䑑瓌䪒ᔡౢ婑ᒇ㱈搨掳ܩᩄ⍨囱ۃ䦫ṭ䙄䱡ࠦ䗘䟖ഷೱຂဠጇጸ柩弫ᅔ揤䗳ऒ᭗ὰὑ傂䉙▯慨穃撑䁭㓫ᒁ䙙੶ᤵ㈎吝⑥䚮ା䩒摠⣌ù⏵䓋ඤ䲌㥸罄㚃⇧ឪ㸵Ⱨ䢻㈇㣮䜨ࣺᡈ〸磑ࣃ涫ᬸ䩋汢㮗冐~䛙煋‼㐈旁⤽♤㜪匲ᙒ㒆䣀ㄾ⍋䭀眨ᨼ⼸烂箂ᅥ厮礵๏ⲟ棫冃汝䔝哋䬙孈媑⮂Ṧឃ〯撠⧖⢪煵扲䜋ยῌ㑸喱䃃殨縿ས岑䁪爞挲䘛䎧䫞ᦛ㝑㼂ᄒޯ⾎๗䞪ࢿᅙ捽秛⏨羑俠揤斪⼲幇┣縯䔐墚⟎ᥬ⚘廞㴂杺檴漼璨廉磟㹂番堪㉏於⠨嬱娂ᱧ枩Ἵ勼粖䬭燘ӷ䏻Σ氼ⴵḶ。撙㺭企♚㲃㣼焦搊䕹┞Ḝ⊽М3碙砣巤殩ɽ磶ሞ㴿䐣ພᒔԤ棄ؠ䡄ᕣ悸⚠⧁ԁ昳挪礋ᘢ⌤刑֍禠剄ཊ糤䊃呱⁈ኋ࣐䡰䴌㫠煁會ۦ㌧コ༴⥟ԆਔᎰバ䩁ៜ㐤䐑䐂၇嶬䨦ᅁ䉭㮙ল炇ၥර䠽ᴠご⢠护坁瀲先⏚䓭৺ㄠ䣃搇䇘咩匜㱆䡧免≠灣॒䏸榏旑ᕂä囀ⴳ็䝁控党᮰╸Ử䊁妫䈑ᑻ俤噘⍃壈䲪伽乊䊔䓋ኌ▐ªᰂ⼯ȶ俣䅄⬥ҳ㱙⊂ⓚ嘮䀺穗ᚌຸ᭵ᥱ᪨穆ࣃ㈧䞱塅ᎊႦ吥䖸䳁ᆂ㵨沑媃́䩭䥞汁Ⓔ䨐☄䳉ᗲフ㞩Ჳઠ礡矍Ⱘ犰⥝ृቂ䒒ђ˙ɤ瑩䚳ఛᩫ楘㊗္䨃ᐆ⠂抹ᇒⲄ峩Ҫ穯㑅৭⡉嵊燚ኒ➴䨻泸ཽᶑ㪳徚⑯₻ॅ㉫㢤䦐→Ⓖ䷙Ẓ⏘慘掲㝅乨ᨩ㙈͑撦庤̼ઊ㔥በ㴠墑㪢ᇥ≯弼祒抋擾烁➢䣠ኴ崴䈡㈢䝄牭碴㸽䡚ぁ煅ጛ珄䴀Ի嫦ㅉ爂烆➨傴祅澫擴ㄯϑ㎲䳅ᑪ⍸⨖㒳磄䉬㔸㤨ᒼ䥼Í䤣喹ᅒ㈴僉丠⋇癯ર契ઃᔄ⧬县ִᏱ㭒涳炦啪䪾啌⩷䓡⤿仉ᒔ⾓㪔Ṳ᥇൪ᤇᕍɢ哆䥪勆䒧ᎅᖊ㺖୲ᓄ嵯栻奔㉦壩䨋ኝ⚻᫄†敶㠼塅兯窹ِ᩻咯䧳ዂ㣋ਹᢊ⑄焨毘檠绳窴䵃ቪ㒡悉判䬷殊狩ݲ燤巣㊽䵖犚㔇吇械䇭ጠᵔ抉ࣂఢ▓ሯⱗ禿撼䥍卩ǵ⟭ᴿ嶈巡ዲⵇ幮㚺济唬㓱楝刳宺䤙᭗ֈۉ勃䮥ᗡ㢹尾㩾唃Ꭱكདᒪ㻴倡喲⏅ғ⺵奅咘サ樘䃭N仩ሒ䲚桀㍨䔻㵑㖣瓴ৡ剎䓨伭ፚ⨔仉㯳⿅ㅬ䪽ᕉ䐣瓆榿ቚ☧ಝᘦ⼾й㟲㕦嶪㼼㹓ᡗ瓈ᦩ抚╼侉ᴦ㎶ṉླ坄㩪咴ㇲ牮ೲ㵝⚐䣴ኬ㾔審罅烨ಶ䍈䙣倲ᦽቭ❾䵱ᬂ㻤箩彲杯ㆱ兓䚀㓞榓緮䟡䳡ᢦ≔伹ᲇ捫圱ᵟ≴䳿⧀㏪煩ᱲ⦔偩瑒組哫ᆾᱚ䱪ᔋ৴㉔摴䫳ᵺ↬冹缲䷉粲䊱ⵗ᪄᧕即䯭ኂ㺏⃑ᷲ盇୬冺䕙ٽ䴋㐈摥ਓ㋔䂘偒燇ëⰌせ橦㣪℟匤旰ำᡚ㏬纹煒ᅥ䋩䖾毠ڌ㓝䨁㊿磱倉ኊ⻗ʱ⟩庇࣭冰⭛⚙ࣆ熚㐂䵓ᓦ㼬田婃爈䫬ㆶ⭝ᡔ⃫ᥙጌ☑䫝ᷦⶬ撹ồ毄⫫紽⅓穸䴄᧽㍔┭䥓ῶ⩎ᒹ⇓₆籭禾䫲ٲ泀妉勯ᇥ䥰Ꮖ♘儉ϳ㖅ቮ⚾孁媃ᣍ⥕厶曦⁕ᢖ⍄瓹䉓垄⥮䶴ൎڂ曩㎰朘䲛ᭆ␌䨉噒傄⻭妱䍟皌ಡ槼Ꮚ斞䫓Ზ▌䳹㿓ᄆ⻮憿㭔牽攖楌䐔揝䤩Ḓ⠴曑懃嫧㝨㒻嵃暋沺奉㌺穃䨙 Ⓖ䙙籡叅⋭Ꮉ䝒ټ㓪㨗Ꮌ摓矉ც⣔怡䊓愆⍭厵❜乣᳠⧜猶撤䧫㡼穹ᒣ䴆䚫掾獃乵⭎㦹剉⒫产ᰂ⑼僙ⳳᄄ岭缲䁜婦崁姱拊昍䫃ᱮⶌ䎹⢽攄䷯嚶㝑⚉ⴖ⨜叺㫝ា⾴畉㶒ߦᕪ▴❅噩攇㦼叩朁䷗ጎ㫼彩旓ᬄ䐖殸㍁垨㳷㥑ᏽ暓伻ᄮ㓼䈁曒ਆⷭ斵浚⚞ၖ榰㉻⒋ઽᴾ⦄泙ン爇叭枵佚㴅䪙獢昌䣥ᐼⱜ埁᪓㘇珯掸⽔㷑㳌姃ኻ杣䮭ᓾ㐬擹眲帅滫䦳歋平沰㦞⋦曰䡛ᱞ㍤椙奓縇Ⅺ်ኧ䓎⅚ፂ本䥿ᒂ㧜䳙僲清⟮Ꮎ䥢⡊紒狗暘䱙᧶≬峹ồഇᇬұ䂼穻䒾㥬獗╆ඓᵎ㶼弙䔼Ø⛭熹兎纙Ქ禠摲仿៶Ⓖ砥㈒আ䇬᮵獍䩴ˏ奁Ꮧ暡䮟枾∢娥㌓倴嶩㶷幤⣬勮撜䱀嵮≜䨙✲䐅泪䁵孛ゞ崐ᐅ搥䣣ᢡ㢢猥㺲⠵⻪Ӈ奜Ű糘楔晧ྵᘞ㘧㼙㒽߇硈德杇䅴䋀祿ዚ䋋矗ᗎ⇜憹r籢怆γÂ㺃ֿ̜ዴᙝ㠗䴮㿼淩̪ˇ懩便捍ᡚˁ秠ୋ斀ⷀ堈㺢棹ᴪࠅ翨ධÎ慱ʺ皎એ撘⫐喾㐬琉䈒ᰄ潭纸彂ખˎ৺ૡ月⨨厪㌴油㢫ȳ䡼卟扠᳭ᨉᔀⶠ刎⦢吹ᒲ缄レᑸ࣌ᆀʨׯ只ᙤ⽃ᯆ⸢对浳勅⩌⑶⣀⺐ᔓמዘ支䤈偆ぢ䉉䋲⇆䑉羳ይⓎᦹ㈱摉䬀勺⃰ቊ寢䐇♋䀫ᣋ⒱兢చᒞ䦐幁㪜䋥▫攄癌羦⺞ⴖ姂獍❑䥘嶱⩂䓱㪫ἇᵯᱸ歜湨⓯⤽㐘⍁䢇ᨁ㼜庮劳崆䯭皻棞䪂撶秿狎㧻㎘埒㠂濩殐㔄⅍綶翩僅ႃĀဢ▜⭅Ꮂ⸲檀Ѫ䢴矩ࡰ凤ॹ㮄ᨈ䭐㨹ˤ崮ゲ眀䑫䰊绯箸⣂ƕዌ䗵ખ搻䯨寁⺲塩⊫ⶆ㉯傅睁垩䋥Թ✒⣰僩㋌䌥⸵Ⅼボㅴ೩▆某⥙ᯡ⑂䋅⇜ȵ忮紲Ő糡䖘䩻榛䵴啁⣢䷙丫昵怑䉱䃃ẚ́╃㊹❒⼴嚩㋲嘥奒暴㹍綷ᵒ窙⊻ղሇ╴⢐尔⧢淅㤓皷空棒ঊᴓ槁䪱敲⧗᳖♜ᔥ士ᄅᳯ⩼Ń繻Ს䗘䩌窢⯫㶲䧩峫┶ᩍ㩱⣌冑㌋┡䮃昀⸬吚⣒羥⼪柆ï⪳Ӛ湱ኪ┭厢ᚲ侨⛲㗒剅炫ᣅ絊ଳཏ㩰㋍䗤琁ᜲ⟹⥘睉≒㶶❍瞵情傕籪ఋ晛䧍ᘸᦒ檬羫㤇午汶ᓔ㥨拥㥻䫙❇䣼劙㠌则ࣂᶵ哬㾹彊挴猌┹䯬箆烏敒▜崙㘫ᅈὈノ暇包╒䫣ᕞ厑㽂者恊䚵穩u惟湰Ფ攼䪡架⮗᱙⫒戅ᳫㄅ獊ฏ筏店勫楗䪪暖䤬徥㹂汉㱣烄Ŏࡼ糗垫ᒵ⥽㌐圿䴜币㉒䤵撪墇敋桰毫⡉ሤᕇᏘ坌ⲅ⫑⿂簉ᅒ㑇働⡵拉䥌䴟㨜⫽侑ᓎ⯲箥Ջ挄䃍ॹ▕紇祪珅ᑏ䵷ᬥ⌬沵婫ٵ᥀獇५犻溝糁┹⺴垆㙪猙߫掵孏厲彙敩ጄᕣ䨩旁⸟Ἑ⧪䙅৫⥅位䚶狀ᕫ䫙⮕朹Ɫ唵㏪䆙恪妷煈慸佋ք㳽㧵獦⟙Ⳅ儡⹔噵炳ɴ燬橵⋔ս勭ᗉ㌖★⺰妵ⱊ噅咫㶆磈㘈筌文紊ᗘͫ◌䵓ᣵ⠌吵લஅ㡌呺㙈㹠櫷秔叨✎⫴内⚪狉❳ඵdz౼棖妁抢աᗄၺ⪰䏡൪渥⌓喵帩嫔䥾櫏⨗䮯晉Ⱒ喙☔䙹曊箷哌汻狘疔ⴛ椹㎄枽⿲庁㪄絙ඳ᭶牉㫃庘㊺㡱㊃ᘔ䨗ῇ叒摌⡲㝉♺ㅑ牤櫶嘊Ж斮⣣㔒儵ի䔥⥭箷⫅ኁⲧ㧥㋁┃⬚崱Ⱚ䭅披繅⍰⣜䶅狝䧂岒図⸵朵⠲仅䓊窴槫卽ᓎ᪈坴Է⭣摖༯ቡ㞺兕殫╶绎務楰媾㔠⫡嗢⏱ᚉ㈪单浫ᦶ彎奰瓉具犥㗱䬫៊䳊剹㩴廕▋፵嫎ຽὙ突媥嗚檊噲ⴠ坵互牅磃⢵์᭵㫎൩⪿嗣ૹ⑻⬜専㋊渵嗳ៅ痊⥱㵘繫媽敥⯶ᓽ⡜噍⤔悕殊䅶⧏㩺ໞᵰ᪳䧦㎘唭癓ᒍ㸺曱䒋窵剋һ㕫禋ኻ愶㍾ᘅ佔冽➲妅型䕵⏉፳嫘慹㌉ᕖ玻ᐹ⤄媦㩊䧩伋姷巉祹盂▆啣歠擖俘䶾ㆼ⧤⥩㷷母୰ể牸竉疛େ堌ₘ䕑☜查䞊嶴䯬⭻⻒ᵶ櫑Ց檓晋ⶳᲝ㭺箕લ䇶Ë妶൫䳶㦎殇咛⻬幡㯺猵堊⧶䃪⬡Û絬窣畣咜丞孆⥸ཕᦪ⃫ܶ䀎ǍP媪᧯檲呚⺡官㩲吭䖪ၔ⋋㖽楋嶝ⲡ䧕Ꮳ嗆Ⲟ思㝲尅䈋ễ㽷⭓撫痵欋ᚏⰊᷩㇲ忥㰊ⴆ懋坴⇕䵩ۮ啬ᰞ坎佀国〒䘹享埵҉瑲懊⺕檮්氌Ѫ⺭ᱽ㑦孥๊ⷅ⿍䭼䍙⍪㫫䕕旯Ⱑ婚⸚䎅؊盷䥍啱㻈㟍沱഼䪺堀梞廣㰊羕崻ᱶ竫女㝏喛⋇䘗ଫ⡠⩕ሃ⼦碭㖪≵⒊女ᇆ婹ۧ䖇杰殑嚑☬坥眺ゅ翋壽嫌啩Ჾ畨ூ㟑⽎塝ズ瘭̊㞥䰭൵嵂ᵠ⛤䶧氇哊ⷩ匠ʺ呅ⲻ哴り୳䧞卢✂㕚ᨰ㙰沉勽⎲毵๊皆仍⣵Շ╾笂䷭ᰀ㗓⽀免㹦彩⺻ᥗ㢎㱿擊䎞✒ᖔ另囸渹徃㗆穕措༴竏䳺仆犀檫ൿዤ㐴澟ᎃ㾚䥭;歖䵱᧐玂䜉䴳ᒈⶩ婑㈆哅䆻侇于ჶ囈熌勴㗵㛜殴従┬䞭㦻᭕کⱸ⫀䍪暱㕃㒌浃ᷓ㰶岵敊䙖ㅎ敼໙纍笃䴺䯁㖼浹咳♚䌙紺㎶曪拹绋䅵狷ᔹᕔ㙒ⴴ僽㥆啍㐒᥊淊秂䪍䬗七玁㗌洹咑㛪婭㡃緉ݿ⇏㮯䋿畼嫔ᔒ汅噳㙚桪嵊ᛌ㣰⋏අᬟ㧃狅㔄⡅婳⇦䛍剋䏶罈煷㽞喀ળᬜ㜩⤙友⌆彍䢂憵䦾㗇皍嫵ⷪ௷ᔼ嶃ⶦ繍㫖⺍碴拀换᳃ⷠ嫿箯⣔儻⧆忍孻烖益䛹ᛜ㵨圙槝ᮏវ⹂劕㕪浍ᅫ丷⏋䫴仁疟甙祪嫅噲滫Ṏ⡷㽈࿋⍄独囱旫拘ො嬃㗅䲚偻䎺珵狺淕殍䉱佒Ϳ㜌浖䭋ᛪ梑匉♬曕㻻⏷檏䱸槁孶䛆▐寞㚮伹兣㦖檵䝋䠄旋⛴盕ᙪ糿◾娫┬榭嘓㡆䡵ߪ垎繹巘ս⛭敱㡩➎滾図⼖䬅堻㔴媋嫸燅箕佫渞珟㗹瘥兾⌄怵⁚ɶ፲ॹ⋗歳㚱涷᭠睏Ⲹ庁⓶寍㗫磴牪⇰㗐㭥㋴ᕐ㭟㟁殂幮⼮䱉忓㟆⃩ᇹ䏅֗䪼ᶑ嫨睪⥃宍㵚怵撳暅徎棸巔筢疢孙ᖷ⩦奓⌒垕翔夈淉㭴ುᵨ媤盻Ⳏ壧㴼䶕ϻ緇▎䇿痓算⋚ඁᩉ椂底㳦彭篊乕枋勻䷁䭬㪽᷽⭙哏䶑巳⛼䪭䟻惶ߎ拸姌㕱✋ⷧ存㖩瀗ቫ㡊祭㑻ŷऋѴ哏➈⌉⦊䪑㛆ⵙ咛㥮沍ㅛ俆塌廻ⅷ̞禰㎲瞱欒嫾㩎笽ପ䀷操網浝㖉咲媊ᬮ圩濅创⹖繽嗋劶⬈浿⏚䵷䚰䧹ᯃ㕥楝嫬䶴卽⹛Ӷ䃮ㆱ䗐կ⼜嘀㫁㑥涓勷㷮噽绛攄✌ᡧ修$樬ᦋ䯫፬ݗⱃ˽㓛煴姎䣻汲㠬溵崦ö皪⇻峒侎䋽㕨ᄪ∂㮭㝭ㄣℇ㬀ɽ格�ヮ亍䃫⊕䣖炡㯊睻⩻巄吾矀՛僕Ў緽毙⨢殲Ϸ篔ྚ漆㕊檢㞍漧刯㰎籝ǡℕ伍緳拦睲ẩ㦶孀癥澝囧⸾巽㿛ख熉㺣䡡㝯ṁ急᭪ࣇ圼䂎堊屻䎗㦍寎ⳝ橩⺔笟厳椇嵸ả൝₵揚࣊⭎柊墓滁淸㩴甖砇啸㚦㓝䀹ഫ㨊㨣悹ኊ㶪稤ニ桹嗌㲀九ᇚ礕弊ᦎ埙⾂偵㵂梭畒ॄ㝝緡䅡秈皼៓䢁㝛㷅㮬瞵榟㛾叵卌㜔罁✍㟝侊碕ᚊ笣畉㖗嬗⪮䟝ᮚ戗☵߾勠έ弁婤㶅堓橯堢㬾狭⡛笖␈㽊俜㛇うṞ篹症桡`㺼㣉爵崗䰏䲶់ޅ㵱篹睷浝ᢘⳞ缬䰓籃税⟷㏑7㼔綁㪁嘾毷嫧孝➛ؔ毓矺侅Ք盤㸙盯槅ᔇテ幍岚␔琌᯾柑㽷ọ綱䇖硋澇僔婺⭢溚䠕桀⧴⭻件㷹९疔揕楟⼞爝Ԛכᣯ⾲俛佻纭椣簏唚歿則⎞夝堚商㕬㿾柋羕犛楫㫥㘎㛌૨ڎ碝懺ท͒䁐䂏൜Ƥ楅ऀ്殬ີ妝䡽滕恗俷õѡ⁝⤰౫泫凖唡瓰◍搬࠼岇ₕ堾ƪЎᦌ₰῀㟻䣯Æ⸧Ⱞ洒偟⿆䄕ⲞϘܤ࿀᧠㳈ޡ䘚ⰦⰮ瀾矴☸䈉͉㑏知䫟勯㘾梣礧⨭狵㺂傉㖫Ϛڶ寬╄৶䇺影䌦⯴ⰼ瘯⟂粤䛢盰ᣠ㫠糡䭺Ԋㆀ氼硙れ㳇ჯ碳攢ೀ嚋嶿㤡澂࣠ℯ㰿榥ࢁ畝·櫓ಾ堹爦䃑䡡䙽四瞊刻䲌筻ᄍܲ䐮ƙ癉⇌⡰懡ᵞ甧宄弊⁒ႅ┳B䏭嶈㊴᭲久ແ䜰氍㵱ⰻ漊⢀寝Ҷ怮݂ᰘ渿倠扁畸溧洭稻㕦ᢗ儁㐥⢃ߟ❀掸㋂㵁䉵ᰚℂᘼⒹᢕ僡㞙䍞瀴⋣ᓺ某扰塣瘚⌭棴᱓࢝巙憤磿択槷倆囋Ḥ淣斧ᮗ㐼䚨碌ᡔ猘笏ْ㒪Ўᤸ௨煑䝃䉨剂揳翕䍰缆㸁ڊಣ䛪ᰨ毨己缭⊬┵吨䲐磧ᇈ䞾ೣ武ፑ䔱槹囂碭熬〪㸢䩥⺔煭永²᪨٨樾狕䭊㢯剔┼⒘何ᇈ屒掹າᮄ㙼⥄孃欃॥ྦྷ猱⢎䅥ຬ䏎ܹ๙࠴㍌㉱睃粂߫䤺ࠊ㟖彨况䏏ځནழ㐌㺸涪ឫ㼮Ჭڀ㚼䤞凌␔䞈嗊㌠ñ曃ག䚬改书䒖ⶖ⣛⏦䛆噚仚ቬ⮠㹃攃溮㠣䎲椻ᒊ�⌡䞉༻⡦咎㿱曾ɧ̹䩓攤౿ᇧᇑ䙀Ʊ喈㍞耝㋛礗䔸礸䲓焎㕤兙䜑䜢Ạǒ⃗⪹┦ᱱ縿ឬಧ䡉㈇⍆欱团᯿嵸挠㭶嘂䶬䬽㙓ᒃ䤙ሎ握䚓嗯ଳᶴ㟑䉃གྷ嶭㬺犪᪳䃀ᇱ挳䞼偢桊叏ⵑ僣೧␗⚪㉛䂵冨冐ɮᦀ⬨潟ዲ槧⦆༻噚ಕ爅烋捯೪ᱰ㛋⒦ᅱ缛䰔事翼岍澆㇕掮≇疚ᬜポٱ缀䢙䃰䡣ਣࢪ䡂椘挾∠倂Ǵϡᑰ⠳灇䜯ؾ䉖璂⣷炈Ꮰ✀䱍෪ᅸ甩怳ᡆズቑ岐⠴ₔ磠㨽࿎᷼㝘璩什ᇋ侮ᨍ㹙҄焒ਘ燻䞨伃捂㯣㱅┳噡呮㢽✰ᐦè㣤儧禰㕊Ὣ勈憱栃གྷ≭㢿ᔸ牖⓾ᣜ刼∈ྲṲ㤵ᅪ∳ᗧ/Ⓔ⒴ィⓣ∂爜䠔仉ᦴ㔆凰❣㷬❧揄橦㲗ᵸㆣ兖♎咒ㆄ漸搠塹⮷渹仮ಓ擽䦡挧玜䱝↶ሄ硉䳃⋧䶯渉⎳䊑㲛ㆺ搞☰春㱸繉圃₴煯縌勲彗䳍䖃ô宯攅 濑徕ᵆ㍵侈ᕒ惨哿ᴌ卵⠎䬝丑ᨴ或禃㸺䜵᪺⿲䲂䕲燆፨❒⮊㵸ᡉ狙Ⴓ浮⽉⾹ᒇᖘ槾⍺⟿໎Ὂ㯛−䓳୭㤽ᣰ毣䤋ᇎㅡ㪜璍ᧄ㍔扞槣秇๖皾䵑槄物標ㆢᩙᚂᢉ厔羉畣㻆䝬擌穚◑掆ᇻ㕹栮㫩棩ᨔ簞紳烛౭ᔊ䉘窟Ļᓿ区㮏傹ℏ岎㷦䑭缡ዙ檾ᕞ旜ஜ᧢吕♪䵟⮺㨬摆侭҇⪾൞ৗ;᧼厃⚼咚Ὺ〶⊹䙓䂺剭ᵴ璙䮈㪪㎕㫏ౕ棩廖僃䜫䪬帻卝䚈熇ᦨ㍢朊㗃ᩦん⢏ᣓӇ⊆ᯉ宵ᚇ善姤㏛ᨺ祉䪰攴戜窍Ὓ⫭ɟ窐㾂仭Ϡ曥ပ㻲焕涆师梋碶暁啭妢曤哧⯓ᑌ椶䣓㗆䷻墿牴ᯧ㤏৭搗⟈ಣỷ㟹弃戋⇭朸㕒॑䴒᧦㌡枤ധ፺⹙圽❧㛶㵩ፐ⚙೦㨙㐑来໌ᠶギ❙勓䊆Ễ㲌束⪃㭠ⳘႰ禾㯋ᥤ唛↉梕ᬇ䔒ڼ㭑勔杻䪶玕暊䵙⼎㛼滊棳ś攙粹卒炀崐㨒գ枼㘔䴺㝳⢙喕ሆ䍭玼䥚㒐崃䜉率⚦积Ỗ㔤栩氳硇֖ᬨ䍶䊟㳡ᐓ䜦癎ᦓ叴筩懳瘆皅瞿慙䊂糾㌂䇇枿丿ᵮ僷䣱焓怆⯭离⽙ẛ䎟秓卟晍ඳṟᬌ澢䬙垆OㄺÔ亂哩燖㏫⛀⳾ᤖ㺄盩䍭ⰷ紮≭毻㺖㓹⦧獖玐⼯⭁㝵⽊䖓熇孭⃪僛亜ⓦ溤௳⩨⸔俁㉼暙昕礋呍⎸撻沙ഐ燦௰穭帡ギ㢑圽㯮礻孔媈⋽ᆷ␍⬯♟ᵚ㎓⌺旳๊ח涺Ṙˋ⋼ؙୁ䠌俠⿂倽㴥樫拻♌偸㭕⺃侎ぜ₫剺俉乡㮂揀煜眇㝵斏ᵷ宵拫㼏ᵷ媂䛽濑㸜枥焓ط峯絍獜憕棸䗈᧙曠ⴐ峁㚌杹塍䮇㘈౿癘䪙፭竄䰜瓴ⶡ佖㮍㕅經⸋皗᷉擖䦜ጀ狆ୂែⵀ塧ᑲ戹䍫㪻偌▻⑺䆝ጉ⨛獑ᜉី姙妽⌥呭ੳ㿯ᆿ网榓ָ䯞፠ⴛ⤩ᎈ揹䲓嚷楻⦿䃓⦉⌔糯ᷫᛗ䳋ᦆ㈌標䘳〆ൕ癸⊌㳭囤猽⪜甼彞イ殅憎㱇筎ࢽ㋿㒇影猕纻㍊⾹⣩㍌祆澩㯆岗庺敔狅㝪㐉ⶡⴶ瞑㞻⇦䍓灶皓ị㥻֚ഋ斫叇Ⓜ嵙㶟㕱笓弳棏╉拙⒅䣹ሌ㔹➪ⱐ框剪爵䦽㥺⻬⥻㭑▎喟֣下☩⸝ᴊ㓓✙偓晇杏ᑸ憱ᆏዴ䗋吇♹⾛ẅ㉨犵篝ⳛ缅祽绳㝀⫧૿枱䶤壯凪烹坋掆䝬ᕸ烕揊ⴜ秈㍂坁侱ⅹ㣂瓺漽Ꮃ惬ᖸ㘎ڎ即倪ိ忕ㆪ歡罓溶㚗⬢㫙憈㟃嗢ₕ⫨㒤寖䀊祵塃✦ピ嵼⃑㦄ᦰ䮼ᛈ㛃᩶㳲皵挓ࣆ▯䕸織窆湪㗴卾垴柲峡㮬煵拫ᱍ䙽卑ඇ䫧㪢毺圚ⷦ塩㣙㩙䟋ᴷ㑎緌㛖䶋ഄ斦殖噙㫇ᶍ㡜罵焓୷䛏欺᮸懐㬜☋⯶柱ⷻᷥ㩺粙噋㝶絆煿䓒䖁䫷威猱栝仮孙㇊疥䕩䥧筛㛟㫱禡㘂ᛷ彜㽱⛔䨋ࢇ㟎淊峒纜Ԓ᧧欧ᝏⴸ廝㒑㘕䧫㱷㳄㾸㳚纎厑㨜㐈朷伡嵆㴊棹䔓㪷๗䃸ፓ䶜㗡⭣㱆乏᮱㈒旊杫ᙆわ緪ⵛ㦚⤕妥䯔ᚏ坌嫽㦪痵主⧭牻❟ⶃኊฏ匴台泊嵿團愉瘻䣶ӆ呼廵掃⌐ᛃ⥮❱搳㤦絵琻乖伴䓽给㕐⛽⪻厖朎䶱弭㩂犭彩㾶祌ż䥄✀㗉᭪㛀濮嵳ㅲⲥ前Ҏ孾ན疍嫤旃ᛛ᩹㾆濵禓䋷䒌ル䇞䚝章⧌䰎㙼潶妵㟲⏭平穚䧎╕ⲕᬈ䷾卛噛ⲓ᷅㵆抴嚋䳇͎紋㙰ඌְᯥ⛜溄妮對㮥屫ᦶ᥆㋽ፗ⧘㌂旱䬸㝄㗮壃㤺翼瓫Ö❅晽ⶎ⺉⚆歶對Ꮜ涔嵣⇶潄湖廗繠緢䂎㎮ᶳじ癛壀欭幉⾤歋沓埮壼პ掛䫬䵉寙ᒆ涭暫ⓜ⒍䛻䰃䚓䌇ເ磠眛㕈宗晘濾儾๚呲㦼⧴┰က焧罤罀槀٣㬡䷊庫㹆氡ϻ⒕晃滿狂䉼©㔡♰Ի⦕彛㭲ွ枭氹ᄌ礏䢣ⷮу渊ጞ爑䳝塻㓯㎵䟻䍗厣ᇸ⏓箅̮ᷧ㫿甅䚍㊓⧬㮝ᢻⲖ憊䧾䬻䢘伕昲Ꭸ瞶旞䨮䑝ൻ狷䢫᧹䂄极伊奣欋㚻8憽⏖災啖㋶⪎♆ᮔ⼆⍉㬢矄笾唻㩪澗⋛籁攎ㇽ嗟㵭恬巊峺矄笻敂㰹Ჩ依Ζ忤嬣ǰ柙᪣榸学秗ᨻ彗㛵ᓽ凛Ԍ܍ᴢ杭ℨ⓺ᕷ㯣様灻娋ⷚ琍暀澗漌ത㯗㞍漏巧⣋䅟�∗㈎礦㒛外∍緻πྒ伆つ笱砃汳⑸咾牝䖢ᤖፊ؏幟匱ự㸕㮇㙶淢䑏っс⺛猖ી 區暏㖾ᮮ⼼桙粓⫥㟚ᒹ弎扦惨ᠽ/孷߅䢄ᘓ淙堠䩣Ꮱ✨㻲㳷䑌䀧瀗徍兖碯ⴛ姗ं䟸搫Ω烄綬䃳矞၏广㰂纝掀瘖甀ణ⼬垌檞ၫ笻眞妯夢⯞瓠㼛ថ㠍柸管㾉翞၌ℐB曈漟㰞睹潈丗ണ䟸攥ᾛଠН㬏睱敠㹫㋲ɐ㨠㮦༖戹弬䲘⠨ϛႯ癀᷏በ罺伣穲癡佋㞩ᵌ祴畆Ѝ箓䒿淠Ɵ㨱ᒣ憆ƕ琿桒Ⴍ㺬䈡ംṌཨ⇸焿㾞殝堧捠㠽嘻嫚愛䈈剮ߪ䂼㠴᱉Ð穣惌☕⮡䮃䘪僳Ղ拰Ёʹὣᢢ૰姰֛∷嶌寡梙枧⇮ᱠ璂⥕᪸㽟噢㪣洧䤨ᘼطㄝ㧞၅沀篻洓䞏㤧ྮ懠᪡堠ड∹㻆瘸Íᔽŷᒖஒߦ㎧Ṙ嗒┢ʲ焜椴⎽⌴ڟ䓁汇ൖ儼ᝀℾ侧⥎ओ扜↔䞺̇�ᙈ烿亐դ砧㨛䩛〩⤍⹆␀䞳䂒ἩᏨ磂Ã畧䪮䔾埁咕姥㢛⏺ኗ婀ͬ凌⁑縸撌弮ɠ㾢⩉䔫ಋ猱䞮兗̦瀴惑猙磧␠ਣ⫦ⲓᪧ⮩≰\"䶖Ḙ播࿑皦⠠Ბ洫㶩瀶㤌ޅ႙ސĴὊٰ矡玎ᡠ䣡毠㲠Ⱝ䖲爜ٯ䜪刘㘘窕ጣ᮰曠㤼岦⠭粪ే䡨椟ྈ㐐䈘簑曑㘠羮晲Ř無伾⡈ᐐ✢⅁Უ䑤盵ᜳ䋈 ⓨᢩ᷋䅤簩紳䰠の珐Ҥ慢└⤱Ꭵ⠠%䡓ᥝኚ䞨৺Ꮈ8俉ᱨ斄穉ᦳ簘挖䐯棧㑤㌭楚眺眍थἳ掸屧䋂ೇŋ押ᕜ㯔㸥怤᭳殊奮䖪㡡涤瘻ଢᒩ᮷ⴤⷾ永栫墟ᡭᴺ㨥䦉泳嫄曕∌ՕȀ儡槡掰㡮乨⇩Ა乿⏳揈ダ㖩䊥ᵫ㖓‼#瀠ⵯ䇸畑䀴۴Ⰶ䃁ࢃႃ䖤㑨᧨㎯㌇㡃ẁ⃫ଙ夬烑㋵䣧᪙യᨌቜ杢⑱䨐ᡲ䐀㤳䌺籠㛓͂啑ᆢ幉㐓攅井໎ݏܤ秨㎇ԗⷯ孙㤠♭⸩ሱ炐ƴʜ㹫࣌䆠熸䣪洉ᤔ䑮杙盻΅㡆◆焾䄠ƽ䳃箬熷姹≔果ຳẦ㷖ሴᄈ☴෯冼毗ẘ甸⁔䰺扗伱惠ރ䘠ᢓ用㲸ᱡᮃ抪₴㨘渪⃡亯Ệ㿲থἓ汄篮ી潝府⏼ף珅ㇺ↗ᷴ⟼稡爓焔䦓彟ຟ㴯杏琄极乯ᲆȢ籆ᕬ⡎ી#Ⴑ㹡䙥焼㦘㱃㽘梕ᐷ桝炕㌑䅐剱㶤䥥璫䔷⩎ဠ棘憟‰刣ஸl扦㳬綫揈 㺲⾰㍩㼂篥溫䂷䙏䱽幙㠭⬮☌ᜪ傄尪ㇲ窕᪫洷㈗瑿ᓙঝ䔂举䯺⿔屡㶶奅畬ل畏Ѿ当妛䬸☡汹㕙ー怆㤧ਅ殌Ⰶ彎㬊䰩揄ଛ⧽崰埓璢届䇀ૠۑ㑷潎ᔁ拝䉧ଏ䍂ጃ㮮ᜃ㯂㯪ፋ囼㗱瞠嬢樤Ԍఢ硭拉⽝Პፊ祎ᄢ⳦࠱Ἄ倮喒氶嘂᰼埀弣≊痤Ӌ䢒ۏ䞎硳欉嘅帼埖禦怖㭊竵惋䝷痠ᑪ䛞惬ᬐ䇮ᵳᓑᢙ棹▜撷ৣ䓀䌮ᤖ㛟也熫湤㵛⸳挷ϊ焐攋籷変松Ꮗᶚ侶Ừ緹㘑椎巭塍䌋Ŗᅰ⸀㥽湙㆑᪱瘕ź灊䋤亘⥀ຘ㖫Ǟ٫檭ӳ晷坿屲Ԛ琵簓綒䣡ᄑ岡Ьᄋ䈞䢛㘮䀯炎⒭भ琻䱗塨䓿⇟䏤܊汖䡪פ㳑ų㨃䍿㉖ឌ䜣惠㻛ᖟ܅ผ偔㝟恉ʃ㥭ᅁ朻啀㲎幆য়厔煔⤽ᯮ⨌㗿抒䱅ኜᔋ䴌䀨狽穃Ƕ朐㧧ᯑ篅奬߂愽ⅈބ㤅絢⍢⮜㸥⸃巹㟆漍䞗䎊ⲡ穉焘ᮎᇟ㎜䜌㼓ᰂ洏憛㆝㽥䴵౧曈⧀㮖リ㤊緭毫⼺ᰛᯕ⛠䮺⭢俠庿䟋璕熞၅呜ɳ岽⍒䢙敓碇絀❃⦴ᴹᴎ姭䡟䤖Ωᷠ䩈ᕸἷ⊠ 䡠ҧ什ධᴂ䱈䠱ᛁ╎伖町匣Ċ㥌䴵濤焼ᚗᱎᆽ珟ຘ⼚㨑㯔濛w㫎縙曛綗䜏䷼洅㞐Ἂ畜ᄕ睽温ం܌捹徜帏煖㏞嘧紛Ḏ௵eί㹌㑽攄݀娎䦯柛࿘弁帙㮵睨磷尸Ͼ缣छ俣篽䵃➝缐ᱹ剠柇濐弾㴾牽罛疇小濛ភἘ刿Ϸ矫渭ˏ㢺䀣琧瀗ဿ⊡ⵆ瞞妨ᓆ㳁Ᵽ湀䀞㧮碔ಛ标৯灞䪤℘缒巪߰ވ岀紞疣撧䭰孭宠媧῞妨Б䃎ྫྷà㲿㫢煣挛唗Ⰿぞ條嚐䈄巣簒睯澸㷹ց瓽綧盼『ɞ炞椞㾕Ⴗ䦴ܼ焓礸́繃紛琯樎㉜⟟儐刉В䠊睩䚷巐禎秣磧忭堮湞ᵦ⨥䐱䀸模⛾ᾜ㹿᳠瘕ʰྯ断㪿⥠Ԟਚ剈侞ẘڪ֩稳灇帛榣ⷾኙ൬䨚縬侑Ṹदᢘ歗剖は⃘ᆯ䈮䙟㉀吗ᣀ搄ẍ⎬♳焐䍯[┰应檅㶵ᐏ杶眽ỗ炔纽⊭ᖈ疑᧵͞檛┑᪱㪨栌㇣ẖ䞥Ⲙ桅ⷱ㍈╝䴼⼻㩉䱰ᆧ凖ᇽ؎礠ᴃ焾涾瀢皚㬳愌㐆橣俧῝䘽演珓暜ữԍ㐎⺘⮔粱珽枳促Ớ㱭▙磞ἇ䉔䐖佟⽂棤䲫⠠͠忕ʢ礙熓匪⩢恿ო厇̒؍珵富ΰ㦱㽜耜䚫标篯▾畟㇇爥䘞⡏柵搠廬ᨺ㬺ѵᑰ␐捯擞䔤匝☔琇柭否佭ᷲ穠烫瑲歡瓞ᑱᑩ䲥がₛὛDZ搎瘎絈ŀ䅿䋞䖜甝㕟៩⾼¥㵆ℵ穼峻䃏╿勝喙䮑嘟伤基糥ἑ㷚⟵眪瘓ˏ䂎糜䶘窰⬔Ḡ厓⾶劍㽆⠨䳓簢ᗏ䯙ໟ喜⬞瘘ൈ㰽⽾廨桡儁ឋ混䂏ᰳ㣝亟挟㘚氀㞡ᣃ㾚翡ᦋ捷灚̡牂㫳䴗ᔍ氀穔濽䂢㴺繖疻旐ຏ㖾曞✜〽ᯫƘ濴ြⲷ墔䜋曗泏䳽ᡳ⮚䀬㾆ᙋ㠈㐑帣㸊繭珻熷峏䷉川粝੬Ḋ寻埍ⓘ殥Ზ碽稘䘧糾℃掜伙瘉ܰ╙澮刃㵭絛罬ᜏᣡ佽抄⼚瘙ᰖ矵漹ዯ㸚筽筑㣁暏擾㟟䨺ᩂ瘎癜㞧潵ᬗ㷚箝礊Ӹ媀犝ᶈ斘ઃ縂ᑶ埃䐁庹䀂稣砛畷凣娹ႜ䄟傋䅑ཤἶ䎽㼾篛ʧ猃≏濿矆⫆ህ帴䨠砆漳⠨簵┴䩧澈寂宇䒛ዂ㜕㷳Սྪ㑷䘩兠ô䪯̷䱸曡Ⲟ䷲ᳱ猹篳硎ᾌ䀖玵㹱ࡇ枯巭疰⑃勗㈐侊⠘俐Ḝ㽅Ƒ纳籇摁Ჿᥞી䌧䙥吢Ⴕ網婺㻓ጉ篃级匪ƿ浠䚞慃ᨓ吆簮ྯ᳨ᣗ䇹穃罧撯䕀䝟撞崛甒ᝠ砶ဿ帀澨磣ȓ琯㣯嗾䱈ƞ紙睻栘⾽㩱㼭ȁ綶嘷湏猭㑞ᇜ秵䘘␖㻚呾㼀䂊⎼懙摿峞ᑋ偛爨吖哗侲弴畊者禫箷燯眑潞溝䄜༟䘀価㩭㽜绸䀫祓Ⴣ⍿峞綜⩺㼞䐉籏⾵䲥縭碻籎囤ƿΈⅼ欷丞ଅ堑哫㼼ٹ磩烗燠俧㗯㋷〤溙ඨ樧Ꮌ䞜⸻ῡ㽬ஈ៨δ⣯ᢢᒞℑᆰ知琐䇯㼽∽翻珿␏滈䚉➝侦纑㰍䈕ࢋ怖憎緅䀬焗继梷ᰠ垾慆縞簍矿揤䀄ᤞ縖䏢泴ހ瞝䶣夔戉砒Ᾰ➏㼁ợ硤缯燂⩟珞ᤝ⼞㣭䠜ဎ周䀘翁繂㶧穉ֿ沇ከ縂㼟▓㪾⠱濃≇㽱ᶽ砧絯砿浟ゟ俣漛搜缂㔷ᾷ徧䌅翬㦿੯碯纞IJ؟ኖ䠀䯼ᥬ䀂耜䏳窷磣晿更㖟猟揳ᰕྌ䡂御☫焙紝繛秺䣟嶞㔜漘ᰙ᠗ထ徵྄槍罋罗罦䰠ພ溩縜⾢堁痸㿞䀊翲ᅛ稷耗沝恟㶟漞ᶥ㐘栄瀞ៀ翌耞嵧縯爿狦ᚬ绽㕿К⪬瓰怕㞂网绪捛籯穏惠ᙟঞᄟ☙簜Ⲽ怜䑆℡丱㾞➏羏瀷瞟䬟崝殟桦瀀㿣御㾑绕絳綗癏敟䁰✟弟歙ထ瀓忡䇅翱繿䏨硟瞗嶬⸞搜㘘候攊㿾珗㿀繝翯穱瓯昷弟ⱞ䘣琟炯刂`㻧罵缚惷簀璿生嵟Ⲡ䐒耀ῧ惫㿾翯⨠䱻㿵ᇯ䴬_㿶堽翴dz翦㿬翵ῡ俹忢⌳帥㿲㽪T帬\\[擰ⲧZZ忾Ώ^忿⿵ῷ翪ԽC\\ၦ䁃㿻ᆭͻ䀷P揦抩䁄忡帮N搴䁁忼翥A㿺峣䁈ଽ䁄H⁉翧俪㈼⁕翹㘫䁝㿬䁖㿰濫濲翣`猴⁖䁐硺⁁䁋㏯㔿濱㝻㔼䁍翸䁘翲矱[翲䁊翢㔭㔨恛睯⁎恐愰恝㿠恒濢俴恅濤翢恑忪恍⁖愡恅恗㔹恏ῧ⁛䲲ᠦ濲彳䀦濥恖忡⁗䁙H濵⁅忤ะ䔺ၖ⽼ၟ⁚潪ၙ䁎淺䨭ၗၘ恖⁖၃翮忡၎㿿䁙၍Sၜῳ⁑᷶偅恟䖩ǯ၀緻㲭Ǧ⁘昮⁇恑⁉G㷺做Ǵ⠾做䒣偔ၟ㼣偕偐埥̺じ偋偔偞\\停䁒偉၏翳Ԥせῶㇾぜ┫ⷺ䐦い勱<⇨怳偉假䁕きᘪ偃あ㔴灌樬うᘱ灝ᠤU灐灈灏呣灜灂灓翳恜恏偒恗恅၂丧灛う嶢ࡄ^㒰〫灏㮶࡙䁁げ灉せ䁅ぉ⁓濰ぞ灓㔱ࡘ⁖㺩䇦ࡀ䡞ࡏ㦷ࡕ俷矵࡞⁗偂偙⁋ࡊ䁂㔴䡙灟☡䡒い 䧸䡄嚭䡙灘爺灃ࡔࡂ⌳䡍唨⡐䧢⁈㿺䨭䡏灐翧䡄巯䡟偆䡝Ῥࡎ瘲⡐_☥⡑樱䧽䡍ળ⡋䡚⡟矷䡝࡞⡓ࡑ⡗䧱䡝☧⡃⡌⡇㿴䘳⡊⡖C恀桞၆灇翮灎䡓㔶桕⡜桊秶㈬伯ࠢႬ槡ᠿ䈣㴻㘧㌡ȱⰩȭ爳⨶䐨爻пȦ戬伻峺㗩䠱岪沸⠽ᓵ秥ᮾ⼣尹ᰪ吻尥మⰳᰫ栦㡢玾尿琤㰪欻␢惿矦›䀮㐨倫栩ઽ㴭搶ࡗఱৠ䀸䠠ܫ&ᡐ堼䐠䈻:䀣塀爮䏮8‣㈾䰤⸮⼡㰴〳簺編㡙恴㒮⼮ᬩ簠᧹⠩匳‿ᇻ痾I༪Ȭ欸㠭簡‣簫簼㈢䐠硔ȩ䠭䠧䨤績⼢ᇧ㚮忠ἳ怩‰㡋0ᇧ塍塏怹硓ᠻ塁尧怯塘倫硘吴恱㡐㠯琢丨ȭ㡔⠣㡕凫㡛䁇㡘硆ػ琬硑䠡ц刭䰹ьȸᤱ䚠伶硖墣䀬ಮᡋ栣+й塔䇵塛0ိ塖㡅㐷堼∯塀㡕ሷ堬䀼硟㼴䘬ᐱ户堰倧桚›䀪䑃䑖䠯塐ဿ䑝簻䑛)‱ৡ䑆䑘搴倱৩硑䑉8䀫䑓怳硁尹⑁Ǵ䘽永ᡅᠬ㐢炣ឣ淧倥堨摛斡ᠢᘣ㠬欣ࠡ泶㰵㸮᰽笨 "}">{"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䮢怜Gᡠϋࡲ乀ҕ桹በ܂䫉媁ଵᑠ́ᶝダ璽⮆瑚थ畘ງ䵓⸨ⱉㆊⷫ▍ⳉⶏ䢀午涻⮎泛ྌ㘛℀ǁŇᰵ䂇⭏᳀⠼屉⬀ⴰԹ崥╃⒧ἀ㳐㨆㱯㴅㷖Ḉ綿ᰁ緟』素捂ᓭႂ䦬㢇À⛊䳧ὁ╔刡≳⨇ȸڵ劔戣㣬ࠡ擀㞎䂂ఠ䧈别㎠䠧ᷔ珆擐ࢭ䰸⺉ᔢ笺䌙ᦁⳋඅЄㄠ治இನ瞁▛㘦⏧┿卨㍅帘漂ȗ̹䵤梹㷏㒴絿㰅粟 ΰ朴Ⰸ擌䐷ᫀㆤ㛋啐〺㔣⚁㓍ᐣ㔍ፎ⯀䴾۠冀样搣㧂⒍ీ岌㗶ᣬ䴔箹䰫⓿ͅㇲ«উ௰䱵䊖䧨Ⅎ䄲䭘ކ䩒噸䂴㮪ᴵᴸ洏ᴷ㍶崤繷抗㡒⪯㢱⭄渀粊岿⬴卵獸澊Æ搻᭚ͮ嘤䏢嗺Â䘻忩梾牼啲䤷涷ℇ炞䚇竺恜掤♚ۘ估⫁焃٤属ፊ咴䞄嵰区犴摶窹勣㚻又纺Ĭ乌㊹⦶Ǭ斺埌涴搼厲狼䚉牴侵Ĝ疲¶ၲૐ㏚⛰瑹䎋✐剸⍾焾䭨䭔䄞樫䪹⼽尤䣜ዪ磑㰱畳᠄䍴吙滟筪佬慚惃檕Ễ̉㾂䋩罀寴杒墘䄒䲘⯁䊒Ǫ䓒俅浾仱怱ᰡ暉ᱹ扺儅玑㹈▶奂潈ើ䆽Ц怽.瘵䘥ᔍⲺ磄劼媁僵狈㣛熩嚄Ⳋ灩ύࡶ☱ᢲ屡瓞˶㟼ϟ戔㢠俽浴䢋椷僒ㆠ晋疄專᰻䀢杵糴儡姊琎✆㤺ኄ俥惆܈ሬ岹ჲ㼩ቮՃ扣唠൬ばդᦴ'ᣪ瀠�᥄㡰䗵䃓㗬㙪ᓦ䶠冔ᝣ稵租ㄡ⃣瓄ణ࠹䈠憸憕ᯊ⥂Ȩ炪悼ค䍁ⴟ攝⩓ী⠚ܼ䑈朢⢪ⅱ劤ᅠ⅁Ḡ⊂ѦۏᎨ卅࣡䙂ㆆዃ癝⍘ᜦံ䚐ຬ䨴䈑氃ľᣃ䈹⍢㫦汤Ⅺ⥡Чม✱ᆈᵃ㉞⋂㥤ቲ⚂㘫磾⊤㭈纲䞳䥚ᷟ堚㍖⚸瑯ᢪ䮩椢1ʲ扝ዼ♦⊝✄䅨棄ʼn悵䂍ᕲᅖ卜⇆ျ▷ⶫи䗰攩⧂ᒣ乄ż㴧㩤攄禯䳥䳉ဨ⨞䲾ː྅䝴冫哏ࣙ撻᥍ᘱ浕㍚㎅㊄杈班礃䡸憹䳿ḳه匎㧇硠Ș幰殌ଯ⳩ྙၵᦰ埍䪿㠤吠ൃヤց䑈˄䵎䳝䉲⩬勐ᤵŭ✸们ⲙ績癋ᴫ縶㍆ᆒ䔠䪁Ⅎ❥㩇x厪磀䯈䢴㈩ᖼ暂£宵᧮杪‥緄ᇧᓘ籋㌍三猴啀ת棘⥑㧪֞ឰ䆥ܵ⠋嗲厓⫡␠5ਸ਼礬៊䙯㣍⬑ᝲ䗼寪䛛᜶䶁ᘬ壏紇⫙熵◺墠⻁⬯ᗶ啫ᒊ埍䛏੭㽰㖜䠺⛘⯭㱖ⶄ㖆䕋嬊⩭հ�擽把圫ị㉓⪄殖㔒懏猃⸭ⅶ㔶圠囒⥻ⳗ妙䓶䋈bⶏ㪦欉△固Ǔ媣㐮嘠⼁漕⦹ᴪ倡米彻ⳝᮅ㥦ྂ璖䃎盰椵⋿涱军寙寯ㇵᶏ噒寎Ổ檍㏾㈏廌㧃ஷ㽖箝璎暀Ǒ严᷼儠ナ7䂦䟕ᬻ⺕捲ม箍暰㗾α妧傆Ⰽㄢヤ睁狍⒴椕姲ᶨ๛ᒏ⭱㬯ĕ盎堼₂ⲭ䙝㌛晗䘵‡硰皬ᆌྸ梼庼ᾃỶർㄻ❉緄稕羂ʩ䋌ࡑᦽॐᎨෆ㊍䛛⎬ᔗཉ桳熲ễ浒Ꮄ㨚㒗❕㽯ӳည欻狙ᷝ䋸句堵曌糕掀ⶉ綹⫚浣㩙ጦ㜆ⲉ㫜缮糣砙暄ࡆᷕ穞䮮倡㏆⟗筨潍モⲹ粻弄墣ဢ⯤㰶幄嘵❎ཞ尖仢彣ے毅㖛斛柷㉗ᬋⷉ煹痆媕囐玱㹇亝⚒犎笌倕剿᧲ⳬג᮹㌷ᮗᝉઌ⋧ⴞ坺䲼忻◜㍋其㺍㙅⛏份⿱姸劜塵䳦歨ᒖ梞䟾禯絿䃸ᇴ嫠䟓ஹ䃊ڢ㗆氏⌞䵣䗼禵崃寔縨瘯焎čŷ怫瀵燿凼㱧㳷䍈瓇殄©挿哱ᴃ尡㹈䎢⍡筬唶窆倉熾ἁ榼嗴㲴岕柬穗哈⺹燵͊ു㏏殇㧚⍲焈㮨暱瀾圙᷽狙䯀屇亝䝮⾫ॉᒘ戗瞝䱽揳㾒㖒➜玖嬉粍泽瘕忳淚ਥ⫄ᠬめ侮土➝翼稂ⶳ徸厰砯檚⏱礊毧⧕ၝ戚乇䥆⠛㸇毘ᭀ线ᨔ⼃㽝㕃咊✠惗֚㷄㙾ᘌᾱ泯Ḅ凷䋇㰝ᶏ㽠嗭䎨敒弮狾吉ഗ徘㞭㢯ᓑ❃缢䮰廜㪝焷㳸䭯ኆ㫏姓⿴嫞搔ڻ牝漖继圜剧⤄揎彮㧞燌纗璽砄簿䐧ᶍ忳ᰐ喆緅瀣⧭悟⯱⽲䠙倻绗璗⺘⧰ſ甾ᴙ♢Ɛؠ乛緾_盃纑吗ᢁ၄ř瘧՚せŧ烠戧焴绮䓯ؚ㫾䘼䁐ƛ峬圃矟㕸桀幏睳ତ䯧๏䊠㈧嫰㼌牷㜥⁞䄠痿㽛ᯫPȰ箘槺K傠ᘤ叠⇴偰洘䑙㚬༰缙⅒ൃ⺦⇼ȼ≰招⥲㡻擠᚛䏩䆱坐熥ࡋ抖ည㌛硵㱌䠒᳚ᳪ䅑㎐䞥绨܊猰叛㑒⣞৲Υ♬ᇅ玠⻂ળ懈༐䞘打䂑တ䞸᷷ŵ㒭⨒払⻰剈湎ೇ⤤䢌Ő嘙㱱⡴䝈敥ⱑ幺࢟䩂冚ଷ᭦⩁⩰䃄ہ⩝žᘈ罦ᩓ⇡ঈ擃ك冑劸䋈ᴶ⺴ࡇ౻晇Š狨䡘噂ᇪᅸ峤太䣘Ӏä任㆛ࡘ櫦㗤ᅸ姥㙜拷ౘ滥⤿恧࿃㳧Ṕㅡଠ巹幚ㅾመ䈤疾ᇐ癰焦ōᄬഘ帧㗨擗ౠῘ疡⪘䛌择ू睰旺⅝ㄴ獤濥♷प勾ी強ɠ倀榥捨䥄䡠ߥ濹凵㋄楇牜抬䡠ˊ‰⡔䱸傛哣䦉䝘䔛⫯䥔亄戣Ց櫢䱘奅翸爆ᒴ䃄汄༒䶤糆⇳婸䃴ఢ㼥স璌ۅ㕁⨔䷐竆㕛⧐䩕㻇㕝繐ˤ畝⚊䗔稲൜ㇵ㒔巆慝槮䡵㛓㒣䵃⿅‿槔䴠呅ᾨ䴴撇穞⅖仴㐠※纊暴䜚ي㈢䃴囂ፙᨁ༤梥楕榱哬䊇涷ᦘ乱ই㍌妉䇲ᲅ㷮x✨睅ߥ⅖䤟ᎄ嵋煚ྌ䛒㭖হ䤌嫓歞ㄹ猀�孋ࣃ䪔ᒂ䍓ᄢ狠⚇❜㤣䧔猅⌾契䢼岊㍋㦓䭸䌆㌷㤤嘬䣦䕘禘䕜揊㍆䇡佟〙卖⦨ǜ珁潋威䲴అత䣯盙㴹㽍禰犂▤孄মย簇ㅎ癰¢秄榳䃾⪅偉礴䑢搶ཙ䤈ⶤ娴夣㱞䥬ⴆ䃂䥾ᐈ䛳睂焳ૠᤶ杚ᦤⲕᆢ䔲億ॏ㈶ቝ⚬⺂洦壟᤺昶㣅䔵佑₷㣑櫨䞴⋂崭䕫Ҵᔻ㐴ⰴ撋擊╂玀椺哛㐪儀㠘㱘䗵ನ劄య愸䰨憇㭔ᇦⰐ䚷⥷╆⯌䥧䤡◊灒窇ᑹ斪䏨妴㉀礲೬➶剖旷獴឴椾奫恄ᙁ堾沙䆲佇瑆榱⢠㑶拄⥞⻯ᾶ⹈祩⩵乵㥸䙪繵猻庙⦪䅵峉秥⣊屶磓श⤜嘠櫍ᗢⱠ୵乧楉⦄㥂硓眄䱒犩嬫⦌ط糔牃⸊孷۔㗾煈戶䟾ᗍ䮭⋴柼㗹〚ἓ囜榘ⴿ㧄⧺絷䳌ᥰ⢬䧷˘疧⡵ᭂ圹夯䥢紻滅ᧇ⸒攷⫵疙仚哫㻑橬狄Ƣ壊嗏ၔ磃ᗶ䛧䇘ඍⰦ籗摂䣜ᙺ場㍅഻⫂分㇀㦸漏໊㉝狦畸䧖ॄ汤氄罈䴾⻆秱⇉入䤧⸄槖ৌ桌ˈ㔶׀榫㝔圴䷹ජ棇秘愤⻌浗䱯儲橲拄⧺ⷰƺ榄╝-ฆ纹䀵ⶢ橴囔啋倠ᖤ倶ᔕ癍ᆱ嬻᷍ઐ完嵥ᎍ७㦉宄審潏䖡㏮妥〣撏殴☍烉ᑺ硷ޥ缑ₐቨ啒䄈煐㫍垖䤏⁔㮁椏㉫ᄥ̠൦ٸĚ嫮䟯冸ų床ഉሶ㪃唜紋❱㩫勉̏➆㰆宂ؠ᪺ᯣ峂䜏㛌媁兮㜍孯寬ⷽ䝱丩灀മ➈▕ᔧ凨ে㶆⭞夺ཻⰇ嶮ካ&㳳ྙ儈ඛ䬅ᛝ㗠瞓ᩉ櫝擭繬㖙ᯝ争ᑳ偨⋨⢤歺孧動⼲径熏寍樎䍡笎洝ᰋ彻⯟嬝溩ᑶ剭姝ᥬᏇ熍壭ㆬ妄䉀㛵怸ྉ煅墠モ℞窀㭲㐽ઊ宂剣そ筠㮽ᣗ惣⏿哭హਥ⋨㯽⹖儃吠Dž㲄撹摝dž嚆ᖦ浽憥⢲㨠إ撄တ枢䉞䇮ಠѧɖ櫉ന烺ⶫⴄⅦ潵Ȟᑭ㥦ب凸⚈煦㴼䈁כ⾫൱㫩䗕㻚ⵌἍሢ㵻檅㈖⊷㐒አ熡杘愲୳ㆧ矃㥤⬊嬘皦๗㫌痦њ簶Ƹ姮ᗐ樴ㇰΆ☡┭幽灲ᥠΧ0䀰渣挷屖⊿ѕ㶯搪愡ቔ党嚴祰䰋ㅩ琻ᔻ㙚⌺亐ᔻ❲屦Έච愥序箍敎槮且㗑༎㥲䃄ᣆ⳼Ỻ䷕㇇㱀喕ɬ槇䡟᧐Ŭ浽ⵐ悞䶔眸灇䑭丬湑䍐ձ侬抽䭚姱▼熆猰姚䶘旚眳㧤㯌澇嵓ᨾᏠ䘆䍝㬱䶬竍昂姥仢䀆卓䝧佗る晃PⳔ推浑槍䴔縇㭟؝佊ᄆ…ࢃ併䨶Ü槺ം搶┽䅼⽀碷杖㌇䳂瘇熤䗘ʜ愇彔㧿书䲷Úᓶ⻬擃㨦ؚ佲家ⓖ姸Ⲍ檷㣫☚ⷂ熶ᣕ䗨氒紇㑛ᗋ䲴㥠㳗㦨⹀˓Ꭺ暷䅃嘔⺂禶℁嗙⸞♌⛘嗻ࠠ⭤ẚ䱸涓⬴娵仏㎯卂墅瞸纄玗㒕槎俔䚞峕斬֗䭛䪕汬⾻⬾妺А㺆᬴䁕瓌䇺Კ佦涜Ꮴῳŀ⎟皜䓅䃯⦛ᔎ婍埭㶉䭞媞⺏綟䘼⽭䥤∳ᰝ⢩纹ᮏᬡ్䉎掏⬩婭凌⧽寕廓ޘᰜ ᯛ䆛㶂丬巛⟀惴ᝪǐ獂早尣犑㥥᪄㱮ኇ㲛欀㊈糿狦ਧ㴲䢽䘰ᜠ⣽↼洶ᾅဲ嘠́Վ㭰ශ攏岱ল⢠ᷳ➉禫犥怼ញ㭐Ž囁垇፰ϩ幈ઋ䃔⯽剮ྍፇ嫩稍徲篻懝䭁澐岯峴ሼ征ҏ嬒็羌ߔᤣ䀽奀݈ᷰ揕涌淴卾⌾剃ᖫ媠㌎垑䰋宣朌ᄛ㯨㠴㼏ኈ簉ᳩ娏紩ɘ㻝渏䯰䝨㹃䖂䤗䤄㻋㬼礈ᖆ忳㚽淖ၖओႄ枦῭祐㞋㭧䧽䠠儀箛撳䘼攙㒒㩈䊿焉✯女廐䤕簏岭㦽嫘᠌䢔Ƣ济h⬭垫䴒ᝨⵚ熂Ԇ枥ᴳ䉮儉栈㺳侸⋾➘㡃侽洙笡㣃巹挓㠩㼝硿挑樬ƠǑ⑹Ε㢋朂ᇩ᠐㸗ࢾㄡ朲㫫樌猂笾㿫瞼窷枚堓夾̄㩈䣆梆㞭㫆䤔夙洭嫛嬈➽㷓洵ి䨦ƒᡠ⤹䕥Ცኇ焪ၴ䘬愃硼廊惌灷㮂㣫䩭笓ߒ㨺Ṿᔞ篃㩋䓼㔊㝘佻棆⟔廴ᔜᝆ喆㭴አ嬚柢㧻氒ㅠ睐ɛ䧽⌬矇恐◿⼘棾䁰尠ἇ⑯㿓䯾ᴍ矧廫嘿崊篣㸛儽納❅㻋ⱟ或翃涩䤮䟨ḇ堽䳓㝉㬻廿ᴰ矧㥳癜⼊眬ၬ⅟漎ӄ祲ཽ儚倝㷇埽܇矪䀛䭞✔坯怷峽甁椼䏚ˈ〈䄁㹡嗟̃㞨绻橼刟㜲糧榃众࿒秛䋟ਉ⼾ŷ䕞笝⼿㮓囟樇⾥㪝䁝नྗ㏗䷞慁ῆ㼏ऒ䭛Ḓ盭窻換䔢ᡧ牽ሙ濯㽫敟ᴆ便㲴㛝㴑侃㹋䇝䧍䬝槟߱徙硠䨳垻┖禫哩緳徘⼏択澨㯓櫞㌄῎㷫喜ଏ矱翷恞ฐ掐嬑ࠔ某倏嬜㠂搜ጬ㐠簚䡟吣渄㼥窗棞刍潲罆⟝爎㩇䥜И怂㭷咼㘂彷ࢯ疞瘁㽮Ǵ疯妞䙂ဌ῍ۇ窥攅㏀䠑ⷬ㶋禀฿䡾则㬈嘭缈穫檗㸜㤔㿧潛崝璛偞ጛЅ翈㹓稟束፝掔ĆҰ吾إ砏㎷⣨ᤊ່ϝ᠓ᜯ絇獀㪞䇚⠲ᯕƕ祏浶ܣ丐ۺ䩩ͅ捬Ꮶ砦ῇ濜䈙碕揠睼䈔翥朡巐疿䑡嬘搌䀼㹎烈ᗟણ币瘥塻䴴༑峤嗣劥り䅻㯈⯼昖翬Ὢ綤佾…娉൝䆪䆪۵ษ控֡噰Ȩ洺簌儬1ү㑣亦棢罕˰ཇ䒡ⴧ䰉炏绘㩧潟⪼縯埲ᨤ䍂♁㟋熈䡴ⅵٙ⮂ᝈ♶傹͆䏠⏬䔡渦㈱ḢԈᝯţ耒䟸儀ʬഠ㍐㚤娹柊ㄍѪ⨞㋼姗嫣䊼ष岞䴧砽傆幾جᕠ䆣㐫ై⤵䉵ᅸⅴغ吠\"兞㢧䱮㡵憬ڔᆰ牝⸭睡Δ༐‡ᆧ簲ܽ愰ӗ浪ῢ⨑ᑡ䂑⇎庬偧倈碓䇽Ҍᯰ团䀔是₿̠സ㍮䣱ℿ碔䆑冂ᰨ涩ʤ杮å䍸烠尒xḹැ庥禭揰箣搪ࡗㄝΜཤ㣡䆓䤾㿞ᘼ䓻榏ᬑ䒩㛫ὲᣣЄ㤡⩦值硶↜т᮰䔢䲭≛烲䉡昴㎱e捬呯ᅅइ澐䚜帵ⷺ䩍⍥壈煥ఉᑻ䆏ࠔḿ᳂弮㏤儑Ȣा᭱Ⴆᴱ咍䑙簒Ꮍዣ娑༺࣑⋚ࢴ⺱୧㘿䢇些Ӓᐐ唘㺮扎孶簬ڠ㛤䤥ᴴϝ䘺ေ㕂堗ⱛჭ䊅಄㑑晥儱౽泉䙐᭣ংⰭь⡄抎ྊ勡⫥匱猦ㅎֺᬐ唝ᚩ江ᤙ⎍㲁㡰᰿ⲉ㇊䟯䝸检享烺墨⊂憜॑璦愰ಜሔ䟜ၐ枂㚩偎棚̓⚼㩑ᇹ㱥岞ᅍპ̘߃ᨒ穔䙣掝⧑㡧㌽ᑧ䇒䓎᱐瞂䖪㼼礍搊抹ᘑ緧硨㱤煖梠ဂත犪礙抏౼㷑ფᨊ屸䄻䒣䠤愂㢭湏㢶ˍ瘜⒱㵥唲搣S䓢ᛐ漣暫㙘ᤄ⍞ಜⶑủ⫪䉻爔㉱ᘘ岨䰥対䓎ʾൔけ䉅ᄽ箰慥՞ᣈ䕘憤ㅛΚጃᆠᇰ揦田䁷䐵炩ᐤ榀⚭剁㣀揸䥤㨩䌤ㄲ䶢偲⑁ጸ宅䉨樾ᢵ祳傠͜兄ቁ䉷䐱բ撄璳ᅥ䥋ᣉ⏠䩂⎩ユଳ扡簦♹ᧄ伃碳㥗⓷≺⑄㣚甛ႏ牸¡║䬳牫ㅏᄂᏍൂ☩䎥䨾⒈⧂䬥ᠴ亵洮ᘯ⢃ዣ卵壐樲㊾䀥爉䓹ᾤ殂紨㥉ⓘ剴䮄⬠㳅†⩪冨♤↴撁խ祂㮊嵡叉暺炳⒍䤤➵ᣄ䤲屫ᅙ磩ℂ猊╲Ễ╍⮲⹘䎶ࡨ㊂ㆃ䗾㓥卶ည㓉刦ᄽઃ䤥䑊ᾈ勄獫㈡㔒硢癚㶰病䌂ḱ⪧恠ໂ♯ॊ㉘嵰⟚㓤ෆ㌵婮↗䘆ᔤ啲ܭ⥐綊峾䢚㴉ᯆ䆱窕椱㫎ୱᬙᎨ此ങ⃪ᔚ㧑噅ڻ媅⧃⟥ᐬ奼䣫䍜ಸ㎱䯈乡校䊀ᒉ熂瀲ଠ⩓垫奁⓬㉦䴰㫉廦Ԧ⚜۴整拲ңػᓍ璿ሆⅢ⋆ᬲ⩦䆀ᾘ翳壩㍍伱熥䫂⾺禅禾檘z䐍是㋲⭙桭㎇㱹窅⊵ᚁ⇬昣፴暀怡歈㵉痟㛖ⰾᲒ埉屟壳䔌噘噪姿梨剅乖〉厇瘾屢⥀珵敂⍲婨恽泝ᐘ⛴㻸䦹璉ᅾዧḌ౭ឫ焍厓घ㙉ᦇ䶻汪㨑旕⡼嘰峯炠桋嵄司噊搸⮰㑚䥷㠠䭬栲䛨捄泮ይ䨮㜹㒒⺐䦭斢⠳⾒嗨ཀ㵨䋙痗岙࢛勇璓✛習ᷬݜ䓙瓇䮧䓾⛇ᑡ㻳暿俪Հ⻬ੋ㸣牥丢⍙ᛥ㎻穮㤯䘇ᗼ䗓癥ὑ碿䷂㢤㧣䄷籺圏斿ፄ矓班㝇㔖犼䡚㘩ઐ羼纚䰰ᛱᤠन৩ṉᲷ匬䧆ⱉΆ㎳穣ᅗ杫᧼欒䪶⃖㺏渐ⵏຐ䣢㠃ⱪㄙ檛ᲈ耒ͫᕈ˅牠⼂ㄉઐ⡺ⅴ䄱敟≢櫓ሮ坉峍㏴戁㒙吶㚸㚀樔ᖀ值碂㼰⊺玁ᖱ⧙䞄ᴠ傚৯⟤ኇᡄ絪絔⋚乼㬥ᘇ䚹Ⴆ䘐ᢸ坑㽉⯥ၿ䋲ᤀ䅾ศળ↗楙䝿ῂ撫乮ホ焫ఌ⡦寥刨穃䐴⁐Ά⠸㖫品Ḩኰ䪇佮⧥ᴵ⾹䅻䗫敨娂疍Ŏӊ掓ೲ⪩㚉ሂ᧭り䕪ܛ⸷ṫ䷩筐˝્ෞ✥⌶ⶼ⥻ᙵ㬄幛㠡憐屒㡖ŵԌᯉ䝥婱榉┠ᖨ兲䞂َⓌ˜㏚⦄᷅ቢ㩽᪘斳ᚔ崬橭❮㨣#焵ݠᣠ䆡㩰あ斫◆ຠ⫪Π泛䁞䮈⾩⦑䪷ٱ熈斅殥插禘筈᳝㋭䪆Ⲱ嶴噼䙳旧ᝣᚩ㰪扬ᓎ⦐嶞⥙㧥寤ቱ㦛䗀ᜧᰬ䤑䃉㳘啁獟吙ʶ永䀫ၨ土ᶄ汫桉㣜ુ䭁⪁㬅䥠ㅻ忙⚸囋ὼ䄀䟬单㕯䫑⬖⺙厴ま㥡ᕩᕼ崪琵瓌䃔䙊⫺䷂㻹戉ㄮ碭ㆢ喠ొ䡊煉㋂Ҹ勊ⱑ㩥䥡䕱ᖜ䔺攪崑᳤晡༤⪤㏴攀፵̣幏器䗘喢嫪搳Ӌു⫋䘕ⱕ㚦㵷䴎啰ٷ売墢籣今僄Ӓ䨦ⶑ∵癵ⅽ満崎咙Ἐ寋實䝄⡦ă॥⊹坴䓉ൣᗴᕒ娪綳䍭杚勋⭓ݾ䩕惷棥䶘㗩砺奜痜嫌䫄檴欹䭭㹵ᒷ✥䉣喫櫶帷⏋䚑瓊㋪䀲͓䗕仡孺ⶅ秲呵ᓬ喋䓊怹䀩䩚⼍╲价㭳棅ႀ䖰及椹宥仁拱㊑⸍⼵㍶敹㦟唯晎帼枳䩅滕ⲣㄾ䧪⚖援签䚘䖩ᙐ妊疋䏈絚㒶ˉ˄卅♬絢㖾堔寂俊泉廇ಧ牟⨅㪴⁖梺͡䂠壶Ḧ孌婋⍒ᓥ牄Ⱅ⢵乵ᾭ;ᙣ䟞匚硼䵎㻞㍜⣍ɂ底ၕ⤧䍵ဤ㑾弦嘋㻏绖⳨榐溠ಭ㛢棋⇝ธ㕑夊㐊⦡債竕௬┃ⶰ摶⤳ॲ㕲城半廲嶭廈㫬战漃㠭㣲擸፳痞琒䱄戓凌❍笅ি⾠p敢㽱㺅疣ឺ咦咺⢌䨧⛵ᰔ澳⯤䭕瓾卸൴䏸Ὲ⼪⩉䛋⛞᪼汔ℵൽ兹㖲摐忔爺NJ怹笇ᭇؓ▭⽔㢩୭㦜፸䰀竭䇎䴏Ⱁ⥓⚭紇⫬䭨Ổᬅ宣Ȃ㲈ˀң᭷⩓㠕䳗˶㎈ⶹ䄾ᎆ䠃應ባṮ憪步㧍ൢ嫱疁䶴㜹姚䗊�癃囎媓⪼Ⅴ仗䍿㩩䪍㠞ᕖ䠒䊌㣄⚠嬝䱣⭍簆笷᭾畁垸䧖櫓弒戺X猠犣㬎ϔ桭瘥ഫ敱堚畻Ύ喿㛣婎涤䈍珖抣勑Ѽ䋿┈ᑠ㎡䷗ᒯ嫞梠ࠍ挋㫾⮏ⶵ㠕媆巻ᇃ〠ະ务減⇍攲懽摀ᷠ瞦劮査焎㭎潉∽ॗᒽ䭬ᶐ畚۵⹛夏㷕༘㫂6䱅㣲⧽箝ᶞ㗡喖彺䔈͝㜊墹樧▽娺秷❸婅ਫ嶢⏴忩仴⻥㖤〓ⶕ卷䓵䚚㖗嚆Վ俴ᢎ⏌什㫥沕嬉怡發甲畞⯎䚕笋ᗉ㛙㯫⸡㜍婔䇢㝡倦矐忚禩看ᯕ⳼㪑ܛㄽ䎖兿籧嵾璣僖䬊ᜈ嗃ᛨ㫶淡⊼羔ᇸཱི巻㓹.柚㈈揑ἒ㨹欑ᩝ粗勱嶇ᶗ晧垖⚛ゴ柚仯媳樷≖᧺使Ḗ嚶倊戍柉⼉᮪䛏㳝ક寰ᚩ㵱Ʒ巎窛ᄳ㟏廚穻仯ⅽǴ䙾㎍⦣睫婉㒚儦毛廒禬Ԅ屽得绺䝲絋疇僾些ଌ໒㺵㨡泿ⵁƕ然緽睙厮䁚堉䯍亢㬻毿⊝嫖寺䞍緓瓿帆䜺∃䏯皹沔梧峽烇㽶㥸綵坟堦倛ᾢ淞䘠ޟ橝␐㯳篻盂Υ凿妰壜椐揮羂倿眗䂾Ȧ怆⟈㷛瞯凪䰛秳ᮠ䌕㬅ᕠ泙繡䌫ᯒتॐ㺡䓃ᠽ忻üސ繾䈯縌℘ᶯ疰㷚䛻఼㗠㦑ݺ瑤䭕搸焫჻φ䒐㦠篝匒篿ཞٿ瀰碡ࠖ䡞ę̯柨㤺瓭㈻䱪≟䪾䥋㚎㔆ý仪ྀ㗡溴㌐梙罥㲨ℭ毴淲❦挆ృ、佥䘾₎᪦Ʒ⽞㖕ܭ〵䞮Ŏൟ氏ᄦ㨽嬝ݤịţ兪䱒⢼ࡸ⏸⍸书怌⢚罷㱴᧠秣甯扟惧䎶瘥嫖侧崌䚠出笍Ⲍ䰝槴ޱ巙哖äᅧ瘸恑憸䟘ᮨ缡⩒Β呠㯸楀ᴿᣧ刎㵌む൰是ᙓㄐ㶖།恑瑦ἑ炕憤䟔ᴐ笍⫖⓽ݪ㚋┞૦⧲㓪䢉ᒋು㑰㮯克Ẇ捎箫橱厦砿沊刅㲮ᤇ⨝̮笸礓捁㩦ԑ毀㜿ਹ栰㕋涫尳䠣懇棶捅ฬ㯑䣦лಏ熺䙶漐甃宖࿀䓬ᎀ䵔梩朤⯱ሳ凕端Ⳅ柕⢮呛ࣥ⏃࿘㶩䓦⤺䲈ু▉ᥴ嚳㕫Bं&䐒㱞劧嬸㊘㇆❑ᦄ渞ᱭ㱝⎝␙甗᱉儓瀲ñ奐ᠥᾠર൬䕜⣧授䷈㞠哇Э㊈⇝ٙ᭨況畭䍥忕厗叨⍢ʔ㖬᷁ᵽ⠚ᵤ枃䍮硖烩卒䷒㪺䗆ↈ㽅槕燈➍䝮䍙ᝈ〱䌼姉䲇ᆧⲂᆫ㰉ᭈ簃䪭ㅗ瓹厳ඎ吹歒䚅ᒢ栈ᱜ㖣ⓔ弪惻午倊㨉捆䚼梚⧡߹汇〳䭭悱ⳤ䏂䪶㣗॥ޭ㈥排栛ᳱ㘃㐴䔦ᓺ㎛ಆ㣹剦㰉暀㚢✎搌攉ᤸ弤ᴃ唖惏傰㧜咿㧗䛡⠏㛲ஓ㺛ᅞ磶ϕ䱪㽹俇ि粅妱ܓ‑䄓⠡ཝ⎭Л于㷙䌴℉㿢懳檿ᕄø濭楞᳷掳佒㰉厇㨻亊ລ柋㌜缎レ㡵ᥟ玤㊀࠭咺㹭׀ᙝἴ糃䯬ᤖ㐌伆㍶䐒塿᩸恃ᱺ⟠恳ᩍ⭚㴇ͣก㸉䄷⚾㚘⇴䠏ᯃ㼾柗爉㞶॥垁㍹渷榻ƚ秹➮Ἧⅳ᪵摠ዲ㸢ⶓ⊱ˣ㮹ᗌ庂璤孜摫偏൞ጟ匵嘦㩥澂橽孕稃ᛨᎬ⺣㤮怹㋩琈ԁㅙ䙆Ɔ㧰ި徼矣悘ⳕ℔曶⾙㕭л縸આ䆋ٔ岂紳䥭᳛勱ଡ䲱㚑架ⅿ㍹栰嚝掠ߊ⢠匥帩產曠㪵恪仵ޠ媂瑫ᵎ๑ዠ᎗丹㾖湷楺ᡮẼ囲忪樕嫍ᢥ䀵疔㌶ᘰ楻㖃嗰坞᥊筫䣏䫗匕帘䲙㞖ཷŋ疒慱◆帧⊰盏ㄢ氕㬱ಣ秶瘠㖣✋ᦂ砃⳯壞㔌⭐ⱹ孵競㭾㷂瘍圶 Ƌ剢穕⮯⽤宁椇⦹Ƒ旋杦庪罫収⛚䍫毢⍽㚵毶喈⧌坽䮯ሻⲺ盞㴓ୟຆㄥ牦ㅿ㦁冰㠶媦淊沏懒䫺⮅䋂漬坷䈅喈丂涌嬼绫⿌⋓笁௧ⵡㄾ䲶厒Ѱ㜢⮆筪ከᛑ今㩐ʿ槕浶糸⨰ⷊ㝞娺簋噍໙˻䯰⸣㺕卷Ꭵஆ㺶ᮥ并恻䖈অ㇂䐕㭥海㫿殞䗛ឤ墒溻榎凛寬沆删˶䛻䶍ⷔ圽墦测ᘬ笛孲ෝ㇑䟷䕿֟ף囍嶒紻禎㇕ཌྷ⬾滕懭呡击嶞淺埔䒼ت榕㷘㮌䆫㊍畖曽厈ᶴ㙼對ⱛ宏ᗸ仺⮹滇㛎碇ࠠⶒ巡㟕媨ớ栢慚✚䲕湚㕽摔⎾ᷭ塎窓ᯬ㣐㋼⭳ⵇ㧽樜㱶㮃ᷩ登宖灅崸华仴沔ᏽ泚ዼހ痢瞧奚挻䕮ᗘ廪䛵湁㷆浶毸⾑乯㜁ᾝ㛋䫮ᓭ᮲汻㰽冖抉定◛㘶峌暛氏朁孃䔫㌍瀯拸ދ樄㚧壊眓乏⫗⍰ࠝ䟁卽䏗䁜㞟䎊ၡ奾挧炏䂜编筰Ὑ㟝卖忻ខ㖼徺盋਼䇾ᰦ淅㢘䉖婺䮍縂ཟ墺扛爎ᢟ⇵ݜᵿ㢘耖㮼槏㨒ู悞掛曥㟙Ǵ獤᳠牝䁖屚·䏁ྑ廁籧Ữ囑㫽台漿皯媻ฯϜ癿尾湧㇍˹戁箁㐸皊楺檎揦眨ᤡ灅ಟ漞㭛潠熃嵦噙㎞綷縌㮑桇䜎痜嬋䝱Τ粍搖窼礔搏㰚粋投ᒔ㻴❃䑤笽瑮⭾冖嘗犪ᒩ惇ᐐ㲖૬䞂⼝㣭䜯⥞夆✜亵щ癛抽ന漄懋瓉㚪潖㌪䱇ḉဖ屁橋⪼䯚⇫㵽ά沖浚往嫨了㵉炋Ⱦ撘ᨌ寣‘縝歶䷾坖㦊構版域⋜枛Ȿ㢳狮棿綀綠倖㺃㘓⺼㝈ȏⰅ玏珯卍甂О亶㳉文䮿䏛⨙㭓ⷜ簳俻䃜㞁⋗ᩤ㥋↋ࡿᢐỹ束ᱼ犳坚Ù䌋呷ᩡ㶥簷㋮濞㻺⭺䁨籆寧⛿䔑㎪丹帙礷㴗⺘ॡួ丟㝫䀮婟㮓੨佧ɺ␇簿䪖⫥ᝨ幸獳䵎燽㌖Ḗ⻏妠ච⢠ᑒ弘垲弤㧫䦮擙猍䗪〙㥥灷㉗绦埦๗㹰剣ᅛ欉ਙ⽩㼅撋广ⷚ姠堋᱘筰甖睘嶖毋盅㷥澭៍斛ਛ匪庺罭狎糛礊毒㬨搷ⲯᦓ囨焽ⵤɴᰱᵸ憑嘐溰㲭穗డ憕燠枨屺砓榗⍜℈ო㟰ʭ睰䆘省㜯㬄羕摖⒣آᠲ㜃㼊櫗Ⓦ㗹❿ᾲ簋暎哞㟀绠⻂ج䧗畋涖䬟㟕嶪硣㶏孛Ⓦ䌯⿋ᥕ淗╼旗痾ጡ崆焃䴬䏚伊縗≔桡⏭嬎㷩伲矽殏❟✜毰盓㤹柗ގྐ櫣㝎濾疝䱵甄㲒溯༤畗Ҽ⾑淵睽怏匞歖ڢ缞劭滃㴣縗嵽匬勴ួᱽ㬧倏ᬟ簂矏㭹灗ܽᄛ༇እ㙶皵扺⻟漐䞰㲇㢂憇潾ⷞ缜巵᷊綋恪竫羁泧了峄ύᘍᢣ䜸ຜ纛矯∐ࠉ䚊帊綯➌ℕ揥㟝徱㋝礶ⷜ刞㯴ἷ㴍畷橼ᤗ清ୀ嶁㣽䜇ㄮማ෧枰竃涧礿矟稀垚㽴ᄧ喾ഫ攍ᗪ߈䉛㡧巾䒛⬃佦ŝ僇䧮䣸ޯ睍㿃欯䂴㴜珨េ㱽壽䞿ᅞ䘘珤㝪平摛⅝唝渐ဎ㻀㸷䙿惛潥㸕㈹刃棋ᔓ痪传㳅琧总㕻易慺㼉樠㋿ஐ懾Ⱅ㹕犻屾ⱝ㾗㷓Ṩ㳣疗ᛟ䚝℻⼲㳀籍歿䧞䨁㗑㝘禿㲯ች供琛㟅㽅耋偿継緕ⷩổ嶃纝ᱽ寛ۺ⮿䈲缕澖絟爉㟄帢磣斗寿犛绤ཧ㺈羇宮剃ؙ埁缓繏懌䬙㰍ྡ㿉簷䟾庛羖㝐彺㯾㸏㬟矫㵽籇杆࡚㖒༒対⩏扯弖┑俥㽱绣䁟⦜嘁柌㻱緞墳⣟䅚Ԗὴ罖睗樏ટḁ㯟廍潋摯撜䌛⠀矃㱙痯夏ംԝ瞹㬛珏㌿亚吊澠翍籏惞攝䰞睍潒㩭棗盜埓䨐濘絓碷䴿ⴚ䰈俾捰㩡禋䶟㊜埡㜳㶎狌⋝ᅟⳜᠻ㺁筭濯碟缝㯺濗㳛㶏応◚簈卦癯䅁繰䏥㮝ਧ篱棟ㄞ㰅俺䞷㾗浏ㄜ㔡ဆ禇滚璿䪟⓭揹嗀利ۯ绋栎徑翪㟷侎泯栓ᖮ㎽ϊ竟Ბ琑䧲ߙ绷篍憞ঝ縄忼⛫秛昝䬝ᰗ䷭㿘秗烿涞浾嘓⧦翧篾䩟➜⼕濼南㞷矿唟ᒢ䐢㾴卷空竏刞爋㾛総緧兏绺ᘛ縩算穿ଝ㠕䨆羃紿絇羟炰㤴⡥嘯稩㍨堟怘砏睑籏祅䧝վ嚅ธ怖娣翾翎Ṑƃ⇿笏珇⾀嚃㹪ຽ羫簓ⓩ䇸缴ḷ粚秱盟拟囟ᨡ䐢䐛怯☦ࡨ̓㽆ຳ綋穰栟废☞䒜涻灀倻懫䣕Ü㢐ʸ䁯燌䮠䴞窜枙氀恍侲ἰ牻籗秐慨ޟ㤡㈝㭘䀓䴋⁋�ἼƤ綠ނ抿惀ⳡ㲡拴Ⱛ簒玏㣸䞡䄎汏౯窽球摀㬠澮礜砤ᾱᠼ⛸䂁䂶互Α犒ņ╠ⷠ䩤༣䨤䴖瘃ぇ徢㾛ƭ緼ޓ獯朩р瞡ᜢҪᰓ㔊㟧䂌ℑ廊紆堨ᇿ啠䁡☝㸛ȭ堇ࡒ澮䄜纣㰺穻玠ᴠ⸟ܾ挣‥䀗<㿤矆答䅟㱒݄田ᓠ㭼ᕡᱡ怛ි䠹翣偭繌ʹ㪘નࡃ夏ῖଢ栙Ⱚ㐴᧪羡彭Ȍ̦٠ุᇃ䦷ᾲ䒢䔤䀒䴉䁏息䞆䈚籔مᗨί墠哮㠣⊡尒శ㡌Ϗ䃜㻆㵒Ҽ㛨ሠ㛟◡朜ԥ∦㰸ῴ傕₸Ǽ͊۷獈ở徠䅾⠌廘港砻塖悌患䅰˞ן環ᬙ娟ుb៰戫簳т傞潊㋈䎚֭ᙐ㻀䓡璣㜧䄬зけ炔ᄌ∙嶨ִည橰≷篈嚡匡纍䫺湈Ú∎ࣀ͖ΌӨ㷟⍡≣匦ᠪ熎၏炛Ⴆ⇼䋯䋜潨㎰捁㐀瀤㘗搰䡕忙彳㻷ϯ祬ॵ某㶿チ戜⪧爬ⰰ呙ၶ㽀䪮岦غ眎満㼰䡁畣粦㔨䈿塇⡩傪䉴䌽㯪ࢭ欻夠嫌缝㘭ȳ塀⡫⇬εن焻渰㯰篁换瀲痂⨻䞺ᢔ着↑ᰶ稲ତး⭰墡惢熤㔣㽭桞ᢑ儑⸿簫ܚ᪸⻰䥁䡣ລବⰰⱎmހ纶ೱⰗ珌ᯨ㖧⦁◽斤ᴬ昼ᡃ㋆ݨ绽λנ䈟䢐熁䦣㚧嬪搴ࡌ䡴‱憫ʧך๗溨⊗൘䜜㥘嬪瘏瑌墄烲↓Εَବᴎ䉀䢁㳼ᅙ怫篬⺾'羓憀ŏڮ६᧘⊐緡⧣㮥ᯐ嘡㱕῁焞绷䍏ڜࣄᡸ☰笁熜᧙䬗☺桄悶ჷ繴䈠䑎௭拏峗ࠞ勽窦刨ሷ摍墄徛⇺䋛فᬐ㬨簱丢╚挨䀼䉚桸烔ᅀ≐䒆ஈᄟ䱀栁⸝禤慂ᄿҰѢᝡḨ紣ߠ瓌ጩ冰劣㝺ଯ焷㱕ѣ焔ᄽ䍐䝱ઠᡄ㫐缱ɂᒡᜬ稳ᶷ䂘伶ᆐ綃算盼ᅸ⯐咾戣婧⺄⡠ᓮ眲㍟牉䰺ۖलᅤⱨ唱⠁٤ᇀᡢ⢸ന⢙稿䁝ߡ砜℄⼰Ꮁذ䉥䲪┆䱒䑸ࣩ䔊摜䚞ڒẃࡈ尠佃力岨䔴摗⏍ᕁ䔁⎅㪐፴ᙤ㳨䫾罂䆥滦䔴䩁箮㙤凑∸剅ൿ௯Ⴍفᦨ䕦⤡ᔲ剟羨䃰ᆹ⏋ふ䇨ᜇඖ泃䕧᪬ᔸ牛恶偘凑哘扅༊ḱ壨䨎䄣瞦粪渴籇㢄㒌冣⋢䖕ਅϴ㏈屴內⪯倶偆ょヌ刁⌆䚵⟒ᢴ⬨⽱㷽奦ຫⴼ⿶呦⣮ᄴ灮䕸哨悔㿥㻱䝃෩ိ㤶喤璝塾助䍝㧮煌ᚴ㶨嵱⯃孥Ẩ紻婂ᒓ棅儱⊷䉙Q䢴⨸篮ቂ㽦劯സ籊◒缽櫐揀Ϝ痁䶴⸸䑑瓌䪒ᔡౢ婑ᒇ㱈搨掳ܩᩄ⍨囱ۃ䦫ṭ䙄䱡ࠦ䗘䟖ഷೱຂဠጇጸ柩弫ᅔ揤䗳ऒ᭗ὰὑ傂䉙▯慨穃撑䁭㓫ᒁ䙙੶ᤵ㈎吝⑥䚮ା䩒摠⣌ù⏵䓋ඤ䲌㥸罄㚃⇧ឪ㸵Ⱨ䢻㈇㣮䜨ࣺᡈ〸磑ࣃ涫ᬸ䩋汢㮗冐~䛙煋‼㐈旁⤽♤㜪匲ᙒ㒆䣀ㄾ⍋䭀眨ᨼ⼸烂箂ᅥ厮礵๏ⲟ棫冃汝䔝哋䬙孈媑⮂Ṧឃ〯撠⧖⢪煵扲䜋ยῌ㑸喱䃃殨縿ས岑䁪爞挲䘛䎧䫞ᦛ㝑㼂ᄒޯ⾎๗䞪ࢿᅙ捽秛⏨羑俠揤斪⼲幇┣縯䔐墚⟎ᥬ⚘廞㴂杺檴漼璨廉磟㹂番堪㉏於⠨嬱娂ᱧ枩Ἵ勼粖䬭燘ӷ䏻Σ氼ⴵḶ。撙㺭企♚㲃㣼焦搊䕹┞Ḝ⊽М3碙砣巤殩ɽ磶ሞ㴿䐣ພᒔԤ棄ؠ䡄ᕣ悸⚠⧁ԁ昳挪礋ᘢ⌤刑֍禠剄ཊ糤䊃呱⁈ኋ࣐䡰䴌㫠煁會ۦ㌧コ༴⥟ԆਔᎰバ䩁ៜ㐤䐑䐂၇嶬䨦ᅁ䉭㮙ল炇ၥර䠽ᴠご⢠护坁瀲先⏚䓭৺ㄠ䣃搇䇘咩匜㱆䡧免≠灣॒䏸榏旑ᕂä囀ⴳ็䝁控党᮰╸Ử䊁妫䈑ᑻ俤噘⍃壈䲪伽乊䊔䓋ኌ▐ªᰂ⼯ȶ俣䅄⬥ҳ㱙⊂ⓚ嘮䀺穗ᚌຸ᭵ᥱ᪨穆ࣃ㈧䞱塅ᎊႦ吥䖸䳁ᆂ㵨沑媃́䩭䥞汁Ⓔ䨐☄䳉ᗲフ㞩Ჳઠ礡矍Ⱘ犰⥝ृቂ䒒ђ˙ɤ瑩䚳ఛᩫ楘㊗္䨃ᐆ⠂抹ᇒⲄ峩Ҫ穯㑅৭⡉嵊燚ኒ➴䨻泸ཽᶑ㪳徚⑯₻ॅ㉫㢤䦐→Ⓖ䷙Ẓ⏘慘掲㝅乨ᨩ㙈͑撦庤̼ઊ㔥በ㴠墑㪢ᇥ≯弼祒抋擾烁➢䣠ኴ崴䈡㈢䝄牭碴㸽䡚ぁ煅ጛ珄䴀Ի嫦ㅉ爂烆➨傴祅澫擴ㄯϑ㎲䳅ᑪ⍸⨖㒳磄䉬㔸㤨ᒼ䥼Í䤣喹ᅒ㈴僉丠⋇癯ર契ઃᔄ⧬县ִᏱ㭒涳炦啪䪾啌⩷䓡⤿仉ᒔ⾓㪔Ṳ᥇൪ᤇᕍɢ哆䥪勆䒧ᎅᖊ㺖୲ᓄ嵯栻奔㉦壩䨋ኝ⚻᫄†敶㠼塅兯窹ِ᩻咯䧳ዂ㣋ਹᢊ⑄焨毘檠绳窴䵃ቪ㒡悉判䬷殊狩ݲ燤巣㊽䵖犚㔇吇械䇭ጠᵔ抉ࣂఢ▓ሯⱗ禿撼䥍卩ǵ⟭ᴿ嶈巡ዲⵇ幮㚺济唬㓱楝刳宺䤙᭗ֈۉ勃䮥ᗡ㢹尾㩾唃Ꭱكདᒪ㻴倡喲⏅ғ⺵奅咘サ樘䃭N仩ሒ䲚桀㍨䔻㵑㖣瓴ৡ剎䓨伭ፚ⨔仉㯳⿅ㅬ䪽ᕉ䐣瓆榿ቚ☧ಝᘦ⼾й㟲㕦嶪㼼㹓ᡗ瓈ᦩ抚╼侉ᴦ㎶ṉླ坄㩪咴ㇲ牮ೲ㵝⚐䣴ኬ㾔審罅烨ಶ䍈䙣倲ᦽቭ❾䵱ᬂ㻤箩彲杯ㆱ兓䚀㓞榓緮䟡䳡ᢦ≔伹ᲇ捫圱ᵟ≴䳿⧀㏪煩ᱲ⦔偩瑒組哫ᆾᱚ䱪ᔋ৴㉔摴䫳ᵺ↬冹缲䷉粲䊱ⵗ᪄᧕即䯭ኂ㺏⃑ᷲ盇୬冺䕙ٽ䴋㐈摥ਓ㋔䂘偒燇ëⰌせ橦㣪℟匤旰ำᡚ㏬纹煒ᅥ䋩䖾毠ڌ㓝䨁㊿磱倉ኊ⻗ʱ⟩庇࣭冰⭛⚙ࣆ熚㐂䵓ᓦ㼬田婃爈䫬ㆶ⭝ᡔ⃫ᥙጌ☑䫝ᷦⶬ撹ồ毄⫫紽⅓穸䴄᧽㍔┭䥓ῶ⩎ᒹ⇓₆籭禾䫲ٲ泀妉勯ᇥ䥰Ꮖ♘儉ϳ㖅ቮ⚾孁媃ᣍ⥕厶曦⁕ᢖ⍄瓹䉓垄⥮䶴ൎڂ曩㎰朘䲛ᭆ␌䨉噒傄⻭妱䍟皌ಡ槼Ꮚ斞䫓Ზ▌䳹㿓ᄆ⻮憿㭔牽攖楌䐔揝䤩Ḓ⠴曑懃嫧㝨㒻嵃暋沺奉㌺穃䨙 Ⓖ䙙籡叅⋭Ꮉ䝒ټ㓪㨗Ꮌ摓矉ც⣔怡䊓愆⍭厵❜乣᳠⧜猶撤䧫㡼穹ᒣ䴆䚫掾獃乵⭎㦹剉⒫产ᰂ⑼僙ⳳᄄ岭缲䁜婦崁姱拊昍䫃ᱮⶌ䎹⢽攄䷯嚶㝑⚉ⴖ⨜叺㫝ា⾴畉㶒ߦᕪ▴❅噩攇㦼叩朁䷗ጎ㫼彩旓ᬄ䐖殸㍁垨㳷㥑ᏽ暓伻ᄮ㓼䈁曒ਆⷭ斵浚⚞ၖ榰㉻⒋ઽᴾ⦄泙ン爇叭枵佚㴅䪙獢昌䣥ᐼⱜ埁᪓㘇珯掸⽔㷑㳌姃ኻ杣䮭ᓾ㐬擹眲帅滫䦳歋平沰㦞⋦曰䡛ᱞ㍤椙奓縇Ⅺ်ኧ䓎⅚ፂ本䥿ᒂ㧜䳙僲清⟮Ꮎ䥢⡊紒狗暘䱙᧶≬峹ồഇᇬұ䂼穻䒾㥬獗╆ඓᵎ㶼弙䔼Ø⛭熹兎纙Ქ禠摲仿៶Ⓖ砥㈒আ䇬᮵獍䩴ˏ奁Ꮧ暡䮟枾∢娥㌓倴嶩㶷幤⣬勮撜䱀嵮≜䨙✲䐅泪䁵孛ゞ崐ᐅ搥䣣ᢡ㢢猥㺲⠵⻪Ӈ奜Ű糘楔晧ྵᘞ㘧㼙㒽߇硈德杇䅴䋀祿ዚ䋋矗ᗎ⇜憹r籢怆γÂ㺃ֿ̜ዴᙝ㠗䴮㿼淩̪ˇ懩便捍ᡚˁ秠ୋ斀ⷀ堈㺢棹ᴪࠅ翨ධÎ慱ʺ皎એ撘⫐喾㐬琉䈒ᰄ潭纸彂ખˎ৺ૡ月⨨厪㌴油㢫ȳ䡼卟扠᳭ᨉᔀⶠ刎⦢吹ᒲ缄レᑸ࣌ᆀʨׯ只ᙤ⽃ᯆ⸢对浳勅⩌⑶⣀⺐ᔓמዘ支䤈偆ぢ䉉䋲⇆䑉羳ይⓎᦹ㈱摉䬀勺⃰ቊ寢䐇♋䀫ᣋ⒱兢చᒞ䦐幁㪜䋥▫攄癌羦⺞ⴖ姂獍❑䥘嶱⩂䓱㪫ἇᵯᱸ歜湨⓯⤽㐘⍁䢇ᨁ㼜庮劳崆䯭皻棞䪂撶秿狎㧻㎘埒㠂濩殐㔄⅍綶翩僅ႃĀဢ▜⭅Ꮂ⸲檀Ѫ䢴矩ࡰ凤ॹ㮄ᨈ䭐㨹ˤ崮ゲ眀䑫䰊绯箸⣂ƕዌ䗵ખ搻䯨寁⺲塩⊫ⶆ㉯傅睁垩䋥Թ✒⣰僩㋌䌥⸵Ⅼボㅴ೩▆某⥙ᯡ⑂䋅⇜ȵ忮紲Ő糡䖘䩻榛䵴啁⣢䷙丫昵怑䉱䃃ẚ́╃㊹❒⼴嚩㋲嘥奒暴㹍綷ᵒ窙⊻ղሇ╴⢐尔⧢淅㤓皷空棒ঊᴓ槁䪱敲⧗᳖♜ᔥ士ᄅᳯ⩼Ń繻Ს䗘䩌窢⯫㶲䧩峫┶ᩍ㩱⣌冑㌋┡䮃昀⸬吚⣒羥⼪柆ï⪳Ӛ湱ኪ┭厢ᚲ侨⛲㗒剅炫ᣅ絊ଳཏ㩰㋍䗤琁ᜲ⟹⥘睉≒㶶❍瞵情傕籪ఋ晛䧍ᘸᦒ檬羫㤇午汶ᓔ㥨拥㥻䫙❇䣼劙㠌则ࣂᶵ哬㾹彊挴猌┹䯬箆烏敒▜崙㘫ᅈὈノ暇包╒䫣ᕞ厑㽂者恊䚵穩u惟湰Ფ攼䪡架⮗᱙⫒戅ᳫㄅ獊ฏ筏店勫楗䪪暖䤬徥㹂汉㱣烄Ŏࡼ糗垫ᒵ⥽㌐圿䴜币㉒䤵撪墇敋桰毫⡉ሤᕇᏘ坌ⲅ⫑⿂簉ᅒ㑇働⡵拉䥌䴟㨜⫽侑ᓎ⯲箥Ջ挄䃍ॹ▕紇祪珅ᑏ䵷ᬥ⌬沵婫ٵ᥀獇५犻溝糁┹⺴垆㙪猙߫掵孏厲彙敩ጄᕣ䨩旁⸟Ἑ⧪䙅৫⥅位䚶狀ᕫ䫙⮕朹Ɫ唵㏪䆙恪妷煈慸佋ք㳽㧵獦⟙Ⳅ儡⹔噵炳ɴ燬橵⋔ս勭ᗉ㌖★⺰妵ⱊ噅咫㶆磈㘈筌文紊ᗘͫ◌䵓ᣵ⠌吵લஅ㡌呺㙈㹠櫷秔叨✎⫴内⚪狉❳ඵdz౼棖妁抢աᗄၺ⪰䏡൪渥⌓喵帩嫔䥾櫏⨗䮯晉Ⱒ喙☔䙹曊箷哌汻狘疔ⴛ椹㎄枽⿲庁㪄絙ඳ᭶牉㫃庘㊺㡱㊃ᘔ䨗ῇ叒摌⡲㝉♺ㅑ牤櫶嘊Ж斮⣣㔒儵ի䔥⥭箷⫅ኁⲧ㧥㋁┃⬚崱Ⱚ䭅披繅⍰⣜䶅狝䧂岒図⸵朵⠲仅䓊窴槫卽ᓎ᪈坴Է⭣摖༯ቡ㞺兕殫╶绎務楰媾㔠⫡嗢⏱ᚉ㈪单浫ᦶ彎奰瓉具犥㗱䬫៊䳊剹㩴廕▋፵嫎ຽὙ突媥嗚檊噲ⴠ坵互牅磃⢵์᭵㫎൩⪿嗣ૹ⑻⬜専㋊渵嗳ៅ痊⥱㵘繫媽敥⯶ᓽ⡜噍⤔悕殊䅶⧏㩺ໞᵰ᪳䧦㎘唭癓ᒍ㸺曱䒋窵剋һ㕫禋ኻ愶㍾ᘅ佔冽➲妅型䕵⏉፳嫘慹㌉ᕖ玻ᐹ⤄媦㩊䧩伋姷巉祹盂▆啣歠擖俘䶾ㆼ⧤⥩㷷母୰ể牸竉疛େ堌ₘ䕑☜查䞊嶴䯬⭻⻒ᵶ櫑Ց檓晋ⶳᲝ㭺箕લ䇶Ë妶൫䳶㦎殇咛⻬幡㯺猵堊⧶䃪⬡Û絬窣畣咜丞孆⥸ཕᦪ⃫ܶ䀎ǍP媪᧯檲呚⺡官㩲吭䖪ၔ⋋㖽楋嶝ⲡ䧕Ꮳ嗆Ⲟ思㝲尅䈋ễ㽷⭓撫痵欋ᚏⰊᷩㇲ忥㰊ⴆ懋坴⇕䵩ۮ啬ᰞ坎佀国〒䘹享埵҉瑲懊⺕檮්氌Ѫ⺭ᱽ㑦孥๊ⷅ⿍䭼䍙⍪㫫䕕旯Ⱑ婚⸚䎅؊盷䥍啱㻈㟍沱഼䪺堀梞廣㰊羕崻ᱶ竫女㝏喛⋇䘗ଫ⡠⩕ሃ⼦碭㖪≵⒊女ᇆ婹ۧ䖇杰殑嚑☬坥眺ゅ翋壽嫌啩Ჾ畨ூ㟑⽎塝ズ瘭̊㞥䰭൵嵂ᵠ⛤䶧氇哊ⷩ匠ʺ呅ⲻ哴り୳䧞卢✂㕚ᨰ㙰沉勽⎲毵๊皆仍⣵Շ╾笂䷭ᰀ㗓⽀免㹦彩⺻ᥗ㢎㱿擊䎞✒ᖔ另囸渹徃㗆穕措༴竏䳺仆犀檫ൿዤ㐴澟ᎃ㾚䥭;歖䵱᧐玂䜉䴳ᒈⶩ婑㈆哅䆻侇于ჶ囈熌勴㗵㛜殴従┬䞭㦻᭕کⱸ⫀䍪暱㕃㒌浃ᷓ㰶岵敊䙖ㅎ敼໙纍笃䴺䯁㖼浹咳♚䌙紺㎶曪拹绋䅵狷ᔹᕔ㙒ⴴ僽㥆啍㐒᥊淊秂䪍䬗七玁㗌洹咑㛪婭㡃緉ݿ⇏㮯䋿畼嫔ᔒ汅噳㙚桪嵊ᛌ㣰⋏අᬟ㧃狅㔄⡅婳⇦䛍剋䏶罈煷㽞喀ળᬜ㜩⤙友⌆彍䢂憵䦾㗇皍嫵ⷪ௷ᔼ嶃ⶦ繍㫖⺍碴拀换᳃ⷠ嫿箯⣔儻⧆忍孻烖益䛹ᛜ㵨圙槝ᮏវ⹂劕㕪浍ᅫ丷⏋䫴仁疟甙祪嫅噲滫Ṏ⡷㽈࿋⍄独囱旫拘ො嬃㗅䲚偻䎺珵狺淕殍䉱佒Ϳ㜌浖䭋ᛪ梑匉♬曕㻻⏷檏䱸槁孶䛆▐寞㚮伹兣㦖檵䝋䠄旋⛴盕ᙪ糿◾娫┬榭嘓㡆䡵ߪ垎繹巘ս⛭敱㡩➎滾図⼖䬅堻㔴媋嫸燅箕佫渞珟㗹瘥兾⌄怵⁚ɶ፲ॹ⋗歳㚱涷᭠睏Ⲹ庁⓶寍㗫磴牪⇰㗐㭥㋴ᕐ㭟㟁殂幮⼮䱉忓㟆⃩ᇹ䏅֗䪼ᶑ嫨睪⥃宍㵚怵撳暅徎棸巔筢疢孙ᖷ⩦奓⌒垕翔夈淉㭴ುᵨ媤盻Ⳏ壧㴼䶕ϻ緇▎䇿痓算⋚ඁᩉ椂底㳦彭篊乕枋勻䷁䭬㪽᷽⭙哏䶑巳⛼䪭䟻惶ߎ拸姌㕱✋ⷧ存㖩瀗ቫ㡊祭㑻ŷऋѴ哏➈⌉⦊䪑㛆ⵙ咛㥮沍ㅛ俆塌廻ⅷ̞禰㎲瞱欒嫾㩎笽ପ䀷操網浝㖉咲媊ᬮ圩濅创⹖繽嗋劶⬈浿⏚䵷䚰䧹ᯃ㕥楝嫬䶴卽⹛Ӷ䃮ㆱ䗐կ⼜嘀㫁㑥涓勷㷮噽绛攄✌ᡧ修$樬ᦋ䯫፬ݗⱃ˽㓛煴姎䣻汲㠬溵崦ö皪⇻峒侎䋽㕨ᄪ∂㮭㝭ㄣℇ㬀ɽ格�ヮ亍䃫⊕䣖炡㯊睻⩻巄吾矀՛僕Ў緽毙⨢殲Ϸ篔ྚ漆㕊檢㞍漧刯㰎籝ǡℕ伍緳拦睲ẩ㦶孀癥澝囧⸾巽㿛ख熉㺣䡡㝯ṁ急᭪ࣇ圼䂎堊屻䎗㦍寎ⳝ橩⺔笟厳椇嵸ả൝₵揚࣊⭎柊墓滁淸㩴甖砇啸㚦㓝䀹ഫ㨊㨣悹ኊ㶪稤ニ桹嗌㲀九ᇚ礕弊ᦎ埙⾂偵㵂梭畒ॄ㝝緡䅡秈皼៓䢁㝛㷅㮬瞵榟㛾叵卌㜔罁✍㟝侊碕ᚊ笣畉㖗嬗⪮䟝ᮚ戗☵߾勠έ弁婤㶅堓橯堢㬾狭⡛笖␈㽊俜㛇うṞ篹症桡`㺼㣉爵崗䰏䲶់ޅ㵱篹睷浝ᢘⳞ缬䰓籃税⟷㏑7㼔綁㪁嘾毷嫧孝➛ؔ毓矺侅Ք盤㸙盯槅ᔇテ幍岚␔琌᯾柑㽷ọ綱䇖硋澇僔婺⭢溚䠕桀⧴⭻件㷹९疔揕楟⼞爝Ԛכᣯ⾲俛佻纭椣簏唚歿則⎞夝堚商㕬㿾柋羕犛楫㫥㘎㛌૨ڎ碝懺ท͒䁐䂏൜Ƥ楅ऀ്殬ີ妝䡽滕恗俷õѡ⁝⤰౫泫凖唡瓰◍搬࠼岇ₕ堾ƪЎᦌ₰῀㟻䣯Æ⸧Ⱞ洒偟⿆䄕ⲞϘܤ࿀᧠㳈ޡ䘚ⰦⰮ瀾矴☸䈉͉㑏知䫟勯㘾梣礧⨭狵㺂傉㖫Ϛڶ寬╄৶䇺影䌦⯴ⰼ瘯⟂粤䛢盰ᣠ㫠糡䭺Ԋㆀ氼硙れ㳇ჯ碳攢ೀ嚋嶿㤡澂࣠ℯ㰿榥ࢁ畝·櫓ಾ堹爦䃑䡡䙽四瞊刻䲌筻ᄍܲ䐮ƙ癉⇌⡰懡ᵞ甧宄弊⁒ႅ┳B䏭嶈㊴᭲久ແ䜰氍㵱ⰻ漊⢀寝Ҷ怮݂ᰘ渿倠扁畸溧洭稻㕦ᢗ儁㐥⢃ߟ❀掸㋂㵁䉵ᰚℂᘼⒹᢕ僡㞙䍞瀴⋣ᓺ某扰塣瘚⌭棴᱓࢝巙憤磿択槷倆囋Ḥ淣斧ᮗ㐼䚨碌ᡔ猘笏ْ㒪Ўᤸ௨煑䝃䉨剂揳翕䍰缆㸁ڊಣ䛪ᰨ毨己缭⊬┵吨䲐磧ᇈ䞾ೣ武ፑ䔱槹囂碭熬〪㸢䩥⺔煭永²᪨٨樾狕䭊㢯剔┼⒘何ᇈ屒掹າᮄ㙼⥄孃欃॥ྦྷ猱⢎䅥ຬ䏎ܹ๙࠴㍌㉱睃粂߫䤺ࠊ㟖彨况䏏ځནழ㐌㺸涪ឫ㼮Ჭڀ㚼䤞凌␔䞈嗊㌠ñ曃ག䚬改书䒖ⶖ⣛⏦䛆噚仚ቬ⮠㹃攃溮㠣䎲椻ᒊ�⌡䞉༻⡦咎㿱曾ɧ̹䩓攤౿ᇧᇑ䙀Ʊ喈㍞耝㋛礗䔸礸䲓焎㕤兙䜑䜢Ạǒ⃗⪹┦ᱱ縿ឬಧ䡉㈇⍆欱团᯿嵸挠㭶嘂䶬䬽㙓ᒃ䤙ሎ握䚓嗯ଳᶴ㟑䉃གྷ嶭㬺犪᪳䃀ᇱ挳䞼偢桊叏ⵑ僣೧␗⚪㉛䂵冨冐ɮᦀ⬨潟ዲ槧⦆༻噚ಕ爅烋捯೪ᱰ㛋⒦ᅱ缛䰔事翼岍澆㇕掮≇疚ᬜポٱ缀䢙䃰䡣ਣࢪ䡂椘挾∠倂Ǵϡᑰ⠳灇䜯ؾ䉖璂⣷炈Ꮰ✀䱍෪ᅸ甩怳ᡆズቑ岐⠴ₔ磠㨽࿎᷼㝘璩什ᇋ侮ᨍ㹙҄焒ਘ燻䞨伃捂㯣㱅┳噡呮㢽✰ᐦè㣤儧禰㕊Ὣ勈憱栃གྷ≭㢿ᔸ牖⓾ᣜ刼∈ྲṲ㤵ᅪ∳ᗧ/Ⓔ⒴ィⓣ∂爜䠔仉ᦴ㔆凰❣㷬❧揄橦㲗ᵸㆣ兖♎咒ㆄ漸搠塹⮷渹仮ಓ擽䦡挧玜䱝↶ሄ硉䳃⋧䶯渉⎳䊑㲛ㆺ搞☰春㱸繉圃₴煯縌勲彗䳍䖃ô宯攅 濑徕ᵆ㍵侈ᕒ惨哿ᴌ卵⠎䬝丑ᨴ或禃㸺䜵᪺⿲䲂䕲燆፨❒⮊㵸ᡉ狙Ⴓ浮⽉⾹ᒇᖘ槾⍺⟿໎Ὂ㯛−䓳୭㤽ᣰ毣䤋ᇎㅡ㪜璍ᧄ㍔扞槣秇๖皾䵑槄物標ㆢᩙᚂᢉ厔羉畣㻆䝬擌穚◑掆ᇻ㕹栮㫩棩ᨔ簞紳烛౭ᔊ䉘窟Ļᓿ区㮏傹ℏ岎㷦䑭缡ዙ檾ᕞ旜ஜ᧢吕♪䵟⮺㨬摆侭҇⪾൞ৗ;᧼厃⚼咚Ὺ〶⊹䙓䂺剭ᵴ璙䮈㪪㎕㫏ౕ棩廖僃䜫䪬帻卝䚈熇ᦨ㍢朊㗃ᩦん⢏ᣓӇ⊆ᯉ宵ᚇ善姤㏛ᨺ祉䪰攴戜窍Ὓ⫭ɟ窐㾂仭Ϡ曥ပ㻲焕涆师梋碶暁啭妢曤哧⯓ᑌ椶䣓㗆䷻墿牴ᯧ㤏৭搗⟈ಣỷ㟹弃戋⇭朸㕒॑䴒᧦㌡枤ധ፺⹙圽❧㛶㵩ፐ⚙೦㨙㐑来໌ᠶギ❙勓䊆Ễ㲌束⪃㭠ⳘႰ禾㯋ᥤ唛↉梕ᬇ䔒ڼ㭑勔杻䪶玕暊䵙⼎㛼滊棳ś攙粹卒炀崐㨒գ枼㘔䴺㝳⢙喕ሆ䍭玼䥚㒐崃䜉率⚦积Ỗ㔤栩氳硇֖ᬨ䍶䊟㳡ᐓ䜦癎ᦓ叴筩懳瘆皅瞿慙䊂糾㌂䇇枿丿ᵮ僷䣱焓怆⯭离⽙ẛ䎟秓卟晍ඳṟᬌ澢䬙垆OㄺÔ亂哩燖㏫⛀⳾ᤖ㺄盩䍭ⰷ紮≭毻㺖㓹⦧獖玐⼯⭁㝵⽊䖓熇孭⃪僛亜ⓦ溤௳⩨⸔俁㉼暙昕礋呍⎸撻沙ഐ燦௰穭帡ギ㢑圽㯮礻孔媈⋽ᆷ␍⬯♟ᵚ㎓⌺旳๊ח涺Ṙˋ⋼ؙୁ䠌俠⿂倽㴥樫拻♌偸㭕⺃侎ぜ₫剺俉乡㮂揀煜眇㝵斏ᵷ宵拫㼏ᵷ媂䛽濑㸜枥焓ط峯絍獜憕棸䗈᧙曠ⴐ峁㚌杹塍䮇㘈౿癘䪙፭竄䰜瓴ⶡ佖㮍㕅經⸋皗᷉擖䦜ጀ狆ୂែⵀ塧ᑲ戹䍫㪻偌▻⑺䆝ጉ⨛獑ᜉី姙妽⌥呭ੳ㿯ᆿ网榓ָ䯞፠ⴛ⤩ᎈ揹䲓嚷楻⦿䃓⦉⌔糯ᷫᛗ䳋ᦆ㈌標䘳〆ൕ癸⊌㳭囤猽⪜甼彞イ殅憎㱇筎ࢽ㋿㒇影猕纻㍊⾹⣩㍌祆澩㯆岗庺敔狅㝪㐉ⶡⴶ瞑㞻⇦䍓灶皓ị㥻֚ഋ斫叇Ⓜ嵙㶟㕱笓弳棏╉拙⒅䣹ሌ㔹➪ⱐ框剪爵䦽㥺⻬⥻㭑▎喟֣下☩⸝ᴊ㓓✙偓晇杏ᑸ憱ᆏዴ䗋吇♹⾛ẅ㉨犵篝ⳛ缅祽绳㝀⫧૿枱䶤壯凪烹坋掆䝬ᕸ烕揊ⴜ秈㍂坁侱ⅹ㣂瓺漽Ꮃ惬ᖸ㘎ڎ即倪ိ忕ㆪ歡罓溶㚗⬢㫙憈㟃嗢ₕ⫨㒤寖䀊祵塃✦ピ嵼⃑㦄ᦰ䮼ᛈ㛃᩶㳲皵挓ࣆ▯䕸織窆湪㗴卾垴柲峡㮬煵拫ᱍ䙽卑ඇ䫧㪢毺圚ⷦ塩㣙㩙䟋ᴷ㑎緌㛖䶋ഄ斦殖噙㫇ᶍ㡜罵焓୷䛏欺᮸懐㬜☋⯶柱ⷻᷥ㩺粙噋㝶絆煿䓒䖁䫷威猱栝仮孙㇊疥䕩䥧筛㛟㫱禡㘂ᛷ彜㽱⛔䨋ࢇ㟎淊峒纜Ԓ᧧欧ᝏⴸ廝㒑㘕䧫㱷㳄㾸㳚纎厑㨜㐈朷伡嵆㴊棹䔓㪷๗䃸ፓ䶜㗡⭣㱆乏᮱㈒旊杫ᙆわ緪ⵛ㦚⤕妥䯔ᚏ坌嫽㦪痵主⧭牻❟ⶃኊฏ匴台泊嵿團愉瘻䣶ӆ呼廵掃⌐ᛃ⥮❱搳㤦絵琻乖伴䓽给㕐⛽⪻厖朎䶱弭㩂犭彩㾶祌ż䥄✀㗉᭪㛀濮嵳ㅲⲥ前Ҏ孾ན疍嫤旃ᛛ᩹㾆濵禓䋷䒌ル䇞䚝章⧌䰎㙼潶妵㟲⏭平穚䧎╕ⲕᬈ䷾卛噛ⲓ᷅㵆抴嚋䳇͎紋㙰ඌְᯥ⛜溄妮對㮥屫ᦶ᥆㋽ፗ⧘㌂旱䬸㝄㗮壃㤺翼瓫Ö❅晽ⶎ⺉⚆歶對Ꮜ涔嵣⇶潄湖廗繠緢䂎㎮ᶳじ癛壀欭幉⾤歋沓埮壼პ掛䫬䵉寙ᒆ涭暫ⓜ⒍䛻䰃䚓䌇ເ磠眛㕈宗晘濾儾๚呲㦼⧴┰က焧罤罀槀٣㬡䷊庫㹆氡ϻ⒕晃滿狂䉼©㔡♰Ի⦕彛㭲ွ枭氹ᄌ礏䢣ⷮу渊ጞ爑䳝塻㓯㎵䟻䍗厣ᇸ⏓箅̮ᷧ㫿甅䚍㊓⧬㮝ᢻⲖ憊䧾䬻䢘伕昲Ꭸ瞶旞䨮䑝ൻ狷䢫᧹䂄极伊奣欋㚻8憽⏖災啖㋶⪎♆ᮔ⼆⍉㬢矄笾唻㩪澗⋛籁攎ㇽ嗟㵭恬巊峺矄笻敂㰹Ჩ依Ζ忤嬣ǰ柙᪣榸学秗ᨻ彗㛵ᓽ凛Ԍ܍ᴢ杭ℨ⓺ᕷ㯣様灻娋ⷚ琍暀澗漌ത㯗㞍漏巧⣋䅟�∗㈎礦㒛外∍緻πྒ伆つ笱砃汳⑸咾牝䖢ᤖፊ؏幟匱ự㸕㮇㙶淢䑏っс⺛猖ી 區暏㖾ᮮ⼼桙粓⫥㟚ᒹ弎扦惨ᠽ/孷߅䢄ᘓ淙堠䩣Ꮱ✨㻲㳷䑌䀧瀗徍兖碯ⴛ姗ं䟸搫Ω烄綬䃳矞၏广㰂纝掀瘖甀ణ⼬垌檞ၫ笻眞妯夢⯞瓠㼛ថ㠍柸管㾉翞၌ℐB曈漟㰞睹潈丗ണ䟸攥ᾛଠН㬏睱敠㹫㋲ɐ㨠㮦༖戹弬䲘⠨ϛႯ癀᷏በ罺伣穲癡佋㞩ᵌ祴畆Ѝ箓䒿淠Ɵ㨱ᒣ憆ƕ琿桒Ⴍ㺬䈡ംṌཨ⇸焿㾞殝堧捠㠽嘻嫚愛䈈剮ߪ䂼㠴᱉Ð穣惌☕⮡䮃䘪僳Ղ拰Ёʹὣᢢ૰姰֛∷嶌寡梙枧⇮ᱠ璂⥕᪸㽟噢㪣洧䤨ᘼطㄝ㧞၅沀篻洓䞏㤧ྮ懠᪡堠ड∹㻆瘸Íᔽŷᒖஒߦ㎧Ṙ嗒┢ʲ焜椴⎽⌴ڟ䓁汇ൖ儼ᝀℾ侧⥎ओ扜↔䞺̇�ᙈ烿亐դ砧㨛䩛〩⤍⹆␀䞳䂒ἩᏨ磂Ã畧䪮䔾埁咕姥㢛⏺ኗ婀ͬ凌⁑縸撌弮ɠ㾢⩉䔫ಋ猱䞮兗̦瀴惑猙磧␠ਣ⫦ⲓᪧ⮩≰\"䶖Ḙ播࿑皦⠠Ბ洫㶩瀶㤌ޅ႙ސĴὊٰ矡玎ᡠ䣡毠㲠Ⱝ䖲爜ٯ䜪刘㘘窕ጣ᮰曠㤼岦⠭粪ే䡨椟ྈ㐐䈘簑曑㘠羮晲Ř無伾⡈ᐐ✢⅁Უ䑤盵ᜳ䋈 ⓨᢩ᷋䅤簩紳䰠の珐Ҥ慢└⤱Ꭵ⠠%䡓ᥝኚ䞨৺Ꮈ8俉ᱨ斄穉ᦳ簘挖䐯棧㑤㌭楚眺眍थἳ掸屧䋂ೇŋ押ᕜ㯔㸥怤᭳殊奮䖪㡡涤瘻ଢᒩ᮷ⴤⷾ永栫墟ᡭᴺ㨥䦉泳嫄曕∌ՕȀ儡槡掰㡮乨⇩Ა乿⏳揈ダ㖩䊥ᵫ㖓‼#瀠ⵯ䇸畑䀴۴Ⰶ䃁ࢃႃ䖤㑨᧨㎯㌇㡃ẁ⃫ଙ夬烑㋵䣧᪙യᨌቜ杢⑱䨐ᡲ䐀㤳䌺籠㛓͂啑ᆢ幉㐓攅井໎ݏܤ秨㎇ԗⷯ孙㤠♭⸩ሱ炐ƴʜ㹫࣌䆠熸䣪洉ᤔ䑮杙盻΅㡆◆焾䄠ƽ䳃箬熷姹≔果ຳẦ㷖ሴᄈ☴෯冼毗ẘ甸⁔䰺扗伱惠ރ䘠ᢓ用㲸ᱡᮃ抪₴㨘渪⃡亯Ệ㿲থἓ汄篮ી潝府⏼ף珅ㇺ↗ᷴ⟼稡爓焔䦓彟ຟ㴯杏琄极乯ᲆȢ籆ᕬ⡎ી#Ⴑ㹡䙥焼㦘㱃㽘梕ᐷ桝炕㌑䅐剱㶤䥥璫䔷⩎ဠ棘憟‰刣ஸl扦㳬綫揈 㺲⾰㍩㼂篥溫䂷䙏䱽幙㠭⬮☌ᜪ傄尪ㇲ窕᪫洷㈗瑿ᓙঝ䔂举䯺⿔屡㶶奅畬ل畏Ѿ当妛䬸☡汹㕙ー怆㤧ਅ殌Ⰶ彎㬊䰩揄ଛ⧽崰埓璢届䇀ૠۑ㑷潎ᔁ拝䉧ଏ䍂ጃ㮮ᜃ㯂㯪ፋ囼㗱瞠嬢樤Ԍఢ硭拉⽝Პፊ祎ᄢ⳦࠱Ἄ倮喒氶嘂᰼埀弣≊痤Ӌ䢒ۏ䞎硳欉嘅帼埖禦怖㭊竵惋䝷痠ᑪ䛞惬ᬐ䇮ᵳᓑᢙ棹▜撷ৣ䓀䌮ᤖ㛟也熫湤㵛⸳挷ϊ焐攋籷変松Ꮗᶚ侶Ừ緹㘑椎巭塍䌋Ŗᅰ⸀㥽湙㆑᪱瘕ź灊䋤亘⥀ຘ㖫Ǟ٫檭ӳ晷坿屲Ԛ琵簓綒䣡ᄑ岡Ьᄋ䈞䢛㘮䀯炎⒭भ琻䱗塨䓿⇟䏤܊汖䡪פ㳑ų㨃䍿㉖ឌ䜣惠㻛ᖟ܅ผ偔㝟恉ʃ㥭ᅁ朻啀㲎幆য়厔煔⤽ᯮ⨌㗿抒䱅ኜᔋ䴌䀨狽穃Ƕ朐㧧ᯑ篅奬߂愽ⅈބ㤅絢⍢⮜㸥⸃巹㟆漍䞗䎊ⲡ穉焘ᮎᇟ㎜䜌㼓ᰂ洏憛㆝㽥䴵౧曈⧀㮖リ㤊緭毫⼺ᰛᯕ⛠䮺⭢俠庿䟋璕熞၅呜ɳ岽⍒䢙敓碇絀❃⦴ᴹᴎ姭䡟䤖Ωᷠ䩈ᕸἷ⊠ 䡠ҧ什ධᴂ䱈䠱ᛁ╎伖町匣Ċ㥌䴵濤焼ᚗᱎᆽ珟ຘ⼚㨑㯔濛w㫎縙曛綗䜏䷼洅㞐Ἂ畜ᄕ睽温ం܌捹徜帏煖㏞嘧紛Ḏ௵eί㹌㑽攄݀娎䦯柛࿘弁帙㮵睨磷尸Ͼ缣छ俣篽䵃➝缐ᱹ剠柇濐弾㴾牽罛疇小濛ភἘ刿Ϸ矫渭ˏ㢺䀣琧瀗ဿ⊡ⵆ瞞妨ᓆ㳁Ᵽ湀䀞㧮碔ಛ标৯灞䪤℘缒巪߰ވ岀紞疣撧䭰孭宠媧῞妨Б䃎ྫྷà㲿㫢煣挛唗Ⰿぞ條嚐䈄巣簒睯澸㷹ց瓽綧盼『ɞ炞椞㾕Ⴗ䦴ܼ焓礸́繃紛琯樎㉜⟟儐刉В䠊睩䚷巐禎秣磧忭堮湞ᵦ⨥䐱䀸模⛾ᾜ㹿᳠瘕ʰྯ断㪿⥠Ԟਚ剈侞ẘڪ֩稳灇帛榣ⷾኙ൬䨚縬侑Ṹदᢘ歗剖は⃘ᆯ䈮䙟㉀吗ᣀ搄ẍ⎬♳焐䍯[┰应檅㶵ᐏ杶眽ỗ炔纽⊭ᖈ疑᧵͞檛┑᪱㪨栌㇣ẖ䞥Ⲙ桅ⷱ㍈╝䴼⼻㩉䱰ᆧ凖ᇽ؎礠ᴃ焾涾瀢皚㬳愌㐆橣俧῝䘽演珓暜ữԍ㐎⺘⮔粱珽枳促Ớ㱭▙磞ἇ䉔䐖佟⽂棤䲫⠠͠忕ʢ礙熓匪⩢恿ო厇̒؍珵富ΰ㦱㽜耜䚫标篯▾畟㇇爥䘞⡏柵搠廬ᨺ㬺ѵᑰ␐捯擞䔤匝☔琇柭否佭ᷲ穠烫瑲歡瓞ᑱᑩ䲥がₛὛDZ搎瘎絈ŀ䅿䋞䖜甝㕟៩⾼¥㵆ℵ穼峻䃏╿勝喙䮑嘟伤基糥ἑ㷚⟵眪瘓ˏ䂎糜䶘窰⬔Ḡ厓⾶劍㽆⠨䳓簢ᗏ䯙ໟ喜⬞瘘ൈ㰽⽾廨桡儁ឋ混䂏ᰳ㣝亟挟㘚氀㞡ᣃ㾚翡ᦋ捷灚̡牂㫳䴗ᔍ氀穔濽䂢㴺繖疻旐ຏ㖾曞✜〽ᯫƘ濴ြⲷ墔䜋曗泏䳽ᡳ⮚䀬㾆ᙋ㠈㐑帣㸊繭珻熷峏䷉川粝੬Ḋ寻埍ⓘ殥Ზ碽稘䘧糾℃掜伙瘉ܰ╙澮刃㵭絛罬ᜏᣡ佽抄⼚瘙ᰖ矵漹ዯ㸚筽筑㣁暏擾㟟䨺ᩂ瘎癜㞧潵ᬗ㷚箝礊Ӹ媀犝ᶈ斘ઃ縂ᑶ埃䐁庹䀂稣砛畷凣娹ႜ䄟傋䅑ཤἶ䎽㼾篛ʧ猃≏濿矆⫆ህ帴䨠砆漳⠨簵┴䩧澈寂宇䒛ዂ㜕㷳Սྪ㑷䘩兠ô䪯̷䱸曡Ⲟ䷲ᳱ猹篳硎ᾌ䀖玵㹱ࡇ枯巭疰⑃勗㈐侊⠘俐Ḝ㽅Ƒ纳籇摁Ჿᥞી䌧䙥吢Ⴕ網婺㻓ጉ篃级匪ƿ浠䚞慃ᨓ吆簮ྯ᳨ᣗ䇹穃罧撯䕀䝟撞崛甒ᝠ砶ဿ帀澨磣ȓ琯㣯嗾䱈ƞ紙睻栘⾽㩱㼭ȁ綶嘷湏猭㑞ᇜ秵䘘␖㻚呾㼀䂊⎼懙摿峞ᑋ偛爨吖哗侲弴畊者禫箷燯眑潞溝䄜༟䘀価㩭㽜绸䀫祓Ⴣ⍿峞綜⩺㼞䐉籏⾵䲥縭碻籎囤ƿΈⅼ欷丞ଅ堑哫㼼ٹ磩烗燠俧㗯㋷〤溙ඨ樧Ꮌ䞜⸻ῡ㽬ஈ៨δ⣯ᢢᒞℑᆰ知琐䇯㼽∽翻珿␏滈䚉➝侦纑㰍䈕ࢋ怖憎緅䀬焗继梷ᰠ垾慆縞簍矿揤䀄ᤞ縖䏢泴ހ瞝䶣夔戉砒Ᾰ➏㼁ợ硤缯燂⩟珞ᤝ⼞㣭䠜ဎ周䀘翁繂㶧穉ֿ沇ከ縂㼟▓㪾⠱濃≇㽱ᶽ砧絯砿浟ゟ俣漛搜缂㔷ᾷ徧䌅翬㦿੯碯纞IJ؟ኖ䠀䯼ᥬ䀂耜䏳窷磣晿更㖟猟揳ᰕྌ䡂御☫焙紝繛秺䣟嶞㔜漘ᰙ᠗ထ徵྄槍罋罗罦䰠ພ溩縜⾢堁痸㿞䀊翲ᅛ稷耗沝恟㶟漞ᶥ㐘栄瀞ៀ翌耞嵧縯爿狦ᚬ绽㕿К⪬瓰怕㞂网绪捛籯穏惠ᙟঞᄟ☙簜Ⲽ怜䑆℡丱㾞➏羏瀷瞟䬟崝殟桦瀀㿣御㾑绕絳綗癏敟䁰✟弟歙ထ瀓忡䇅翱繿䏨硟瞗嶬⸞搜㘘候攊㿾珗㿀繝翯穱瓯昷弟ⱞ䘣琟炯刂`㻧罵缚惷簀璿生嵟Ⲡ䐒耀ῧ惫㿾翯⨠䱻㿵ᇯ䴬_㿶堽翴dz翦㿬翵ῡ俹忢⌳帥㿲㽪T帬\\[擰ⲧZZ忾Ώ^忿⿵ῷ翪ԽC\\ၦ䁃㿻ᆭͻ䀷P揦抩䁄忡帮N搴䁁忼翥A㿺峣䁈ଽ䁄H⁉翧俪㈼⁕翹㘫䁝㿬䁖㿰濫濲翣`猴⁖䁐硺⁁䁋㏯㔿濱㝻㔼䁍翸䁘翲矱[翲䁊翢㔭㔨恛睯⁎恐愰恝㿠恒濢俴恅濤翢恑忪恍⁖愡恅恗㔹恏ῧ⁛䲲ᠦ濲彳䀦濥恖忡⁗䁙H濵⁅忤ะ䔺ၖ⽼ၟ⁚潪ၙ䁎淺䨭ၗၘ恖⁖၃翮忡၎㿿䁙၍Sၜῳ⁑᷶偅恟䖩ǯ၀緻㲭Ǧ⁘昮⁇恑⁉G㷺做Ǵ⠾做䒣偔ၟ㼣偕偐埥̺じ偋偔偞\\停䁒偉၏翳Ԥせῶㇾぜ┫ⷺ䐦い勱<⇨怳偉假䁕きᘪ偃あ㔴灌樬うᘱ灝ᠤU灐灈灏呣灜灂灓翳恜恏偒恗恅၂丧灛う嶢ࡄ^㒰〫灏㮶࡙䁁げ灉せ䁅ぉ⁓濰ぞ灓㔱ࡘ⁖㺩䇦ࡀ䡞ࡏ㦷ࡕ俷矵࡞⁗偂偙⁋ࡊ䁂㔴䡙灟☡䡒い 䧸䡄嚭䡙灘爺灃ࡔࡂ⌳䡍唨⡐䧢⁈㿺䨭䡏灐翧䡄巯䡟偆䡝Ῥࡎ瘲⡐_☥⡑樱䧽䡍ળ⡋䡚⡟矷䡝࡞⡓ࡑ⡗䧱䡝☧⡃⡌⡇㿴䘳⡊⡖C恀桞၆灇翮灎䡓㔶桕⡜桊秶㈬伯ࠢႬ槡ᠿ䈣㴻㘧㌡ȱⰩȭ爳⨶䐨爻пȦ戬伻峺㗩䠱岪沸⠽ᓵ秥ᮾ⼣尹ᰪ吻尥మⰳᰫ栦㡢玾尿琤㰪欻␢惿矦›䀮㐨倫栩ઽ㴭搶ࡗఱৠ䀸䠠ܫ&ᡐ堼䐠䈻:䀣塀爮䏮8‣㈾䰤⸮⼡㰴〳簺編㡙恴㒮⼮ᬩ簠᧹⠩匳‿ᇻ痾I༪Ȭ欸㠭簡‣簫簼㈢䐠硔ȩ䠭䠧䨤績⼢ᇧ㚮忠ἳ怩‰㡋0ᇧ塍塏怹硓ᠻ塁尧怯塘倫硘吴恱㡐㠯琢丨ȭ㡔⠣㡕凫㡛䁇㡘硆ػ琬硑䠡ц刭䰹ьȸᤱ䚠伶硖墣䀬ಮᡋ栣+й塔䇵塛0ိ塖㡅㐷堼∯塀㡕ሷ堬䀼硟㼴䘬ᐱ户堰倧桚›䀪䑃䑖䠯塐ဿ䑝簻䑛)‱ৡ䑆䑘搴倱৩硑䑉8䀫䑓怳硁尹⑁Ǵ䘽永ᡅᠬ㐢炣ឣ淧倥堨摛斡ᠢᘣ㠬欣ࠡ泶㰵㸮᰽笨 "}
The complete round-trip took 46.5 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-11129-GZYM5B0dP5DY-.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-11129-GZYM5B0dP5DY-.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-11129-GZYM5B0dP5DY-.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-11129-GZYM5B0dP5DY-.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-11129-GZYM5B0dP5DY-.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-11129-GZYM5B0dP5DY-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11129-GZYM5B0dP5DY-.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-11129-GZYM5B0dP5DY-.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": 2 } }, "reconstruct": { "code": "x <- 1\nx", "linesWithAutoSelected": 0, ".meta": { "timing": 1 } } } }
-
The complete round-trip took 13.1 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetoken
is unknown, flowR will respond with an error.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.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-11129-a2DP8M5M2en2-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-11129-a2DP8M5M2en2-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11129-a2DP8M5M2en2-.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 27.3 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'
-
. 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'
- 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":2}},"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-11129-7yI0jUuRafY5-.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-11129-7yI0jUuRafY5-.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-11129-7yI0jUuRafY5-.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-11129-7yI0jUuRafY5-.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-11129-7yI0jUuRafY5-.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-11129-7yI0jUuRafY5-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11129-7yI0jUuRafY5-.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-11129-7yI0jUuRafY5-.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.0 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-lineage'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
- criterion string [required] The criterion to start the lineage from.
Message schema (
response-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] Allows only the values: 'response-lineage'
- id string [optional] The id of the message, will be the same for the request.
-
lineage array [required]
The lineage of the given criterion.
Valid item types:
- . string
-
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 3.9 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