From a08ec5b83d8299c9da2c16894799ef1fd9a08d22 Mon Sep 17 00:00:00 2001 From: "Amos B. Elberg" Date: Wed, 17 Feb 2016 02:04:45 -0500 Subject: [PATCH 1/2] R Interpreter Working on CI CI CI CI CI permissions CI Should be good Triggering CI squashme - force push squashme CI Removing unused dependency squashme squashme squashme squashme squashme squashme License changes requested by @bzz squashme --- .travis.yml | 25 +- LICENSE | 14 +- bin/interpreter.sh | 7 +- conf/zeppelin-site.xml.template | 2 +- docs/interpreter/r.md | 100 ++++ docs/interpreter/screenshots/backtoscala.png | Bin 0 -> 36308 bytes docs/interpreter/screenshots/knitgeo.png | Bin 0 -> 59594 bytes docs/interpreter/screenshots/knitmotion.png | Bin 0 -> 33468 bytes docs/interpreter/screenshots/knitstock.png | Bin 0 -> 108868 bytes docs/interpreter/screenshots/repl2plus2.png | Bin 0 -> 13143 bytes docs/interpreter/screenshots/replhead.png | Bin 0 -> 42923 bytes docs/interpreter/screenshots/replhist.png | Bin 0 -> 31481 bytes .../screenshots/sparkrfaithful.png | Bin 0 -> 52235 bytes docs/interpreter/screenshots/varr1.png | Bin 0 -> 16703 bytes docs/interpreter/screenshots/varr2.png | Bin 0 -> 18973 bytes docs/interpreter/screenshots/varscala.png | Bin 0 -> 21073 bytes licenses/LICENSE-rscala-1.0.6 | 29 + licenses/LICENSE-scala-2.10 | 11 + pom.xml | 12 +- r/R/install-dev.sh | 41 ++ r/R/rzeppelin/DESCRIPTION | 28 + r/R/rzeppelin/LICENSE | 14 + r/R/rzeppelin/NAMESPACE | 7 + r/R/rzeppelin/R/common.R | 14 + r/R/rzeppelin/R/globals.R | 3 + r/R/rzeppelin/R/protocol.R | 35 ++ r/R/rzeppelin/R/rServer.R | 214 +++++++ r/R/rzeppelin/R/rzeppelin.R | 95 ++++ r/R/rzeppelin/R/scalaInterpreter.R | 123 ++++ r/R/rzeppelin/R/zzz.R | 9 + r/_tools/checkstyle.xml | 282 ++++++++++ r/_tools/scalastyle.xml | 146 +++++ r/pom.xml | 396 +++++++++++++ .../apache/zeppelin/rinterpreter/KnitR.java | 135 +++++ .../apache/zeppelin/rinterpreter/RRepl.java | 135 +++++ .../zeppelin/rinterpreter/RStatics.java | 86 +++ .../apache/spark/api/r/RBackendHelper.scala | 84 +++ .../rinterpreter/KnitRInterpreter.scala | 77 +++ .../zeppelin/rinterpreter/RContext.scala | 321 +++++++++++ .../zeppelin/rinterpreter/RInterpreter.scala | 167 ++++++ .../rinterpreter/RReplInterpreter.scala | 98 ++++ .../zeppelin/rinterpreter/package.scala | 29 + .../rinterpreter/rscala/Package.scala | 39 ++ .../rinterpreter/rscala/RClient.scala | 527 ++++++++++++++++++ .../rinterpreter/rscala/RException.scala | 31 ++ r/src/main/scala/scala/Console.scala | 491 ++++++++++++++++ .../spark/api/r/RBackendHelperTest.scala | 49 ++ .../rinterpreter/RContextInitTest.scala | 113 ++++ .../zeppelin/rinterpreter/RContextTest.scala | 115 ++++ .../rinterpreter/RInterpreterTest.scala | 141 +++++ .../zeppelin/rinterpreter/WrapperTest.scala | 103 ++++ .../zeppelin/rinterpreter/package.scala | 23 + spark/pom.xml | 1 - .../apache/zeppelin/spark/SparkVersion.java | 5 +- .../rest/ZeppelinSparkClusterTest.java | 364 ++++++------ zeppelin-web/bower.json | 1 + zeppelin-web/pom.xml | 1 + zeppelin-web/src/index.html | 1 + zeppelin-web/test/karma.conf.js | 1 + .../zeppelin/conf/ZeppelinConfiguration.java | 4 +- 60 files changed, 4557 insertions(+), 192 deletions(-) create mode 100644 docs/interpreter/r.md create mode 100644 docs/interpreter/screenshots/backtoscala.png create mode 100644 docs/interpreter/screenshots/knitgeo.png create mode 100644 docs/interpreter/screenshots/knitmotion.png create mode 100644 docs/interpreter/screenshots/knitstock.png create mode 100644 docs/interpreter/screenshots/repl2plus2.png create mode 100644 docs/interpreter/screenshots/replhead.png create mode 100644 docs/interpreter/screenshots/replhist.png create mode 100644 docs/interpreter/screenshots/sparkrfaithful.png create mode 100644 docs/interpreter/screenshots/varr1.png create mode 100644 docs/interpreter/screenshots/varr2.png create mode 100644 docs/interpreter/screenshots/varscala.png create mode 100644 licenses/LICENSE-rscala-1.0.6 create mode 100644 licenses/LICENSE-scala-2.10 create mode 100755 r/R/install-dev.sh create mode 100644 r/R/rzeppelin/DESCRIPTION create mode 100644 r/R/rzeppelin/LICENSE create mode 100644 r/R/rzeppelin/NAMESPACE create mode 100644 r/R/rzeppelin/R/common.R create mode 100644 r/R/rzeppelin/R/globals.R create mode 100644 r/R/rzeppelin/R/protocol.R create mode 100644 r/R/rzeppelin/R/rServer.R create mode 100644 r/R/rzeppelin/R/rzeppelin.R create mode 100644 r/R/rzeppelin/R/scalaInterpreter.R create mode 100644 r/R/rzeppelin/R/zzz.R create mode 100644 r/_tools/checkstyle.xml create mode 100644 r/_tools/scalastyle.xml create mode 100644 r/pom.xml create mode 100644 r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java create mode 100644 r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java create mode 100644 r/src/main/java/org/apache/zeppelin/rinterpreter/RStatics.java create mode 100644 r/src/main/scala/org/apache/spark/api/r/RBackendHelper.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/KnitRInterpreter.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/RContext.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/RInterpreter.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/RReplInterpreter.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/package.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/Package.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RClient.scala create mode 100644 r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RException.scala create mode 100644 r/src/main/scala/scala/Console.scala create mode 100644 r/src/test/scala/org/apache/spark/api/r/RBackendHelperTest.scala create mode 100644 r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextInitTest.scala create mode 100644 r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextTest.scala create mode 100644 r/src/test/scala/org/apache/zeppelin/rinterpreter/RInterpreterTest.scala create mode 100644 r/src/test/scala/org/apache/zeppelin/rinterpreter/WrapperTest.scala create mode 100644 r/src/test/scala/org/apache/zeppelin/rinterpreter/package.scala diff --git a/.travis.yml b/.travis.yml index 72b748e1342..ba66bae606f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,23 +16,24 @@ language: java sudo: false + cache: directories: - .spark-dist - + matrix: include: # Test all modules - jdk: "oraclejdk7" - env: SPARK_VER="1.6.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Phadoop-2.3 -Ppyspark -Pscalding" BUILD_FLAG="package -Pbuild-distr" TEST_FLAG="verify -Pusing-packaged-distr" TEST_PROJECTS="" + env: SPARK_VER="1.6.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Pr -Phadoop-2.3 -Ppyspark -Pscalding" BUILD_FLAG="package -Pbuild-distr" TEST_FLAG="verify -Pusing-packaged-distr" TEST_PROJECTS="" # Test spark module for 1.5.2 - jdk: "oraclejdk7" - env: SPARK_VER="1.5.2" HADOOP_VER="2.3" PROFILE="-Pspark-1.5 -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false" + env: SPARK_VER="1.5.2" HADOOP_VER="2.3" PROFILE="-Pspark-1.5 -Pr -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark,r -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false" # Test spark module for 1.4.1 - jdk: "oraclejdk7" - env: SPARK_VER="1.4.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.4 -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false" + env: SPARK_VER="1.4.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.4 -Pr -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark,r -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false" # Test spark module for 1.3.1 - jdk: "oraclejdk7" @@ -46,12 +47,24 @@ matrix: - jdk: "oraclejdk7" env: SPARK_VER="1.1.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.1 -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark -Dtest=org.apache.zeppelin.rest.*Test,org.apache.zeppelin.spark* -DfailIfNoTests=false" - # Test selenium with spark module for 1.6.0 + # Test selenium with spark module for 1.6.1 - jdk: "oraclejdk7" - env: TEST_SELENIUM="true" SPARK_VER="1.6.0" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark -Dtest=org.apache.zeppelin.AbstractFunctionalSuite -DfailIfNoTests=false" + env: TEST_SELENIUM="true" SPARK_VER="1.6.1" HADOOP_VER="2.3" PROFILE="-Pspark-1.6 -Phadoop-2.3 -Ppyspark" BUILD_FLAG="package -DskipTests" TEST_FLAG="verify" TEST_PROJECTS="-pl zeppelin-interpreter,zeppelin-zengine,zeppelin-server,zeppelin-display,spark-dependencies,spark -Dtest=org.apache.zeppelin.AbstractFunctionalSuite -DfailIfNoTests=false" + +addons: + apt: + sources: + - r-packages-precise + packages: + - r-base-dev + - r-cran-evaluate + - r-cran-base64enc before_install: - "ls -la .spark-dist" + - mkdir -p ~/R + - R -e "install.packages('knitr', repos = 'http://cran.us.r-project.org', lib='~/R')" + - export R_LIBS='~/R' - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" diff --git a/LICENSE b/LICENSE index f6094226253..db076c66d99 100644 --- a/LICENSE +++ b/LICENSE @@ -244,4 +244,16 @@ Apache licenses The following components are provided under the Apache License. See project link for details. The text of each license is also included at licenses/LICENSE-[project]-[version].txt. - (Apache 2.0) Bootstrap v3.0.2 (http://getbootstrap.com/) - https://github.com/twbs/bootstrap/blob/v3.0.2/LICENSE \ No newline at end of file + (Apache 2.0) Bootstrap v3.0.2 (http://getbootstrap.com/) - https://github.com/twbs/bootstrap/blob/v3.0.2/LICENSE + +======================================================================== +BSD 3-Clause licenses +======================================================================== +The following components are provided under the BSD 3-Clause license. See file headers and project links for details. + + (BSD 3 Clause) portions of rscala 1.0.6 (https://dahl.byu.edu/software/rscala/) - https://cran.r-project.org/web/packages/rscala/index.html + r/R/rzeppelin/R/{common.R, globals.R,protocol.R,rServer.R,scalaInterpreter.R,zzz.R } + r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/{Package.scala, RClient.scala} + + (BSD 3 Clause) portions of Scala (http://www.scala-lang.org/download) - http://www.scala-lang.org/download/#License + r/src/main/scala/scala/Console.scala \ No newline at end of file diff --git a/bin/interpreter.sh b/bin/interpreter.sh index 69c94f623e0..17c9028b853 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -85,7 +85,10 @@ if [[ "${INTERPRETER_ID}" == "spark" ]]; then export SPARK_SUBMIT="${SPARK_HOME}/bin/spark-submit" SPARK_APP_JAR="$(ls ${ZEPPELIN_HOME}/interpreter/spark/zeppelin-spark*.jar)" # This will evantually passes SPARK_APP_JAR to classpath of SparkIMain - ZEPPELIN_CLASSPATH+=${SPARK_APP_JAR} + ZEPPELIN_CLASSPATH=${SPARK_APP_JAR} + # Need to add the R Interpreter + RZEPPELINPATH="$(ls ${ZEPPELIN_HOME}/interpreter/spark/zeppelin-zr*.jar)" + ZEPPELIN_CLASSPATH="${ZEPPELIN_CLASSPATH}:${RZEPPELINPATH}" pattern="$SPARK_HOME/python/lib/py4j-*-src.zip" py4j=($pattern) @@ -130,6 +133,8 @@ if [[ "${INTERPRETER_ID}" == "spark" ]]; then ZEPPELIN_CLASSPATH+=":${HADOOP_CONF_DIR}" fi + RZEPPELINPATH="$(ls ${ZEPPELIN_HOME}/interpreter/spark/zeppelin-zr*.jar)" + ZEPPELIN_CLASSPATH="${ZEPPELIN_CLASSPATH}:${RZEPPELINPATH}" export SPARK_CLASSPATH+=":${ZEPPELIN_CLASSPATH}" fi elif [[ "${INTERPRETER_ID}" == "hbase" ]]; then diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template index 93d0495ee10..f475f876bdf 100755 --- a/conf/zeppelin-site.xml.template +++ b/conf/zeppelin-site.xml.template @@ -144,7 +144,7 @@ zeppelin.interpreters - org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter + org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.rinterpreter.RRepl Comma separated interpreter configurations. First interpreter become a default diff --git a/docs/interpreter/r.md b/docs/interpreter/r.md new file mode 100644 index 00000000000..9b893ad82b5 --- /dev/null +++ b/docs/interpreter/r.md @@ -0,0 +1,100 @@ +--- +layout: page +title: "R Interpreter" +description: "" +group: manual +--- +{% include JB/setup %} + +## R Interpreter + +This is a the Apache (incubating) Zeppelin project, with the addition of support for the R programming language and R-spark integration. + +### Requirements + +Additional requirements for the R interpreter are: + + * R 3.1 or later (earlier versions may work, but have not been tested) + * The `evaluate` R package. + +For full R support, you will also need the following R packages: + + * `knitr` + * `repr` -- available with `devtools::install_github("IRkernel/repr")` + * `htmltools` -- required for some interactive plotting + * `base64enc` -- required to view R base plots + +### Configuration + +To run Zeppelin with the R Interpreter, the SPARK_HOME environment variable must be set. The best way to do this is by editing `conf/zeppelin-env.sh`. + +If it is not set, the R Interpreter will not be able to interface with Spark. + +You should also copy `conf/zeppelin-site.xml.template` to `conf/zeppelin-site.xml`. That will ensure that Zeppelin sees the R Interpreter the first time it starts up. + +### Using the R Interpreter + +By default, the R Interpreter appears as two Zeppelin Interpreters, `%r` and `%knitr`. + +`%r` will behave like an ordinary REPL. You can execute commands as in the CLI. + +[![2+2](screenshots/repl2plus2.png)](screenshots/repl2plus2.png) + +R base plotting is fully supported + +[![replhist](screenshots/replhist.png)](screenshots/replhist.png) + +If you return a data.frame, Zeppelin will attempt to display it using Zeppelin's built-in visualizations. + +[![replhist](screenshots/replhead.png)](screenshots/replhead.png) + +`%knitr` interfaces directly against `knitr`, with chunk options on the first line: + +[![knitgeo](screenshots/knitgeo.png)](screenshots/knitgeo.png) +[![knitstock](screenshots/knitstock.png)](screenshots/knitstock.png) +[![knitmotion](screenshots/knitmotion.png)](screenshots/knitmotion.png) + +The two interpreters share the same environment. If you define a variable from `%r`, it will be within-scope if you then make a call using `knitr`. + +### Using SparkR & Moving Between Languages + +If `SPARK_HOME` is set, the `SparkR` package will be loaded automatically: + +[![sparkrfaithful](screenshots/sparkrfaithful.png)](screenshots/sparkrfaithful.png) + +The Spark Context and SQL Context are created and injected into the local environment automatically as `sc` and `sql`. + +The same context are shared with the `%spark`, `%sql` and `%pyspark` interpreters: + +[![backtoscala](screenshots/backtoscala.png)](screenshots/backtoscala.png) + +You can also make an ordinary R variable accessible in scala and Python: + +[![varr1](screenshots/varr1.png)](screenshots/varr1.png) + +And vice versa: + +[![varscala](screenshots/varscala.png)](screenshots/varscala.png) +[![varr2](screenshots/varr2.png)](screenshots/varr2.png) + +### Caveats & Troubleshooting + +* Almost all issues with the R interpreter turned out to be caused by an incorrectly set `SPARK_HOME`. The R interpreter must load a version of the `SparkR` package that matches the running version of Spark, and it does this by searching `SPARK_HOME`. If Zeppelin isn't configured to interface with Spark in `SPARK_HOME`, the R interpreter will not be able to connect to Spark. + +* The `knitr` environment is persistent. If you run a chunk from Zeppelin that changes a variable, then run the same chunk again, the variable has already been changed. Use immutable variables. + +* (Note that `%spark.r` and `$r` are two different ways of calling the same interpreter, as are `%spark.knitr` and `%knitr`. By default, Zeppelin puts the R interpreters in the `%spark.` Interpreter Group. + +* Using the `%r` interpreter, if you return a data.frame, HTML, or an image, it will dominate the result. So if you execute three commands, and one is `hist()`, all you will see is the histogram, not the results of the other commands. This is a Zeppelin limitation. + +* If you return a data.frame (for instance, from calling `head()`) from the `%spark.r` interpreter, it will be parsed by Zeppelin's built-in data visualization system. + +* Why `knitr` Instead of `rmarkdown`? Why no `htmlwidgets`? In order to support `htmlwidgets`, which has indirect dependencies, `rmarkdown` uses `pandoc`, which requires writing to and reading from disc. This makes it many times slower than `knitr`, which can operate entirely in RAM. + +* Why no `ggvis` or `shiny`? Supporting `shiny` would require integrating a reverse-proxy into Zeppelin, which is a task. + +* Max OS X & case-insensitive filesystem. If you try to install on a case-insensitive filesystem, which is the Mac OS X default, maven can unintentionally delete the install directory because `r` and `R` become the same subdirectory. + +* Error `unable to start device X11` with the repl interpreter. Check your shell login scripts to see if they are adjusting the `DISPLAY` environment variable. This is common on some operating systems as a workaround for ssh issues, but can interfere with R plotting. + +* akka Library Version or `TTransport` errors. This can happen if you try to run Zeppelin with a SPARK_HOME that has a version of Spark other than the one specified with `-Pspark-1.x` when Zeppelin was compiled. \ No newline at end of file diff --git a/docs/interpreter/screenshots/backtoscala.png b/docs/interpreter/screenshots/backtoscala.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c897a63bd84129c2f4175e50dceeeec2d459a5 GIT binary patch literal 36308 zcmd43b#z=g(g$j0h?$w0nHgecW;-!6GczS-W@g9iww)N-F*7qWGd|Dm_jYz?=KcTr z==9OOS5<1&EtN_?RduA2f)pYgE*uC52%?O%xC#ge_`yeg7zXO&`_;K^69fdVz*0<1 zNk&YJSjoxW!qUbZ1VlPAIR#oxRT~$0?tK`G2_qqUAnyfF3XrY50;K;dKM z1|y4#fT4~;3Zmx56ds6zgbxmayMtw=ram?jQB%7E{k*U!(BXZT>+J0Rcm+83J@4`! ze*_mkGl7LTtiuPvd7(FM&7~6HWXy^C4g&LN6hM+!zd#x&rKR;rn4Rlgo#;71PuzX9 z#QOF5{ayVkiyQ?Hgc@N}JT4+T@PfuH%LqP18ziq)TF+fQ#V8{hMFX7_k+jo4L)GGO zhMj8c>NY)V(19r=7bJkHQR^2vh;*-XR?et`$Wg*2jP4Z=zu+%~5dB3xOz2Jg5G)Hb zGlgrCkXY3Ba)lv7D@s}G1}z$u9N!e2O@Jq<2(R_+dmH|{F3#aroA&{6@Ce3JI2jv? zcH`5J5n-BZG%?ZrG+_GgT;rMrA*;AW(%J`}y}C~DeXT6aT^1ny=1Ws2y~PebJX>$^ z?c*Vd$kdaJ91T^Z59uCv`u=d%ww|5Y2>zGr0nG5vKn7tqEe#cgIhR6%^q^T$130eev%st*a^COboQBdZ%|9BTjhDO$fDeP>Ify`g3Q{*>Sb%^NMp-~|3zSs?M+)+C zK*$2A-k@)Vs0q~FKx#!M1c${2tNn@n07FRv^GgIh01W6cif@uQh0M!NjD3DMTd;;bM=?SdRh_wpFx(BKbawI@t zLzo-Y0IIZyZc~q&XbnoUr|Cku6|xIrJ?Oj_^?`#w4vZQ#Dr`zJJs+EzNsXG8FgXUb zV6G5OdACeQ4XuJ;HnKhXTb`tH?xYqwhP+f}e)i7q)M<|UV!GC__1k*FrZtI)21OYBQYmmoiAuv2Wt;)(aj{7Cvp@+c50%97Wrx<#X% zWSayvWIn_;M1@lk(}tiLM%E}&B3mL+qPZ7KFQQ>MC+5~>Q)AP1BD1*MQ0N4~1J1+5 zld|H~M%%{b^y;*IrRGWZsPu^NX!1yQ#kCWT;Q$8(CkTfh>Ju6amx=*ZPF=w`8$DEF zS3+1|P>e)lf`N#U9#tMC5d}o=zyKzpC)p$yBs(QlB#qI?e5K9+jg|RanmnN}@$}U& zi6coM>3dQOEf>u_tzsFylB1@K3XPhjMqBNbL~_khVMa;2Sd;o~Ij+vAxNZFsZIiE+ z=By+ZHKT(;kAYI_MqiNBQC)kaSL+k*ZSax)(Kc=dt{*N~tN?B*ha`t(##u&rhIz(5 zht!WUof;kfYSwCao!SFg7i2G9K#*UkU`ch&X)VK?VBTuAK)GodTJiVN>8fkB)Ux3T z`8kH^(+Ps<=_&X*-OBm0d+FS~@rnJT^SSexTxMqW2$ltt2`grsGLu2}5e^%69}{sF zCpH~RHEWk~Z0iwb1-3P7A0Py0J=L?DFXIkVmHvXgB3rbozdJOGbD7L}NtDg7Ku~*`g)t|=X4B}gTIrCX)@9OazNG3~K8 zCpw;CCL*UTr@gJb?RT5|MZvnlCCFvl`s2E1i*qBUANCDIjuXz(4rOi!U#MAsVfV)z z$6-q;0ukfB5D4)t@|p8wJ3LJdRMd%CZGuzFg!fwrr9 zcs-&CLyaqSQFdn6B4PKSm$Fxz*}2+M)8IX)_yTCISORid0b2 zOEN`VFpf0}RmxR-SduB$E+Qx5GL9xTu}`P3CK`ZIiV2Lijt2Hi0q6VUnJ%>(tbb3a zbQD8=eonz*9M*O-ZCkp!+1=L|tTC$QP7jcYkm3Gzk&H1^VIE7xidKmRTrfCUJ(Lad2nwkS(l5at#LFBV zw9nHO2kKPLJI)V0`jzq;_WG}^^IZ4)90wdH90b-)^L9FXbz`QhfwvP+eYXU7E?hhI z*h>d3^?qoMs!Jv7SM=Ai*Mc^2iz_*`iQO#z7tq~AxbS9hA&{@SSuHa!5pRk2ruQ0| z)!xm1Ogrdn^bPd1Oiwx^j9ri4XB9Dol zsrzPlwbwyfX|J-*4cR9D=x@5sg5{o`JX`U5(!4fA&Ycz1byYaj`|Y{)_;Rg^<-`udWIKU;0g9?$#K>Yv>lbULi=J}u%YaE+~)t=Is}{VR)y zYmRU1-MX{Sn$PXpP8~W<Q!awG)yy;r@MR&Tq!PYJKrs-H>jy`Ku62yd89Q~5Xe zvHjBCE=~(iq`t><3I61#@u9u{@sj@3xU?SYZ=bU8c?{75*+n4UuLIRyrzDkKELHxi|TpQ zdS#c;%g;M8pvS^PV>}KK6&0LNxnITm$ivDb#oqAnZ*@aQL%J>;f9rR`hu7a~12ahh z6lSAZpy;d{W_?7RdPAk~srA{MiEGAHI> zWM^b16@()uCgyiCv*1+`m;68Sk1GMvuP!bQyi82)?(U54Y>f6!Uzk{UczBqYS(#W_ z89rJtID6W;7<(|-Ig|aH$^Xko+}zpJ$|Kl#NlBI{ajh48jt+}1^M<0SL%*@RE|04L? zqd&X+FH-G4Nm-fM{+sf@p8OvrKhqy0_^%QDTU`IT`ynquIDV%8$X*bRUExs!1Vk7_ zMqEVA1M~y{@1r)`cK;4ONvYEaysG<`656U0*uy;Sg42ZjG zmHGW2lQMElX>$pK?c<9|B}Ah?LDErZiPe3Z=(4Cwh7cgP%nYGcHii1kN}DcX^ftbf znl3Ou0s#idfB`5y3JqGt8sRzVZ{{KQsk_g+OISbh=)S+4Qe@3C2Ab zqDH=FfxOE6TgM+ig_s@GJOcW;4E;^gD%Sn25)z$ReiF{@QeabGyQs2z+&&TgY)M#3F=h0Jy!?x&U&#hCXQjcLu1$ zffEpdJWKIpNa3Z0x;RHAY_Tpx;QEjm0=q-pLVhpY0|s}VdiZ$OCEHwo6UT>igp(lD zN?T&2fZ&1Hw(?GFW=U#F5_C@; zDCSJ_GCk7-4yY)8mgW+20UqVS$c6t_9N-|55^GLu%OEERW?TKZ#p3i zCMFjE_4En6#N!_nJR+p0Oqw*ihMRzZK(IhXMa5^#Q}iEr+wscaX4#wHzTBThE)3rVvbKwL!S_^+$Fsypmh(B*AIKj zE@`lRH;pI|1ohpm>9S-jrK1Qs5lYDaB9p*PStHZe_4?;(cSq+b^M|(;JV%+64TM@n zp;vUK?ibdstK?c@K|w-bJQ1)=+2H%M*IR1$3nZ3-2MH@1o0y4m10&!@g}T@O<>4}o z+mUo2jsU)8IW{MU(8bj?zoP>WOV1(DB5&RM96(|Y3IDM3T~SF>Gdz(@ij<2>bDBr1 zlkIT7*p<>5F>#(`+1X>OKbTwa==x#oy$#v$>4h3!pbj?vZO`;&dAuupl4J@oy9I4| zYI@V=M9Ptp;U<4u?)U%bz=bxk1HM%J-DeS|U;S7>giJ7^$G%Xh?n??6qDP4J_gzBt zl}pGG!0u7mZFFSh&zr;P%cII#E6FFJw@YNXG-gmuJ;zYW%I0QF!`CCt%ctX7Ye_fm zZ9R&Im3_g|e$BAg=kxCP=4Q^9Lq-2zALiI$R$bGwp|PQX9URc!&P(dM?zvC!a$D;! zp`wDC6zKPQJ8uo;rK*aywYBANFhL@h&MNVpD6wZ6-x3?=;CzG2Bx~H?1(Nmtor`ew z3bV`Q{p-uK{n}5>6rqU7(zcDnsLyE-H&dMP=vdo{|Ggsg@W^dYyS=%Qt!Z%nh|dfN z>M!^3>&<1k)m;}E=tr$p+3GJgy#%=Tm|Atbg~>*;X>XAO?xAgbFdpXayP~2c=JEml zJ;To(^eRk0XF9qAGiwqQesiw3dXZxt`E`JvrtWU=8D?XP*1|hKB2_@8)Bv|E z6^6*?0u&V$m0e7~SRL>vyT&oE7p#FJVLQvGvRF#Cc99QdNyaGXtih;u#qjd5V6jdZmN^R=~B|t02i2v%)kgOJ3Nt8Rj*HUgVc#FGJu71=c0|Kunj$RsVhbJ-)SDW zDJdLtJxn>;-vZYaR_i~k3{aX>v{`^W#_;c62z)H)5 zb(+f~@ax0t@B_89&+0LR-rV7e$n6u9O7bmo^6_q(u2SBikNcX?%XuZGxQ*60Ot0z8@@ojcO4R6yyezEW}CgZOv>kow%E~$i^ww~ z-Q5>DAGPmJWEAyOZsrL1>(aUp3u=Be zpzp@R*yVyS5W^yrfpMZM8j0=x`1OXpGlnzOKH+__K0ZkuHGHOsF29{nsz2su(qdzA z3nwU%_LRZKcO@Y<#J3GE{i9Prs_}Jdq;i!@*VYjE3d^}}>*Y5z4}i$I;~fgYPnoIR z)Ge&_%&;GosE+STUY)egGh~iKc^c0B$%)?gtM1lMX@_U6+ejlB9G~G8<>c4_y?%x+ zlM)$Kot^x0*}Su8_j9`T{hglI4%eexV*QbQ<&Q_BqoWTm`$Dx6{=3PVKh`{F#k#HM z8AlaI9sNHVHMN~44)U)$k`kRev^yguaKYW9zkmAO+~V*uRat+{#mUY1Nc9G|dEW~2 zH0&*qGyNKZJ)WI?&BADlKlOrzo_0gNR!cX)otUlBiKC@TB5)#cz?g%?--)L#(WX-~ z#;zS<)GYy;Y;s1>&2Z4+qXC7P!zcW;g$F{qNs}x#|J~5{xjQeGui(ZiC<H8A%wqs*_Xg?RA`u_g}nyE^4Jwb2~C2RvS$Q@VdS-eB)3${ff((->YIJBgD@RW7uL4T-2*RC!`BtARcRo;axav?ovP9&3ZVEQktzO1&zGe zF06LIO-}=@5eU~;0=8akR?||DE@k?i*|+uJf6y;7-Equmgr42HHCJ3bhAHQSV5rlv zqbzl^8y&jbmQX^+atsBOlKt;e%xw=FA+hp)=l8P6TKt^xStSv@4@q#Z9X;KX$HP=i zz^%Esx2^?zQqPA0b2T-f1$V7S_tbv-_I~&Ji_r~7i|Nm798|;fO(N57?9ev_Ih$3; zNqEP3VveG~ns1Sz{!wQSGF%2I9D^AgK(KVQns@G%5&kx)2O%jK1kK_JUj%q87n_=mJNVcn?hs zq2C4jK1&1p=xTe57K92O38+|A(Gqmkklc-NbZpfJv3lEJp_P+s+j}-~&T8VaS4~_^ zyP5?u7WV5Fj#(7}DkrC;mjnwm+rGZTA~BWHk{WtANbQ=$mK$aoSez(DTF$kEynbI?YYc#Ai;eXMTdR5Ju*bFV&a4wv>ooX>$ zm1rmt4VItIs3Es6S;&u~weWJF>ocI1BAiLDWV^4G<2(#W=khpH&iLG9^SN8e%+@c} z$d4+%Z(()A+?s6Iv~IFN>(jliH>odwVKNM{#3`I)N(Su=XWWNuJ(De;uys8+aRsZd zmmVGkMtPG&xBYJ0^oreHo3oY9dSk3B0mZ+LTuh9n{f5w%6=P=e=oB zB^{>`3ZkMC2-;bZ^)>K5I6xrziyEfFVgo7?F*k>n_l&{3%#bhMQB;@llg{K{@0Ug& z^l#ri1SIuij?Y{1<|D@IO}&t7;Lx4dw>sYl$B7Mc>H>nrJPMB?wkRpJW8MO!MFa$2 z1|yR*@3tg#q5ZmcICs|HLL*|FDda{)G_WGmhLb`U? zw|RV*CX442@BJMP@fi&XY0)Pc@>)-Ih`&|eAPu9wdxAEbkguDj^9vptvui}$R;Re& zQB4n}S{V1K5bXA5;wh(O7G;kxEyrf<97?Ycm)_f@gl_DS3HajinvZ$vR4qJjo!WBh zppFaKYk@`CG908-qoYOx^Sf906j#yGq5sDb6$Z-{0ZTP;GvLixoFp~xrtT3}l=ibmlPpO$u0!6DU zvZLMMdev)!rUMA$f`{OvQbKMg*fR;vO=X#Fr|E5@89I)uE<}D0`4$hE`}pTRlo zeV^}6m#nS~->y=dJWs9sU3Zf%&#o>IsVu+#3QG+1!~fpZ1>;$+c}xMgu%b7p2a9Id z9b>Q#>KG{pggQoPXA=t?63#O?Pt0=`lv6u6hAkB7&9priL+gkA#IsyEdz75g+Tr@$ z1tyYhnC8--Dr24k8T(oBFAkM+b^vP#*UxKqd)zLbVobTnWyUAVnY}sqB zX1$1Ddj|*_<+#LIANC@&0GO2t(7*NF+~&uPW<}falHkD-9q8fD_0CDMgMvx4i{#p| zfu=Q<>zq0xXnVjbiQip^q+G|Q?8{U5G>g?vgwZ6_jcV`0tde7s!*ae@xWjLXRFA1L ziM1qUJKRGnp(_W;C)<|QFmPz3uafOir5fRy0#_BKAAm&#mmb4i34#X(*T?+6ii<<4 z-q){QtBF&u?Z&07-D{#tr=g)qjKKZIO@?%TXE|3+Tl7@M0}kAY4OA6;eU);Irq}gv z&!X*|&F%`~Q|2K>`rIe%4$U%A?Rk~<*L~<1Qs6eX*AGKX$`0X@FvBX_HaEAMi&0m@ zZ~~^+TU#IdJH%E}kuXN&soP<<1*>ysj$CizQcRye+!S*&=OekI1dVg=viU~8QpKsOg+3d_mZ>2vXHu9&$l`<2IWE_6E z?-&}m{$9bnt=N65-cHFO{HH9th$N~1wbB2=O-f~nvjPQU!di26Sf-u!$xdg)nK}N~ zqxjceCW`~C*9POhaUc-qpAZCX3Sscqs;w`3f0!C$j+6WtEnq_BLQstj>w)X4({jX3>YC@>4P2B_K(o7@e|Ks}Ec#No)fk zCJ(p8tySr=254_T9N~tsR|nU`qmPMoBCZxFg{cVV|} zJh~l2fGnGfd@*nq-0EY+Nf~BICTO1Ev(z47U7NkJP2hl(W=cvE&gxDR|30wnjO#kTp0qinKfiep3kj=ZnZHgc$oy=t8B#dD@fv zc8~OO8MnTD>+gf_>dLKK`6)FmPL{>OYqxc14ksPq5tPUE%w@(EYEecX;mwxAg#B6O zXeA}?#6@$+>sPX8SSUg_JgIBb4@{cVf1B{EVmnO_BBUs|M`y$+c&f zJOK4OmVzzqs>TmUYv(Zw^ylIZt9(tyou(!0Zq&u{T2kGsQE6Y;ZXRMN{e+j17ytFW z2@Isi_lS}f-~HT#+fJ=ahrDr|)>WCo9ohXEq0O3oArZrMpvT*zy8ymu3C>W!&!cJg zPwu|Q#JKH27f05Tqi1^oPCOkM3E!_Z0=gA13ub|f!TbIzK}59+@ryjq6ND2AG0j@n zf?0PK)xKU^gPgRk=Bg}$b`VjO8NZHq3&|D#1o}2s$UpgVUDwg?Q>3*WDUT%O+B2yRIu^T% zWrp#cAv|@JCoREfBa8CsM{H>Xbx~j0`c}HVnTq^NfJ$cC;M5)4lFF!c%WYmB=u&C} zOijmO)NwH$vy=8T8#XF{c|Cl@Y`Em5Zjlvp2ZPy$Mz{4%`Fh9hMsx4U zY1)g0sXt^v{N@$p;i<{u+zI;4*$tU+(FxkmBXiQ*io;5uDxv;}_vFd0?H!P+D|KTTc(Y;~JMDh5rMgBSf$-4Wpe*^Z# zXSw+tm_kIpz3M+aC)#z2)s0> zoi_v-{}Z&_=pWvAkT4h@+734gjnkoXu9jkfor>tM8iJ#C;qDqz{fViOZM5 zVUg+hQCsZok#*Ot)B<&WpGdg35Z0>3%_`Yeu0Y`Au2@#0r_0(2TIs~{_Z}49((b4H zzVK)SQJATs?&GWtS2>R1{ZfiZcf}U#6eGMBg-e9tm1(7vRT;hyS9z78Q0qtHVp~lM zh1ngU9_Cns+J`H4KkH~e&3UM=xw7+}>BKv^miv%{ae7R*_+D$At$Sn!ScbMwF6Sic z`}LOWwpuqv=V~s)$qd&C0B{AA(T+(NhssA6zPZlHcvDwRd5vUCu12Z(a(7t?tpWrQ z_+ej>#n&q^9tqvZST(hdG?Lj6_!2R|h>kSKx4+!mg~{LCwXB;06?!U&^a?DU9vMDEn04xpOEe2m7yLXRj?eFfYR8LnlULFiu*X6Oak>ne)w8nGR<*<2x^fl zvB>!69?I@*3#Fnbk&+Ewpa&gqu)1TGN|}26UsJKKM{`Y{ZBw_Y+$F9=OANh6*2NTw z5=hQLer)I5^Jis;A1S>My(9Yy*lz$EZzdt$m9M$PGVhhH;m@gq4QJSo-^RK(HM^IB zo4Kr-CZW59CIY$quCwsFBf#@%CseyGp31(4uRV}OVI8&8>$PHZFTEmPy5{W(<@D0? z80vKP+M5M`djvfZsOVD6`#iKfKTTmiCnZLmp5_I55^j@|h}^woo5B(!IEM6Mb*OP7 zxMM36Zq?j7EVZL!`0y1c{e8<}xZ5BqlC>J_YU?18h}@(K$INf|GXUc?cF@y|cgSWB z(jMx+kA%jEzOE?#aspz4q%HMSZ-`@Ogh$XPrl@@uFe1E^(480Dfqxm2K8XINJ)`IoYb(h!uAv&CGf3+->p?RiX zWo>20&G962FI=(e5T!@cdOqem%lEmIAG}_X2`L|$b=lk7Zy;=XN0OLdWO5 zze?Uq4!;!)l42WdCdC2CSsBItF%llGpVo$cy_M&4P-uf zC_xB(UDb#P%Fx4CJ1L@PNPZ+$bq_WzopLi-9uH_LFjNxL@M7zJwr}4QbW|WbySvHr z2YqkfRk3+|^V7TC*1?A}k>hB&&pVwEnwXoTUq8pmki2qL*~5583}1Sqw0sXE6l-og z7GvKQ)#IC6LL-Xoym0g~cqX&(e%SV*B!m-usw)^cOgr<4^u{Jug68u|cKHg!qcRXf zpAJ`NlIuABT^SltfOU0)xMbcB_I8R=!?#j~>#Fx?yKn3?_ZMS~+`f}f(EHRwnqYqS zZFAYu&)bLmNkMQEphbbnDLH>bH4SkD;h*lLL)Ry44Y3vA8oMe&5~9cHxW06oe%K@^|*PxJ<^2di9h2!R^N1%O-&O~8p{S`&i&)m9 z62S(dj&*y{Gj59I$Pt;TMoY8r2_KM(CC}TUti58}a%{t#>|mK3&XxgopOzOkbmmY( zQPCI;CZ9nI*smi~=}W7F+)LsyAz%3S^+Kl2T#;`U{?FlBKEZ3txa14lP3vkh zUMj@-;H80@1;bB3rf!{yUj`-@gQ|4;Kpd58LNLT7Jj%F+G6?@#K*0(*gRz}551|3C zfh2K~%<5so%)~M+av1^-@0}nC0j#^IKpY0(6q~_f{M$u5`CC( zihS7Y(3V=gjPu3Y8IZ-V{pL)j?3<8bH1tTVORs*pB3;=*ZE*49*Kg1-E$d-pV~^OW zoC=tfBkTpaV0<_z6Xbx$$4!km`23l^<*Nz3_xFqKEcb-hfAB86Xb_TvNki4jqw!fgnTZ=2WS#^u+PCr{1q7xwyt)3?sz@8bAJ zkI*H2ePt)!@av06HugEy@epYb=1I1PA_Mcq1kH*8`rlrc6|cz8h%R5%b2q5g$0Szm zbER@|aX*cP&h8UEjCTnBLN=5A)e=hsJHK{;wcXwZQb^?oT6jrQvIV}5zXLg{xCS7M z|1nFd&Ir77|MEPO@40CEV>ERVLxnR79Y?-Bkw}3^rtD~OK2{tGijeg@lk!DdbP38^Hm~Kz++Lz9gP&A@P>*}}T9D|jh~I^w)z_x@$(v2? zJ~Y4KbzXZo{FS|Yp1=E%JDuoFel!Xj&f%*L*Ynkw11`PD`?Ou&6-<7b4| zl~jTs3?Cr*Z!S>r?~zgCTl)fIuC;dTtwqi&e2U@?X;IJm_rh3rzEDM~u=?owXvipf z%-HFbp|djNK@HMqV0Ip&=AFDXlqie}pGzWXe4zGGC@6U8>pE19xpWCR_pJ2?h+H%+ zx}R&Yq*E4By4~0Oy1BW`IN#31Q_5muf=~#} zrj*g>)Raa3729<;Y*MrqbpF-_)!6-}sb`lN(2<;9vX>`B187)p6|^dMOAqdHI~LVD z&UGRNpB3`!+aJ1srt~xIqL(hgiwN%9OfB?EcfdJA-_~o3oW8!WzdE(?)_pUKm`u6q zlZ(OX?)~bnA6Jh9n?`%jT>6S#Qq!)3uy5K0SVCp9+JAw74mnn|OW%+`@)wF}7P0zP z6oZp$Tw#$FEtQanzJ}l%KNAf@v|k&qxUr#tiaLPENTT}Z8C?&Ls1Y`z<9uZC$RGyW zi|q`+y!UurD9|ijsAf0Y+n}%Z2&?z$CiVW%=iKNqnU1bm^CZ4u-$F$R5_*>3 zgh|TmIhYX9pqm$jzHW z%S@WT)9Z?1xYprgYC;pk>sKqQE59K?Zy#SvHR?7$^u2-(ne9~8{2ASvVU_*Yx<-g} zN@b)L1V{Tt0HHdhsaLSJeZ zB_=`z9W{SN%oRQw-5KppDBcm6{8ScSzq}p6&HAe?(Q9UNzX0FvSQR3oz@Lh|=C80T z*1jTG{Di*$HI?)zm`@N~`ut#3iMm0c&le)smQ@{rt`ovG@BURr_yPMyV>rVX;1|`TAtP z=&W_iW3o)YdXwq%k7!2h(u;)691o%=+S+S0WGGe|efh#0ka3+zGaR;W zaEaG2S9Ijn`3*WT@`>Y&eyGo>n1y3$9_!kg#WDhmS z>=Yi9Q2$O?Bk}FqqM3EG0s-Na87Ke)tX7>OCLz0mpkKn;yIn~pGvtwnwIHu%_9pT~ z_YT4SJ7S&u+QBoP6>dO>-K6(@a)JdAWwGW2-1d^aDIh};r(f%&emKa~YLex2Tc2JI z=bNvfv6M@;+2GB)=aVS^+wJ^?q+$2jzM7|&Vc+3e@1y@op9?=D9H!7aR(39Z+MUm( z)S!n?&`k;*7y54E>!QR}ty{%$C44ti4Uo)4D_&g{#b-r^Ti?puC%BeMZi|CRq+{SU zgdTlgA7LDgq9T|(CIttywh6!#dnNGl2CUrzwG;~MU6c2%IwhNm*%53gBD^1R$pAf* zON2Ay{}Y+Sc7q7Z4P=b4d&$UfM$)_7)+-Av$cP4@xSzFxNp)YN`f=ES3%2?~S=c21 zEND1-rn11lWl*&cN^26?dco&=x8sPYN(74!e%*+c&xl`*-_Ik~zuQz85w#G5H!wi5 zu|B#%Ng#(0k(ZAV)6>fz&w5y3Pwv9gMlI36R~)Iml-YM?{k>2BfULyQr6C{)dtda~ zAVV;AfnG8jSjH;uaho1Y`7XR}vvY!4RAdl-{30}O81CrU#Uupw4emz?hPHH)KvWaP ztobkB)hQ^VHP?%QhehRRbEK|0o?-t@U(p+ltVyy; z{W*)CU30oRh_{~hk&xbBd6X}8dckIfqozN@+YGN!0lcP)N9pluTkBhLnPY@%^qh>^ zG*5?ay|KRlZ3cT_Neg|wQjA%lZA^l|I=l{%WHG0q5UU%jIw7(g0h7=6kI)O3pACq* zyB402iRLk87iL^NB20cc*HlFr-YH*x^t=tKFX>q`mIrb14cbvreAWIXYow+t@M zH@f;Wyzqt9(?-q`+vL`TuGLwe=L9lT?nnp^aQepI&fvau2}E3C7Fs&qy+dZF_(689 zX2mTNT24O}pY>l)1BX}c<@DDl4GI_8wM<=xeJ^&EbyF>)pPGo(?`+n6mz&Dgv7=8p zQc~$j_3OLowkaa7zl~d+)z7cdMz3V|*u*|x4?g%sYo_Lz-#|eNMFD4W2T6n17pc6L z<_q`2%xwIxL>FGqgbaKQ;*2o7*Rymgqkhm(nm@{Pf%5-(Y#4YQ(G$@N@U>IV`A(&1 zmAeg$-%cB*05CG*H2a{ptoU48(%DIcyZX8jQ&3P?Edq7f=Hgi}ZiErV*b!*@S+gQMv0H^!j=Zb^+AxnH%VQB& z9?$htbciEs?Gmo~PDTD%J*?l`9Jg_t*lgq#*X`|ZrWks~ghUPX7=N9nQG=6KN6@#U z+o+tuOqYub)s=tE)l3R(=padi`j|FSGp-*R$zBY7mwipK>}gmi9g8kx<)* z(ZZ&4=h&0MeV{=|04F;@HFhmh*_>PK#H=rHCWW2n{Byw9p{=Bwr#a8k$hMOBcCPG! zt6_oeng*EZR6#1H?We@tJ%3jTRg(dV|D13IHYyseXWGkBE&m^^jl*Gu{%>46E7?1P zJ0?p0;;tf>G95gUN4@t+ZTk7xy?ys_IQ~fwr|4~|d&^NdQVH=0icF;-Mj^z5sQ1mx_oh}EGzQ`{KJyE>6ENTMba=sQA@?d;8I@Is-Js`ck1}xC`7p8yFrd8s`rEiQ&(D@{RRc znL>A1y&@3`9Ctr>I=Woih#I!cmg@N#e$g)+mDT(|d=Th9V(P-xU9;AQ$cuJO#y(-x zcNs9OW3BA&3|3g~xAI}QSwh!lU8(Nw6PXJ8@Q|yk7 zDY#Vnwva_KIid$o*GPqUR(>5@Q($ObBh30*u}JBiETuHBL;LpUWcs&`1hRcL^1wY9 z(?B1H1f$)qeEI#w2&22qbMitCZP&( z#8c1kijcZmn7n03?cGmhEeHtfZd?v4KioF2y)s!CJJCgpx8VPeg#ND*s00zVi+?j$ z;bY_B!L?%Ema!(0{{#7gC>+C%O9SHJv%Qr&!C5-|O~>?$DB8;yxMJZv)xS|&186n# zfqX7brM-kl@||A{2nDVrk1q4Xl}3neM2=+h!Wf4NmayL)EQV_^mLl6R9McT0$&v0f zw@v}KgB;BkLyYvnx`Ndl=F&t&;j8DL(+4CzM_vBuXZ<_e*61q?LL;F|=}p@G5VMuh zH|*f0`Yf&ITs~WM>Jb7GKpt5_W@h{cv=}S5-;6OhG9uyUM`GpU6_1#%6JL&&P1@bk zp?g&)JsK(D{)GTeqU4({qrho9d|`Ye+V10{peGH1h7H?v1}cIwil6ITa$%ibSXoQP zlUc#k9zn`#TQ!1tfuXx91}ldzTfID8?TuFLphOAtZzlS1|58ADO=FD;-F5^@K?f!c zKT)Z1tb3&_OV)eEkgP?`PrJSdIkg#AD;A7REe;N0uSSe{l*cZw+vd4EX4Nk_+Iq!` zkO`A;ySp4;n-0A+e&0apO4JlFNq*Nh|J7A7l2Cr6H)P$u_F+ul8oeh?=pdvD_~WCGt0c zELQ4#M9qnye-R9q?ZqZa)g`~49ZtMifl~BAEFaXPaQap%L|lqYtRII4j0ZlDI%{=k zIo?7_D=-dZ4FrE(eB~xg(=EblHNHg&erVhG*-Pc~w!Uao#pkUKGq(3I;{7(QY3yeT zkIT7l@_UA-4kx8(dND+5uf)_R1rY;U_k#S+nu)y+UD8gOqGIU!as{fAgr0VOA&(DEBCCkBkgW~1E zQ_Ls|%UqF=X!Ui8gq4%uz6Ajk>m~Q%>EHoayN438&iE$PnOrT+cr;T7BQraxlqwR#3q#C3@s7<#r2T5Z2n^+Qu5QX4MPunFxE4OHAY=lC7B2#?v4& z%2Jd(A{U7ftegpeLGjudys*Y0%}ozGc_E$r(!Ku6J$iD=Fz$q$=6pLk(a0=4p(w4$ z@(FtUz!=|#R;;9NI7b!XBvl1zPzvGw!^~}&FwD^>rczE_pJlHz7Q*b+{M<&AohM(c z<;IkmDiokvCZ1-{;eTPZF@Kas)!(lg4CHahZ?b@NIJdw-%-@RpUPl#}`#S^NspMO7 zG8UQtn-2xZuEe7kK$eHkS|d{Xm3gg}R#ZnNXlGw{?TnImeZ){D+@&6NDd(hGu#iD? zz~aB-PXAR$;0ZM5ffo2$ZjNzD$s#aZJ&?*O*FW%sw_DX(DZ*5S#Ztg&^m0NOMk%Z) z9=;%6(L0!E&+c{bnQQrueSf@K>OCyC;L!A&TB1E4Mv0fR--CTKy#R=$kg=T2rbAazM1=nd z1O7YM-vJW_p_cHb4kU?!0y7tQTToNAHtl_KiR8{q6T(5+Y%;^>mPHTt#kB#TEs^x3 z_5B%N_XfSU-Qd^M2o{XsrNXrgwV(y3%HGQmrl))ZXtP3njCy=qNc#26=vQ$6&+Rsm z6oup&85#7stlRy;#V?@0Q2T(^$@fEgzWqR#DHf!UAPiwDy-MlQ@BYjR6SD z=;1NTs|=iYR_>~nK@erBfkUfTL$LM-|D5io(4^T?-~uesbW+hqe`o zPV|x`{@`#ivP6G%3Ao81#t1&b4P;Y)gW2K1HGHD-E}Gxr%-h}F^-#b$(NME&Kwp`; zM5RJfUn(&1GO}6n(LSld(~fjpirR{NtDo;tw>BlNH}*jKxOav+6Gsv#gJ(p zl13PYOriljvh1ZVfVu%}5@Q_Ja~6O)u&uS|(cHsn3aXkAt5lI zWu3=6Dmq^Dq$gMvbc2ddV%3+r7jv8|A_W<1T*Ci&YyX$P@R78D?bzBfUVZhE8&Gt| z^N}(W*QVz%RNDPcZP)g=H(eqsB^4fDm6U{@dmW)r^ks!+&q{ncCK!g@J9#$9qO{-g zscdpBIDrZ%YIS_?djrLPa2zvM!`c1j^1IjnxT%t=TUjjirQ%Wrcu>hh9E3NkxU{$ zZMviww|}Fy^Eqy*U*3;a zj*TzT^21WyH&vyxzi&VsldG*_LebRQtRRG08VqfU9BUFch5lFb0yo7sRES_+%^x#>BvGZcCLbYI?JsFcM1&UY6seeIhd87Xv`(>7O3_(kjY1fKSzyzA zM>3wbb0?O}@R##B^87im%sRG7CdF4_jYrY~ehQu{b_U20K699HK7ou7r`#00frqM=$b2@CV|leK&3n zJvYxgzJ!cK+>mJS)7VpoGQ9GT3hqRKU;1CG)}k!JWsAQJ`L`jD<3T(-RItVT>+Nqe z%5R+9oBOh_o?0lY9Rs#9Ai_dA{Qy)+2ta(_OxaA|D3eM3dx zV-OZ`Wk=9o&`AqQLceCiDRu&gpPiId*MtgOL7+~54CMUFOzraZNL%|+{Y!p$U12|C za~n7kumfdnIt)(y;mN8>E2QB0c)THQGUfF~&;C>wK7q^Hdg9BkjoR9;!%k0IblK5S zvODJPd2-&)3|4qz`c1|;rGW)wW&aO#U;P$WvUMFGK=1$wEAAs&!8v*Zwc87C-s;IS7>(RP(0Yc)gAp;v99PZScu`EeoXFvGEnF@L;3c>7=ZB75 zzO>-jzSMEk^w4p$()&(OU-&hcxT0z&ulQ8U#j9|3GZbt?w{@@}(A^1?YKG66=i_Jc zz0@&D{~St?M1>g5p}%$x&u%{kvqL3%ep2Y`ShOKgLTCP}w+8VTox zhFqJ1)hRZ6BcH2_gLePp8M0($;~usj81l2_`2lXHC3>2w zC18rC7PEjG^*U!(eaoK)v>pr0Y=kK}Aj#q3nMh+q080k^T<-8240?O0MN8nmYXQYr zqPCJ4vjhV8QJy@h%ZMCa?F|Y4(7A=U50S#{SM~Pdq818a({e=1axL?C`;^M%_lSx- z%1K3RpB0!gwTynS?v#8hJ)9iUXqq(wBibIJxsqvXDUd(Zv9hw}wK!mtm$I1`qbnqT zKTIt|1yF0f9rE^w#eAwLJsRW|W3&r_sdGcROR~ZrdPHK~Q>^{Q zNrEN{+glV{`yCfDXAT!FV7pnao<4iHBdh3y-i>^4Bm}Q&03<$KJm*#T8Qwcq%{Hlg z*uR0}d3tlKM(j9~DB+$JviP;qSh@;FzD?Od`KHyOEPko&<|$fh(f7vfCi0z}hsSW? zkXF@*9iLQ$fQozhxm0qvu|$jH^Jjd%I@sg-1Q%Y=!!k8ueU-kac!WR-v7&0ubBP z$zhOHxyV-boI41dt9B@Sk#+DOr3^$;(#fyykb>>j19;{G?~AXO*{0@k^Pds5Dj+$tiCHgvg-KhwL@p8e(DIU3{80z^07^Z(ws3T1c6QzK+axa_8(5lHJNiUI=oCpKX_TL$iGA#w?M|&rSl!Qz6OH^Q3SKIyQm=Af6l^?p(I2H_PJyi(-?Ek{ceow+ zZ$U$$W`Y5be`x_M^WJbK?3L#p<_MwfmZRqtoj@HLxl|xc(LXxtYRot?EE>yZDEB=U zI=7(Q)e#oDKj`H>hWhO3Yd4}+#j%Z(gUfhfxASt)4a<+Ivw4Ch#43k-Pa<%^4Tj=jo6UMwy}Il7AV9+lc{4rN zur4?ahFY7mir;av%aCxFHZ<`du|fKAbT*4|{PM%A28gSdmJW#!>V zM(G3i8en;nDfB>d<3(B6QgAufytM6h8h6N~lF3p6lMcY!moB=xF z6Teg?cakvJ*n&&LKD<7cv|W6H%bYoT!ELaNa!B0FaqtfEMe-q;$hGugFy|O1O9)N+ zT(eCpY%TjFYVhtP0~Q&Y;oF?zYm1>yz+(-xv3+jsp#Cs+D&B6A=}X0c0Cyt^mwisT zSS2@}(_W3MHitEcXISpeE2d)i0Ls$?&SvL<_L>t@@Z)XFwWec3u^a1YKNZR;U`!*@ zz`1HKsUXHFLv6~u!)lMn5t!hho*8tt*YD@(mc7%N`N9e08Abag^yjpDC&|CCFtn=d z)L7G*fM0QBYnUYTq>#m|myK)I0L@D0;CJ#f12h+M0=ad-*XDufKw?z{n|~M07NKeQ zW$er~J4}`Vu>G^#^Xv|1|5-HVrr*1`_OuZzw19OJ_x)?)AmbSyJYjN|vA#7AP(4 z;3C4Bj(H?MQABN7aYR4Cm+yF~KKDNhvHkVZ55dH*xAye=Br)@NW?7rElws;WN2(Nl z6LU-H#fnRklUF31D{L=fLNuoRrSaM5*E)-*0G!C3@mD8>TKsW5!-0zQITB|6>v?Ru@ILb2yZSRD;rLfOm z>*GN1ibi0$f}qp9Qh1_iV96z4nxGEybP!g#op>AO%dxAzpYm-i**D!YDIq%n5xibv zxRr2|l4ypsj&MnIH|VDO9el#T%TfK5)T_7Y|pymB%Rp57&%iS-6eX z9CqI@6s?Xl-%9jk3ed)#kkyT=hF8T`TPKiL-CgO1+;!o+ZeO>fD!fUP7ZrSHr>_y^ zzURlh%=}|?Ck%C^@s#lf(G*yavp+M_-4%`QQtrn5P8qm5&aXx_(njaU%iJ>)qGIC! zra9>5=>%;X%3tUsVH^ZqVX|HjQ=he5uI`Q4z4h|M-W0^zf5=QsBEH~OvJ_`kdorv$ ztyL3$*T0&}fbthS^ydEp1(+@dccReMbKH)6uBU06q`B->-cwcnsH~6uMEsE9CgP8P zbxC2AR@woJ-HJt3{4&Y8$TIaUrae_PQm;-#o0i}^%JFdoQ<-&$;k(b#oR;v&d=u}2 zMm8cQbh$$VuSby7i9E0hl9$6NL7TEnEJl>c~j6DBHFe_o~{ z7Ekz4qv3RQY#3fADL4a(cH`TFSMVYQ;$}I{u*By({%J#{unRjW)`^iR7$`SatD+3L zgHNrx$znKGLw}#!F(P<3mv@2U^)mP^iCZFZi(p5R%ZUGW1#!R<2IroxP)4pC1=XGk`6muoDwOW3;WG!`@?J-aMRCzKYUuHmXw z8Kbq#MF#B@j{!Ao=X^|N-zR--cqi7Sszydw*(W==3klG7jqyml`tA-P=_J?bQu7~r z5iUPL3sl4|O}BwAMuDa1rOPHDHJ)uDzD|RBuv>G`hXWutPgHesEF|~De858ulw>w& z;t+T9&QOVMT{Y8^en2xcGKj(c0zGq_QQxlaA>6gx4btV`TbcZjg(+QXjN^Vu0zAsJ zm(e?WrpKwszc8W0@HYz;ivs$mudYnAM&6q2hVIQZLxB%P2o1xao8I5Q{e^If%BSoZ z?YLjNC>3&@*xuE)le)3@G=WMX*2|8$A)j;Hpmjk)P0yg`9d*C4m2hNIhE(ekk1ySA zm)T&LaqolI(xIoQhWwC7_UZ5wfj;vzu~+T*#XW#P=+oD__uA*l?N^iz%Qp%vbHnN| zB4OirwFqgLpi06rzH>Y+T4EA0X5ZGweHi0xtd#oAQEjI$-FaNsx)uRP647d*Jowb@ z^bl6=X z6WwH~4RL8>|2j_OO44Lb)SnCoBAdc$ z8^7SJp&678@p~djXgulo7prpYEC4z~I#sceBtBk?P6zBWLiO5Kw* z9Q9HGs0xQ#zL|hk;TvEU1(crYt#9&0A0;L`y@8SRz@l0Zr3| zHe*Q1*gd0CqMSI>q=O+f<)uF)=y_aoYEjgU`>fAwWQs@trs*rhh^uvV`&w@@d8k8y zP{?Cmd(Ai`C{cr?+B&I(K{lNHB+bnt;@OQGMqKQGT>hZ57+!+OPM{!yNj_ z=YP zdR1h}2O3}Q?kv9Z`y@_$fm6m?(g4%);%^4j?u9%YM!YoT3*0MSeubLG%(AUC@Eoo+ zG-D?17NcFC)<7-(%eJ8W(Po33_Sh?ErUucNm`*qjikQ9Lr`_CyixE{4_F+ac*F{!* zFC}i|Q@I;lwQ-9>rgk287+Z?w8tKGG6+6ko0gZL&j{`N!^nlxB_Ul`k`0$t*i72r{CgNQ@my9Y(YnC%8q(u+nNJWfA*9 z$95X~m}@4Ysvz}~H9L~CPE3=iUg-dO-#MGik++42~g{teJCblP7}{pbYS zpRO*cVK_u2x3QIc-TdrTo^Z;NP$gZ>NK?*2Fo}=NCM49>$G7!IiEl55KL^%9^^TR9 ze9{*PL5!%e$e{xAY49{E)XHx${%byTy+_01wI4SmC~ojhOTD2Cdnz-xA^dikM|)W^ zldcTdVC5MTwPz}2D_NrqiztQ;xT@O5zR%TP#A8&W8D+j?97wPIc6n8Hzg<~s&t4Yi zTGyBBcrOg811P(kNvJT(AqM(7Kro~Dx?de%YAx^mq`fDWqH^L_D$qQRFt_*TIf%Gx zdv1Fgo^jR?}rli7{bC{@=vqg=4e&@XX0jSuMNHdW+`7TI?I01m}_U2Vb)t2-GG zN8IYhWLbv^-y6}qOME0b<<_#VrUw$ci0ajQdPh|-$-0Lb3v>&eIPT^;nb{Tr%phpi z0>ax6wC?QRm)Aj8KR!KSkJwbkK}SpNao0_0sNCVMST1%u%(|X2Z7qozt9|CzQiQ5f zm@BpBN#Q8@QPUMCi(Bs>FfB%#opfq7ezCeYmbHW68OWJY2piju56b`fET#*N{bmD5BJ&pQrDG|(aOuLB5Nap z?N$Me_fnmFJngjtt#sUTximCJTA!|zQwXhBGpCm=>zx9eA_fKR9&p+$Ur#`ewLKes z<$Q5m71Y)Nz%HY>og_&-ms_1`T2gv5vhz;XBh(R_BM`e`79SSJx%+8ix~X|&nI9V1 zeyjhMky>cQne|Yo*_vsb5xQ;SeHvb-J141B&FUP?|04>in_%-s;U>xQYL z_l+pbYR9m0dd!#9sL!&!lVfuGlLzAe2D!1D9rX>SrRL>Tw5=ErNyrzee?h)Lnf3gf z*R->n7IX&Ye?Kufd=Txt2_?mj9Q*CYPTVbNBrlS%?2Xr8Dlajx^79&>`nbL8;p$Fk zzkiXV+*0QO&(8^RrHnTcO76!@Qm!mh&P6U*0KA$6<+eq_`AyAZATeOp&BDwLZb705 zWOeS0I-Rt5Eq?p~S1ThK(YMxlz)6P@-5@xxlQ%Z5Z|pPQLZzn>=Pb=UsSpMa*F4M* z#J*3TCO>g2TGvv03XZdt*UI4w_&hLC0~}tA78*>jl^fg8&c_$WJ-R>gSI2d<+C<3U zB;#0tDo@9&!uYeIdl?sf>XrnwT8VaGP#7u`Fa>8PK7rxfUP8)v%u@r4D%bNF0Mc4{ zohU)(z*mg|1aufI2`jVjp42HNg)Gyws`WgM_V5;sP<4dgx6pEYZr(HRjjwH-m?CQw zhYQChuo$$2y#$wzqxA%tAo?zobQfL(n%!rPng8smKp2)UAOeUXB&w4eqYOTYX(24? zGoEQ6lMo4=z%r8!$04Bno7Um=dwbn}N4~j9CtAjx zMIQ?+lFMVT+x~jY9KM^4%bJIzhU-Dw>+cectiD;ikIw8A-J|dKG>@nP2|Ft@_DfsM zr0nZ1!(y6F*G1MzSFAKOz{?|WqJQnnoLwB@XETZ-wsfZH%K3MS-9UlRmz6uegixI11eii#jwp?aaHtAJjZwxojN_q zuAx?_kH0V~?|VNV;ecu9Y=6&d1bk1>xf2%Wtq2E z#eVrAB?9@-A|f_|u~^%im1d=mO973%xdruj2ABZWMcqi?@ilicS{8|^!2?7ZfTo67 zrqGo)edvT=A3*Cg(4FjbkT8~B{{~^tFzXT+Wb*DX?{gU?%!}YKRluLZMp?9w8*byK z*j*hhrD{!U%izEDlmW=Q@shQKiySTTH-~;~;0umyk3!8m> zsZ>%?cniokWg&K%ZhbVw*kh<&^i zp+J{|ptqtxB0PcM{DG|Oed{+4`j4+bEk+ui%kclkfiH=+nQdO&5AQ*5pGFEB&YnXLh3&uwrP9 z+KG1{7uElk!wy?$gB4qE|Fjp&K2zL;h=&!OQS*Ge(V}7MirVE{uA_&C6Y9&a3c7WYS@)bY><5I8jiIW2veJ(ql`l=7O=b@N;28k8Ov+v3Oe zkGHmX_RZ_@vR*H8%XXKe#%8i(F4)%uBh8vRB ztf1c-=lyn!!RI?O?CZJEw1xlmnyNn-eN`pcgnuaaypr#?WoX$x&uZnaiNEW->Z+o? z%3GF|_znH;V;;(IbgI#$llc(Ud|z|7*s*C-eDkn$2E$hcnA^pT;7WXrU_B zn5T@`_1=i$DB>dp6_vmPC3dhe0sq6jT5^5IQ#_N^n!0zJng$f2I+-H24%tnTuG$7< zhyp^UF}sGB)}av(i1h_zMb9NK$0GBoxSv9y<=(Png#eKe@!#UA&t+g&)iNxPkyMF= ziRUTs$$;1^(;^*tpMs%<_p~yjy+8E8)Rkf3P9svyYqH9SyXBtHm%ltb zoa{L90VN=FljVJrU^XUd*XQ9>-bIwh ziTf|V>PjJFpm84u(m=wNNFv0<#=ag^beY{f=5VZ6$*U4}YiYGmWm5|%%>JPcevP3T z>fZ9ls&mS{w5rOqL{w$(^Xr+GTb;`3oG+N>!_Oz_f`qmmzlT2-Ter3&XfgGv9qKsL z=NViWjL=Z?<-YKgp>r9Av73Eav#XclS?L7 zUR5m0!@aVJ6#b4%xTVz=y9UzNWm!(2Ue&hPLSZ_Md)j%wzYW5@{XRQ%nyr zVgpq{!oATllhGAw7wKjBVHL3T9R@hs$?~Cm3~^=DloG#@#jHM-=Zm(cbE88CBzlZNW_>dY1gltTE#9>1lP1B{#xL^}6Nf-?Hpja6B^z5*?-GvRAwn$&B5L{rQy#fvni(sw~Sl_s++uM(q3Qw6kB z5pBtE6pL-xd|E6J?j??DtIEVJ7*ankcGXfVq+6-R+qh8zb|oPhRcGmwxFyv|fm%hX zlaV{nEitENYoQ|4xYeez=<4dJRmS}a180ZCPU2A{xWe`fpqhEVt_c?xekcg!SpNquYmMNKpZAI5r7MUSYBSNiwvxY*I(!V%5ucfzZE>#nU< zJR;qcn6#OLf7olI5#pMF&s5i}7RW>2qd;5vsV9#A;Dg`vw4!(%a`hS@Ld2aX@f4bk zbtOnK!S>ODTPY@pQbez5G>#JD#moH$cd9St6yZ@L+XbDKH$hL{a#oI5b7!FF*r)tM zZ7GJbJCt0bsPRX!8>&@p{DFjqZKO8h%Jq+~0Xi}4L5k{M9T6rZayY3y8mYF+FmP4` zf0Q+k4pGRBN?W&uG&r4zue2Kk3A%X!!}|%A^z}dcM4x30&1bsq-d(2HCaiG-x%22D zMl_KG08_pzXdhF2a@}+i#RoS{Of0=ya~8f@-5qk+LP+A{;6(Dr`wonVJ2oW+vkt1wMT1sE%(HQXs+ZaVDVhk@Ac z`wxzn5kpUM~dP@>==1dxmzkXt!5%yMva!eDSj=Iq|!-EtVrlZggy2e)+y`v@aW;NU$ zz>bN0lTfE1WUQYFnVLKLYLhybv+8IcJf{tc7)U8%c8xF!3q^RNzMei%e%U4tD7EHC z8DoZ9NXDM9sadL=TbpC`A5TFiHzaqx``LU%+@3sn5bmRVxyetCyO0?D9^;+5 zbyX5kKkr23fWJwkyi*Cv>PO*H__3MTlZXbECDp7K6;PhuKmY{a>KLBXV95ejNY%zO zTE~J;T6EqvC@Bp30I#flYZiELU!<6TH}_~%bXxqY4NsDzaWsPC25em)wM_42g=(jk zZ&M9R{ngl|sPj%tpuF_)=3~^p7|wH^b!nElTX7PCNo*DvmRKYG4z)EU{q(;~8u*7v zPiz{ux($~YAo3d$n4G@?e+cU&Yqo?IJkIA#N0t<}_9UR^i4}Y%Ev*>Qo{el%^bntI z++EHpM^je(p`gVOyz|yeoj9!$eoc}#^LnbO#RL9)pC*v2bpp*%_drj~&~bpWs|avy z>q0pqOVfiLFN|DBplNpB=Ri$nqVxVxyRl9msud60wJtT4zEXgYDn`L)ncmLb8#HVg zGdK_mp58r)ekhlb2pJN|B0rSAGD36w*l%Rpgi8aFOB#)eZT6*+xX5CV4}E$;-@l$J zOVL1`ePGvAyz_w9PDAv?7IBEe_K*XqxwCC!L?oT-yS)#&#>7ZrDBZKg*+Yr>H?bBZ zNtK=M*IOnJC?Ua`R2N{Y_FZS@8#BX^!2X;tb{SE-_#UO zUD(E15vHP}3Dj%jW;d)7Hg3e*_)E%dF!q3nWIOHiJ_~=$z}Do6od-Z9bAqj|^QdlHF#4%zt^m$I93xa2S5N&$;QJ z0;0_^a4nNyGPHo**CdyU5l|_gHiHVtAuk8NJ$1cHwL2$`IM9cwakP7Bk3S%c%^4GQ zoMG-Uz9dg(ZrFZGz@CEwcbz!|+)#!2C`9JDUAN+FOiW>oAp97$Gib%r9pz5mHFH&g zFk&KWe*~!(&T(z)Ning62Oq^H6N>3GkZOP?1$LDmzKpx=a?@q?bT{o| z#ZPTaDQYC-pYO@`S*ebrv8b?P-4n=UvpO+-a>V_wa7(7tzTnt+Hc686T^^XWb?|Oq zdzV(x`eRgLu8y6v1WYR#siHi}b(B;7}libRO#ck~Q zp;c=1_`x=SAq`Xb!(%jF?HjtCQLD;R3(nm=QlBU6=JylS4ca@vH^_duRR3gDH(_NPi=^{zy$UdU<9s(&8)}nN01Gj#`q5Lyd7qr*5 zLtoKZ*#)16E!zW#*2phce9-rTVmQqo2|zoVgDH)b!Ip#ezZSxWH;6`tegyX^K(?72 zrcmDMh&r^1o$MqnaSk2r02NaR|BB*&4B%P(TkWr_FT3ta*F8Zf;JL*`9OZoW)6)yL zGhJvt&#egB%2e_mCsyp5bZ4%Ef>|M+XQ_g(ezm!RtgMsl)`YGNV7bb-q3BI+EjCOI z>7v256561J*#-zFna!i5c&fV17K!zuM!D-cTG==;T~ixtmUwOrq^-E{57DhdJE{wf zT{Kh0nbw)L^9yQd!C~aCi+g6`#+Pz&oP#GKi>9?gZb}Yq=+8bJR}rJ@@yi-IRtqH& zW~yGOzMIfiRU-I%f{j-)vOkUeKvq?1_|~j&-^pZf(@8GElw7H9(=TP+4hqHG$MMy> z#z)X(=2sf31T33VApaJ5)5y*W={veAv|7)h?wl>k+g|0yzbPr@cQ)+s>?0Sp9I-gmR4B7$WSr+go~av7+XSVjEUmZldH@|P%j)<#3dYg#QH#R+${xYf>? zj*po*LZq7^?2NLmf`)v%j#iO6Tf8}dWLMBj29JX6Bhog_WzBGkxa|6ruIX96z^!^Y z{8NdjeVD!AbfP;~vuZh)rLiHvp4NrxPXrUsc>DWvoS}BgKbPQt4c-9cQVr}=j7F`r zQ@FG&5&2DcW0D8WJX38bv6SztXJ?15gCc9zi>Go$k+rmk62n}snjIaM*#s8?H zN&z~vnc&L!iQjdRtL(Cu=Wui(25fBeTt?sovj+sl=>PqV-j*EVcqoYfhXei!0lI~7 z4E$@RV(G_!57d9eY#&R?t~US;0u1HQzZ?Az`#Ys}H6V`9=+911#bpMNv2j^)XSH+> z73f_iM{e^zwRO|5Q8ovvk|w$~+~#4#28*ClUr2$QEW(8If<<$Kaig9+r}aWlKS!yD zjmd`Cs-Xzdr^-?h2$7-*u;2*Lbk^8qrY_}H4@DYMX2lv}lpkEy6QQQ`y$Tms1AF!) z1Ily$v#7YNLN^$C6X5ekZVVWSSjk>Q_c2b)M0BX7t<#|PPAe*APFr*ei~8<+dNu4j zJ+wFImSc!$WFt-JeWWji$0=BRG->@%FJ4Z>H0jroNpK70Db<_#Xd4NP%3WQ0=VhZx z_l8?pC^|TN{i%c3;U4M>$H!sQsKnsx(hb*%tz|SW)bKD? z6{UjYNNyvhD#)a20lqFUktj-X%`=QUt3>6a8g7NuT-<@g>#JZN_SUdc``%EUTkL7}2 z2W!h@*uq>0WxG9HNKN9N z3iM{R)sc#Y;m?KTQ)A+9-lCm1wc+ygroP1!JDl-cXk$8_(UXr7z{VlyG1)_HABpp8 z=BW)C_}~_avs4CVyclQTarpoigO!uZ%DYmQLAqWKuB+}?rN=}D)j+gdp`m25Eb8cZ zp(#u_L^U2UQ&?6tXr)}Kxux(RW7F|HRJw72qONp#tsDiHS)hEt@ zSsQ7zXwj2vrx|`(LBO+hxu73i5vxGwOCxiwUseiTt1$!6N%hnCd!VQ?h2;9e4=W$T zK~q9Be*UfxW0#=-B|qW&VI16-{3HfOzTm`l?AtN_>Q77VxEQ3_?7j%j_Uv@p+z5?j zQ5qyHaGDQ*2$MscI6t;Pwk(v6M2xyCsl%T^JuBgt%zLN~#+O3`T1XSn^|H8$k9!R4 z%;EE@^mO_CX@$gjXV7kPbM6({yha4YMOVZ0{kr9`&7;pe0Ta#|<6KHX_V)J42q=;@ z{-_k<*^37VpB9+{d-KUg!o@kg^cOz`ECfK4(m)r>LB$HMP#N;gRT&t+&`hB7;x1N6cEi*K0dhR+hxWa>cHhGQ{d&^!jew z!|Gu0?JCH5n)=X>nKn5E+lLyP@o2lTsw(|3IeGM1d(%#!e~l|FI^0P$HI3iwQ?O?m z#qxrKU?kQ1NM(nG;>|=m*#DZgmOiP4T0S+yNkk2Dcd%{^r$|MYEI-Rd8Iu;3>)ybo z`qG6D3R`N8aWsLnlGD<~N>(ELOXcpPUj^(Ui5QrIrfOtpks_F^xU?X|GGH?~*>SYc z_BDoWTx?_l+k^D-&W5V?$gm62&^yHqcF(_Ffkt-?SF`}gh(Mz0oT2IQ(!EOf1fmU} z+B2k4-E1K%i0EE*LO?*g!{#O$Ckw2FSQ2iC-E+Zikgby%WNALc!GuzpJX6<-D%vGU zvJfVQY@;9}mxiqVFG9i2WsNo4AtKScFok>7h*^+S1>J}izV~YEsz5qi)L?J8Ppr@n zg$Yxs?jRfM+DrunF?vn3re67)H5igvg~{5mia^cNbSfAId)Bx4h0v`#_aUwfO2mw{ zKO8}{4P`~QdEtQ+w$B#zQ5dbHds`{X$^*>-1_<4fn7Yo=Jzr@WNi|gyHPCXIF7jaa z66r7tls@~qzYD{Z30B9$=iTyPgniP`s{Q!&dx=Wql`hukeaM{u2`{FvJ)^(+C6MOx zvZpR7mDWDqZYJ6G=l=|n&z{VB3f%aNzormilKNN%)_XDzpW90S(jn;AUT{wZ$$4Svl zu#=c?6^Eoa57aW_Poc_1ZLGHSZWn#XWV_If-$^2ho z{j-lTIlpt$lI=##TP(KM0LM1ST$*lGDaGpuW2{79U5L$;iQm40;D*vLL2q@8o1|72 zl(Z2aIoD0bm;SZT=A)WUvcMQl>!*S6vYNQqLIyq}Fx>9Z{kzv)kovdslyF0%gNNx% zf^UXXJ!85o#Pv)eqO~mxdm@yT)X7`oh)(sJ!PS97#kaAfR-@YQ2BxP+7F6ZtvdL%S zh@Mq0MF|WhF<;iBC*TI*QaD~5inXu0pH`6EB$;sKFM{c(KGoK2qLgUm1G6qX><~N^ z32E6Pwk-YZe)g)DOf$^*hh?eJjc;S9oYCHxsIiyUvN@Obtmrlm5T_~FQHMy4W@pvd zJr|LzplNp>Y_8lKKyJ@Q6_et?*d1oB4zT~nvmoHP*&&sH(vk!@L{#2q#ZLy1RAAYc z0)BpAZ)sq*WEIf{K_I;dsb_?K+f-2WTTI6kZ$;UXAkx8C#TYeTO+c7L5+X^gCx#2L zReL`N{t&5QF6{!4_Y?aC@X_%L*xN`?dFC?_x;^U<;zbE>%7^=)y9pV*V?6r(l`-jr zr`@tR21;%p*J5J{w<+AGlAEby(y^6AT8LRS#6m**{F9lJ7y(3p=SOvpGm?YpbcGve zNdVm-V8~brP@_fy#w6jF{@THt(niZLnZRtLskBnZj0D12ykdG_jvE~mw!ge&Vp)x~ zjfpxj!iH_<_LayQ-?MrCN>!5$B#RE#6nxD_$yCXQ;;cDqUE3@Ua}RE|jDda;z$`nD zw*z0qCJlK@q8M*}ilp;-@$NaE>s4}4C-+OVX(va(o6xQ3^q?CBsaF+YIfknaQik99L1hNE_0>I$%Iu3zsr17K-Jp; zH?yrM(jL_+kx3WE%!~?kCq5$d7_#?QuHck%K*m&J`*z;dC-Q#Zd(Vum$yH)Ww&%p0 z9(2I{FLUim6m&32^8SsXFRs2boY79^-A*$j97dQya^vEPttfeY+SK8~epc7OcCzP$ z;M&S-Iu|G8_AouNx0*;-ha6zrBCa)Nll@e7JMhaKET1*l$Jowm)I7=E4lv{UGk>NL zx=~`aI~rNoP)d2t1xq}@3$yL7so)?Z&|Gl0l!?$vO|+_?iNxK_e3mgzvu_*y}E(dY3r6~=N-(REC=tbJ*mQO-u=Ek z;XoT)=3~-Q)2;6J>Zg5^uDcDobfo*MtxYi4F!O`1c_|aBAF~!+3V#Kvc8W!nt)S67 zrs`Dv-IXCCY{59WJ=gwTl2jyCV$MsmBz)2;3h@D9U&sgmtC{jP;_vwaFsut<@L|oP z66f-4L+Gi#p&?M|VCJc{jeuMAXVjXD{_s*sz5&yh5Z$4s9hb{P@*A|mAB1Oehq;5# zsZxu(9@B{M>J&UD2jc4m?x2Y^tiBnAK4=)8;wz(m))d9k?hE+~3fiD4HB!~MRmT~v z5;x(?JjNBV#U%EcuCfM@oYRK|qk?KL_FV{1N5EU4ekfj zlDHq%Dz_7n#y2jn zU%_t}l}^pBQm_OG0kfy!Jwp7q z+1-%V)sRkV)k;*&`&V23*th;yvwTJ|biF$kx<|79ubqFDeG7a8b;T5&?EhOy)dD2q zIJ-vj-QRlm=f8&D>w0U$pvC=F$$t`bHVtoxdm{v9ufNCsfBlRf`?b1Zem%6`O1g{? zUQ=m{@4K>pGr_+fDTKTs+_1k&3I0|xZvg?bpGG_K_;=9%?{*lzW8kNU3K9RCasGTv zqkYZHYXegF{_c7ID$7QEt zEU{>KwdyE_(ev*^!Sog@JIUu4>F*`~{|-`iK{$&n#UReJ8&{^I@B(|L zb)EMNeyAeY386Eq!!OJ6@k49ajKxl6aNh}J>-EN2>BBIvRn=2guiXi^6GiO27?7PVtUYaskMh0;Y2$bg=ersaHu>g>k9MeYR;xbxUQnxM+@wAY zAb>1Ab>lf-tM)SDmEDkFgHl@a^KZCBxoX|B4t zSk*Q=B8jlS-^;FT$xeQ@K1P1k-c`wei`RGN-=`R%q_PsBd$5$|+x zBkuJfS;cZkB(P%bXJ$Ldyk$3~#%b#;P3){BObf(`@$!#JIsX$PwPHt0Tf;>$Ol+1en!qr7(66>4?wc-A$$RR*!6FJgxZSb5E45 zkUKQ2)0)U_kNC2hM$hJUP;xuj&*rzgSzZ^Y&n_C&@`Xymua|TW`1;OWM#d=zMP7c?UmJ zd53yiJfWZ!{V;^2`PifKh2lX2x4FY8oUzjBNa(@+^ZBtEZ5{nf@a;X{dU+tgMa}mm zDY0Vx&|0s_sS@M3lQ&Q(_O4@5y&3E5&D;^_ZL#0cP29_?LT!HBQ@#e{qpRUZXY1uy z)W^vRQPVl|RvUW<6)^8DxOQQ>?m6tVSM(Hd4-Ehi< zAu`8u>&wg4^DclsWug=Wc!s%Ap1HCsb@?PD6D954;iTar`6XPRs;QBt zRp$vha*k$w$oRYF-4YdYha;Y~N@+IWBV)6eHdFsFEK2URbqR`>b-~RFIEuIFjFxm; zR3Jl9emK`oVYm@R`Fs+^aJf~Ti3G-JYrYe&zq?Z>Ci9+J6>#t=5;lscF|m*CQSzU$ znM-WF7||BE$Fsf==5BX-o4T02(mQuJbB1?IgnX>gKgzc@8)tsrzUyb80EX0IBx-u*^~5^%X)=*bpqaWB06ohXC3vb%$@2rA_^qg z5L!RyLcM;c*MxifXO7>)In#;Wd89VAX4d`bZF_iCW4S`i!8VGEb{{*tHO_Ht7@XUB z$32rA9E!7|Y1ueE6uJIrqLSx)fz)Xbmq~U)m)YG z3DbjYq#~NvK4dw3~nnJ(1nvkx>vR?;t(ZYXi z5&s)-*uF05y_QYCb)TZj@D++QhNnWy{RNQzuinsCC_-=5L;L&cOpE>sp$w;Kg8ykv zif@{)AjKBf>VLq1lvfx)n`b2Odv%+TWKdVHUuDj@&0PL%?tjSU7lF**v{-u6K8^e_ zVdU3u|A&Czepi&dM0e7FG(MAgkF1O07D?RskI?@LMhJxX1ut{mmtgjdSgbK8Fh@gh z|LN+lHlUz7dv%07W{*6AtMqJ5G!-SKoR$`xm-A6}5#~LZf3B0S^$wxmcD~r^MAa&_ z(Z;w5RB6X$MPL`HD2YeYLEIm|esFq??~!1Phd!sE;FIg~$)n8wS@{26&!5Rpobqd> zvNN&iUgY3CJ7@2uSoxmt^1`~N8?dwlJn+16&-r}watFUw?iqC2@qm0-^l0e(<_!e3 zxUhgC%3L+w;nmJV8`@pMZ$nZw1-;E?|54|VWQwf8^Sl@HT<O@ueBQ%iMfQpmnIujrNt8TLO&nuW%!J{1ZUF zN2FIw3)Kk`L{9gZuiD^IsAXy`=aRlPN{2oY_F~{+}-v4Kl>eL&QA>sSGY0&fv2mV J%Q~loCIAK1gn$45 literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/knitgeo.png b/docs/interpreter/screenshots/knitgeo.png new file mode 100644 index 0000000000000000000000000000000000000000..d1eb0d80ee2faa1a3e8c414252aba6b70f85082e GIT binary patch literal 59594 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 literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/knitmotion.png b/docs/interpreter/screenshots/knitmotion.png new file mode 100644 index 0000000000000000000000000000000000000000..a1048eae6a6886c3d45a960f01be6286e7fbaa84 GIT binary patch literal 33468 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±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%0A-!J== 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 literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/repl2plus2.png b/docs/interpreter/screenshots/repl2plus2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f700924d2fe7fbb1c1e769af44f0795ca6ff16f GIT binary patch literal 13143 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 literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/replhead.png b/docs/interpreter/screenshots/replhead.png new file mode 100644 index 0000000000000000000000000000000000000000..b09ccab6c18c7fd4d0b0d48872ec10f42b496307 GIT binary patch literal 42923 zcmZ^~V|ZQL_ck0GjcwaW8>2D0W3x@t*mlyWVH>BhZ5xf**tYHLyu0Ujit~T3CttGm zT$5uC-eas#fPy440zLv57#Om&)LSJmFi1o&Fz`M&7*NX@#&;bsFoY~KF)@I&m>4O* z-p0ht(ijX(Dl{%0Rz+D8zwgvzKLQ(0TxL(+9g(y(h?&Up6OrxD<0PK%5IgS$8ICCjLsBlnZk(0C=x$@8L0@))i2)@3Bm;`#CA zMfDOZkIxed52FYP)YMA865nhYymqx-DZM^-BMvpzxfMKkMUrb^Uj3!%zh#cLy*Z2Em zA`=hNa&$DIp5!~PlXizvHg&8&3=^7OW{K@+#A2hpPT!=8KkeWSe=ZmFzTxF_{-g9}))Cx(t!6*Ww@no_;W^J# z*8K{FsEDHPn<8W*oEilKiJd^$>W%PW)10DS2bYxb>y#>uRcC4IY+8+GcK1 zO-3=^c8~SNUqcvFLc+(7^s&c*?+M?qYjTos5JL-7exrnu9_RMw>%%_LBiXqWHVpBBg+p zt}!-1mHBC}p){ZpL&D=ily~CZ!BLaJb%|hxAQXyfMGJmF&=f=J$GY(I&#ioIavbgo4iV#!N>%S`%Lw?;KiP(iD>TUClFOlQhX%dHF`{IPYY5d4u_V`{5+rM* z`69(jDLG+;9#!*2MTA$ONdceKi<%)?zF%)E_XC?7!9D9e`90aaK%gjFMuYMOoo1|6 zEX<(sAjcpLUQu`>l5!A5wMd>!o_L=6P6VTfn*NNKbE9RMW#f_b{9;wMJ=7b>H!N@B zm)sla8#(Ns?Kdw}+!*cw_el3f_Y@aATftbi2rvkO2!w&2fdL2!STKdOMaWjsUwT#P(vyUx`9i@~0NSh2EAuXF9H?A=L@KHaO zD^?&jCbpiQhwhgCT>&G&PF-4wPQ^^EvHU_juIwN?Ij>2qR`t3NUu)#8RpkPGt(Up_ zv;+<i}*hbjA%v&rax^p%X+?T9F z+!mY!tocc>NxMn)$?cWn)gkqBhCj^CmnTNqmoK8X-!niLgB9}^I~TjmP|sK%(jR(o zV-o0pL*};Pwy~18im|+%7p%x$fL^q!Jgj&$IW=IZv8f`l8+VYhEpXm5rDgBJ?Fm1O z#Fc#4ha722B*Zt*XZ$AB_F-~<_|3?D$mJP%x43i|3KPEL4?Dv~LfbD56S^2Wx6Lw3 zHOm^-wbo@T!-oqiB(AMfh!EgxsEVQee! zUk8jogCC<==dKOlU9e%4N@pLz-bez|>r ztM;wbqt2UU3v-3Bijkh>L2H<~?LKDu9hQ*1mF&ulu91F~4WBcgkH;!XJ<)aUMQ&qm z0AGMhUF?q`gdxErt;$1*Mk}`w>kaF3YiV(S_#$zuz~ZfE>6Y3``9+C&nOgaZmOy1f zb-hdaV_P16L~>R#%cI*P3E>&vxRM1x+xwLV>*HFO*pFadACspgK)#x~%Iz`hOGS=g z3s5FNOspI2nu03AHoL)YYi}akCDM(=!h+p`cU;bbnHME8EUNv1YCWM1!;gknfn9++ zbwWthE7`rN0@_@2nSEx^Dz2ud_BsXr_2iF}CGQ9IOMTSzX+do#g?*g?w~hO!OJy8; zmT-Mc9m3XFd$Wr7;(eP#l?kW1nx46j=4;c3v!3O;Cs%tdw#(ZO^8^Y!qe~x_EL)9z zigSm`4zFyS+fz^KPOTe{ZJUoHH&buY#07RemfcyFuiHG1i7!`5AIWY#9kl2 z)yfv+&4PjPyYhk_t&ANFNnNchtsQt>1<3#D!3%o+*~~&t`cD@}3juNsc>t-HjlD4` z7c(a_E4d&7DJdzx{Rb0XrMD9Q4hQ`bAphv-Xv@pO;^N}M?83opV{gjB_U6qS7FKo^ zc6KIE4<-jUYez#@CTjb_?TDAU*b($jg?jW_r+U7kaB3u?>5cYI-~p6U3+D={??iv;`b-{9^2_aQj`SqA zG@|?@<@3{x%;na-z}V@%z$s1D?zh$LA4JY1m*jF6?jEMs&x9sCWqDxGw8G#B0AC2q z3^3>oIpO@t>mtR~u~znGp`1@z`=|(At-%YyhktdV752NsI)jA;y71`f?3O`_z7F80AiY#`o9Cb zp`S#2ZH`-Z>#u#(PW=orZ8B^huFRN7`xE)`%wW9cK2kKWGAsXY z=l|~SoXNH*7i*+13fB8cT_iy08W|U&(|@63)jtCwaCB5bPRNvg;>!J{%`^W$2S?Wt z=7N&)AtN+%h8_LBy75ZmM{7nPTBa73Li)*vjB)j_bhwK`chqMwo^pm8&2`Bs&uE1Ah`Ly`a+o$5y!4zm;LdgJv z^b_7valB0DHQxVH;v8C~*uUxYwh#QE)dm3yk-od#P(5MTo05-1@jpi%pj)$0JsWYy zrw0H`mu-gq-y&%#fBMXs_4{UyGD1q3QOR=O4aO~%(4 z;4p}$Sv^*NT}P07M(HMJaox&cfm%tZroAW@y9l`DP!iY8r3e!j0wE#p59N z9&MS>dW1^Bzh=xCK_Vp9F)s8U5UhFX4tSSKYeE>N@D#PH#2e_;~_g_u7iO7H=W zIRWu~U*xoZ;Py~LFcX7HZ=rHNKwUkU?R{^DQRPP`l-gyfl0!v;(Co{^zxG5yIvyGy zulDA|H77SWvg2Hgr0QOUfcUO!+mY zo3-Ty`1tze>C*0`ao61A`F_l&x3qrc^Q^v)Zu5E+CT#%`wOnF`Rk?q7ULLjQStqRP zer`g>&bUZ0 zN2~25>bg#GYTjddmHI{%uRI)xzx<;?eli^r>A3&y%kAu3@yV`7?xkXb5wUmkxiMqo zW3fgw^`h#aa}Z&PhBpyJ{j=3+mQr1#QXL!d9ftQax$SLhJ-Phg!plN>Mecfbh7yg@ zfN8t0?3ldB5NvDxwbfKm)5~%Q>X_!|@)ceNxz^qdtz(U`p~@SWIHvXf*f$L~GX$(Y z6KghnObIE$Er=ZFbBL!OMY>%OhZ8+cw)D19t_%lb>9jI3AYi7OGOQ1trJa=Bk85XZ zzIi!`2_`yje23@c;d#F^oTN3><#F1Yf9$*-h_i8Jwl7E}^2yu_*HQ^Q9O0wj{T4<} ze!hiBz=C?MeZd8&KV)$CkK&a8CcflFWMGl_WdUQ@Z;Aj&t9+plcDGjiwXt!>Cw5jj zkz*=WUov-}H7M#@k^=l?^Py)_Q5dfo9f@6~5ixgkJP52cSTR2Gg&%9Db=H~IcetJ& z<1SX4jZc`>K)bx4YL=_WeU;j(c|uL}(?+oI%`8REUwpUGdhFy{X-=WA(g?9*2D#)u z2pQ+9n$MMP1uzpac!p>NYMcM1ojS&Y&) z)~8o+giW&pK|y%RwziAdp0?{kM&222WFON{dTubx!Aij|!#OgSq4E^ERe6@7Ze<_s zL6;~4`J8nq-vFFQQ}egwEB@xeRVNG$k)UHQy|$xg<+JQGD}rpU zhDt?XY0+_azFBLJ&7_q>G_hJ`+k>V4F@5?q{4|ppt28uD(R2riPRm&rBFJC`)fH>` z#OPpfQHw%TQ^&w3B_##WIcwB~YF1Qu+@9#su)3Tq>80QM{o#uYN#WkXjkRFsmdP~g zWu*_TEz~1Jes-Q?+~(5TBdn{w4)sC-IO)~zfx7Fk2YDldoo`!0aD1NO>P$yE#V?t= zTHGX-JgXHMrd+B|gPv1eqVtF_Cs1FYPzKqaz~8pJ7Yg*{QJ8izmWBg;lvpdrE{x>~@A>O#FRr%52}I)cO;vjv)~-upPM+*!LkG7dLg%tgCgHi#*mn zmn2&mk1Or%G7Fxb=M4L<4vWq$_v?BsE0pC4esm6HJ-R%_`p>FTw&=+A0Si0>$89Wu z1vp3!tSpul8O|{u--i@d4~6B|dxgAPD%Ie(d3Ytuce$)OOTk5}aEB1tW|=BwXE3pcjI438$->3O-qs|^VTPQk00%*?II?m)a@`|Gjm zNe|QA)`=_x6L@E{b6twBHZOs$`|`-e*OXE07KY`7I_|dcc5j34P7CtS_ZnmYnI7&O zwd?o#R^KI;p#w`3wt~Gx{hLs^<-Rs1kkhcVOvL5Ca4!n+e@cHomuJ-GM2zyD^k>WD zKB)fIRH*(8oHj6tn_{^)C#{sZzP^6#xEEbl0z+F|i3mx>C0=B%2~f^2vV-oFcEVAD zOnKIg^}iHlTJ^jf(W=OV2qLg)K{J2qx*QWKwP@S*DZnEjAUG!DntdsZOM@SXlIGw=5oB zJ0B*~hIZ#Zreipo@V0!}<3y?s7Xg==i|{Zee6!x!E^v>}J$u^wPF)ZAuoediU&N2ac&Cj8az{%p;+eGbknPnD zVPc*ji&a@UJZ>yYEmhl+p`}Ze`xM_3NbvSZ4|NIhSGu7h5Yq-WuA}jvHS^fr&*rZQ zrOyQ)o<1_0L_{k!ITATks~Uc~a?|+b&W-9Apj$UF!A1$q(l$q);xOYn?5u5U-L?SX2I>{~@)1E|uwLkfkjkaL7 z^)?KOf$6nf4t)8G6G7yFROn#>5-_q%_TlB_Bo4LGxKGgYaWWyzsh;BHs=!MdWlH!1 z7vh(fH%O2X`ha&PYRmpA31lyrB|z{|935K`u-*PI6k4y)HP8%2pjpjRx=(#xJgf|^ zxMp>-BLV_m(?a(ZRnmN;034(taJ+)zj!emOb7Q%A845{1$Q$!#e1oEjZjT5 z_l37GIQ;hie9=Q3yNMa6T$*E(W)1fV#m=bxwrj$yd*u^8tgmUa7;SDwt$mRsPAF7C z-FRZK@iSI?*O%Ral8H^3_j;lNy1neH+Go?WeeY-NQ!}q<6{{TM?1R~YB6pavXE%Z+ zjIqA!K>d){vdU+MD@z_w`j2iz{6zWZbM+Tvya0f1#1zJt@|FvkV?#>}8U-Xm31om8 zxIY4}xrIe-e6X-dNMLb!8@^5ZGk2QTjpniR5Q+C)=8V#hi3tcS&VmfF?N$oN?&-P! zY5LcIO*ECTPes|uNd5bc=DJB!mQn}vuL8Vaz8gfk)Gh9zG)K9qDhIn4w&@tsc&!6W`D>X>$MTv z+0ve_T9cZEu#5zIOYC`<;-ls)goxavik%X1V+*2TCF|UIu&7e39%`IH$N2^yH>_l< znT{HxB0aL0KJa3GLUGmowxU$p(Gn2_Z)&a9gG9OC-mXCowC6ipK`-|bBr2&(`E1?^ z)vueUb6#*hp6|=~->n;^d?V&v!;|CE*4C~yWhel?fYg`9{brPqM5Ln-iJVe3c_H&# zSQNr>f3)d|484OLpk<7?A)uPH@X;>psiL%(@jLl(bR{;782;78_rvoGCEa=z-&{Q) zCe3oRlC9)GeYEZiH80Ib@8!Fx&Aac}cVi?^NI0wBG;JSG(q!v1^~lR0;L+I)*>97u z8E?rrr{knZ!4qYQe6O)4E&xdC(t;Iv*mXu>&ZETetmA7!UT*4qQW@h~W^n{=G$lg` z(AIm?5v_g3lH%v+OC)pDA6LP#)m6B%mdqh?wvBqcS{LbH=Hll6Py`oRDSGB`9l6`J zfP>ck$I?EaJd--0GXoi)SnkaM^^2VK)ikNuwbGb%h?-I>U}`dDlkNHwGKF4qDC;hh zh~)FCSN3t=i14}k<(b5EOofXSm_ez;arb`z*nq!?@Q~%Tz_PoJu=N1@ahpCLvRi+U z&_JsoG4tT1&(SS&1ej|>O$MJZYu1z+Ld?sqPve+=Tsu^89dpkp0+t+-U}FU)6||DC zOs{bP<1I;d{b!%wvIvR-U!6kOVKVkRYO_E7z-S)p-nFOcVC93YHer5S2IO3s&$k9n z8qzTbt0%|dTkv$KH9(1Tn|93dpv9kN_fesNAwVdn!StZ8mt`t7F(9AR=|iIv;NKby zd1+UU1E`Nt{%{T`3dR-qxmZj7h_~aUm;U#BY&nr)IWuU&4#~922HU*hU~OI4d~JW2 zR$}TftlS}ELNNg5+KHYsU(uH@FBw<-^y9tQd)s}_)7#U4duMGl?6R-m2uT6$9mMml znrQ^+K{;=PM(nJn7#?~V7IvT>5 z`Y)&6Pbbr`ofH{2==9dR9>_+g8lH`4ygO#8e zZeMssOIzGC5fRuQ-DZJUoRC>*$5Bz3=Rr+XD}FZ>lMwm!L84^72_26Lm=ya#D2gEN zBIo<{_QhG4{a?24AE+oKrcgN;B1cm1*ksBC zKUfLwHuo=B1PuBCj#8w8bh1bb!QjBb=t=5#obXR9DNm})C~t0UsyVO`e~BTiVBeQ3Vk-?p+&VHA+>NxfCBoMQhttocndElUA#Y zWn|iWcl$34@9b`fR;f_E58qI$SOmrv9u(>AWPKJ+C_1}7&&aER<5IvmszYCG+flkB zP@nS7RdaZklq;~iE~GwLrF67ZfqAdF9TLTj>N9eu@aImWKSJ1HG0rh07_Jj>#~v*O z?Bu0tP$UBvZCt$GR3%`N+gMQ~f4j~2-U1(|FcA0cq81OYe^j4IyIdlY(e#5cS#iTc zeR(rV&=FO|ZfQ^2j!B~*&-?6=m+EGWX;cW*a;7~j+JdmX^Eo@oNURfodd5|akfS3R zO!d;vhbs4m)am}{&8>24;qK@A1^aly>YRl_=eVu6p*3nHQwbS`jaa2hs}~U2@c|*% z;7iv8cCyac*fU$1m6h0y$k)p-6HLV);msMbK3ZMJX__4~PpaFmmCtKM>Qsir5G(n) z+x->Ykyb)&?7l%famOrO`dlPXN<01l?q(2gE!C#qM@6bpg>Pa04PZGi^+|pww@pga zMzqnfoz6j}D;jcNMg`MxlcjwsVN1;UQ|VmR@h)4E2k|W<6S#9@X`Km7y}qNqFuZ6* z79o`yqNQ;lYrJ}gc}e^X3hI?avEzMZm!g^9v@*CyWuXVn>bGilrkPDL&IBw{U2Wq} z;)vKef<0&l*>$S<^;rm|acXZ+|1nglQ7Ww~D5idR)NXL8nhI1OzUJ$^JjDPuc? zI3PA+s4M*iJ!aGkFV!%*>Y#8M5XGDMiJr=cHa*N$V$SgEXJl-nToBJ0C&UM2wFpAP z_{aqds%WOk@vCIrTz15?=|nOSK)Y}tFlUWb^&Lam=Pn5zPWSm8Y}!eA$v!g?NyIM5 z7)~HebZae#1Wz(VQ@lraeJ%T}7(a>9L_#Z9MTU=V;z{am+= z@LNDZu-7NFkZ%Se&O{(YNuzXCH?jyXrou;jGa)f_lIM6KjelR zj^A84qE^9##~bZ0)gbg>EpH-I^4bm>m^o>aR0@7ECtc1mH$So`RtlP0G-B$qpBH?6 zc6NGFH!B5K1F^Fr476&)O*y_+|#vs_T)@Vjc;5({X zaGKL-cm*RCk94t2t^8>vSf1W>Pf)(K5Ulo4M4tdDf$C7&dPQnptiAQxi?Jq50i6x>l=(>s2#!vubyFZj-TEA!za2QeOCBVB?^ z0QEXTdrhkr3MP)GZ*-I{<~@oEiRvb+H2YC5;x@l$HN*Y~-=NJldd#~A+Up}qCiWio zw#_ys3s?bY%dt_NtiSAuaFp*!#baW9aWUe-^!$A2O&#}dPkE+#`&EMT>B@5Pr$&d} zn}?&9wIAN}35yp1myxeD-C<(8PB?3e`p*x-GdEARCqmrtRrbEUwz$6h!)bAa(ALx4!&fI%&zCn{alSvHB$6V zl*gVnn9$#Z2b-(3NO*dc4&!A`-#f%WMFsu7H~fd5clw=~=3d#CCU6vocdK3jN9FE& zE~~&!KmP><5^eyXk=lal=BPwe*E_NXO2gomN4;QJBxk(u>bM{wDfD4w3RNXNBv?go z-)rcqgL*8zzn@NIWhWI0lN^FQ=8uP9Pyuny;dEeN!7sOnH^SZ=Ef=gs*S-*ptQNFC zC&r@I#4}yf_01KFJNka8DfMq#|IknO^RSIwPP7X^F^MSgle6lnQX5AH}uz>QO% zH|;-3gdla&On+!~UBQcIR6zngocO;ii?E;KKT4pwiEtVPmcI1j(*`*~$|$eK)_xxq zcd!nnTLB1~O`ySPyolzon&18kTM8}ks&n(Laj3Y5d$qfNbz?!+Bi%?jbFl29K5I*5gv~8+xn=fVapVyE+_PdqKk2>9mtMPEq$KZ z5ujyZeYjY1V*SA4Ct$;L!^tBnY}hODt=L1z?ZEC?V(DvYU?7*c0$rq@~}ePSP(8H7!m+`B5#;{AWuJxbEGlid^5Xo!>$YugR!%dX~KSq;MOx;v5zuvK( zQiYHWSVZYM%2CVz2GFriu$J-wG zAb#C%XuH{tN9*&KFjd;JJz^WuAAZU(vc)>B@EW>$rN}{bi=QiOr`1TS^#`8SrRock z@tcomjQ4W2V`|}sjEmPgvR@Q*#Qu0epnM!!NU=fY>FG23gK!hhwZS(8`pVH(bUgOO zFAAo@p+5N2SNu~v)_xY#=(s9roxVpY>`BPdQT|n0jB((TcvaSh*X(%TTkz&oFcRqs zPuU(xd%4o;;Zk0;Gn%@1c$wsR z=J?W5K6~3fecL}(G=WW83f}3)eqB`aD(6;7SOr7EzN7kEKER+w5m+_g2D<*^Ph@}vKzqafy}qztG-v~&Rkl?B2}C*!{8s&pJrB#HJ87fC(t7t-K*;0s#HNQ{KwnVU{HEe%Op#<1^#HcnTNTE z69hnR?d%vWHQ3oHlBoIrOCG-;46mvUIzjNzASfS)h6E!v+*5C}8rc(u)A!VniGqvj z6dKHXXSI>bOs@gpIiN^t(PN1u;)7{kj$|lnFrqB(djH1~eP`4FFd-!9xzqJVk-T$8 z_+HvESNT43av!2xLsbPD9;oi_&MOGK+teUR?#ujbWDTK>uo(;RSpje!M2ToL5cC?j z942zZ0nknl^cs5y2NQa!si}74UFQE*70|LKLmS~UhMRm$^Du(D3kZyj#bh!FQ7wHg zMWB}gFcJKT=}C#9a2daMs~Qk(NC?-`7x?u6PoyeK63tZsexj0+l8mTB?|<71zn>h@ zHNpCx6QKYb8szo+ia?`O$^e16u13(wz+JI0Zwgh(v%k$XB^u5RkSSDF1 zXk9WI_4{C?Y|uuxlV(N_->phFx0Ar^5Mw*AE@4sNJrPQHf8Dt>`KtsbL=w+4@D$)=*?G|xOK8u2)%}o3F6A|vM7G`dBhqZpH*Tx0pIKY!7;5q3SE1;X zDN8=Djwd--RmXyR#g8|tN&hF*!YK$yt3*4m6dD>DG(09Qg~bcnw#S5C_@`Q~e#jk2 zoPCvL#$(lReZHQpbUIYiC{-Iy=3+=z-BXQECd)4=LDH_X6w%fu;I>&Q+4i{@pt&2d z@rJwxc9Q^Y=OBXmh&@WwD>8_)oX>l3#6YT`XxG-q^?F*JYuC>|P#<`a@Y?&SK`nL6 zbB6K*6b!-dDqL~%HOXUr;@jBF|rKj(j$dwJ?iCEmec_!KD zY_Bou!C~pNbaE4rcfA@2NK6+(y`RT0?qTC^GGj>_;tg&0HnUzzgJqETSCE7qp*Gkx z0MB)^<@)8R>!;qgd|O*vA9+p>^6vKY(|dW^&XJi;aoX>o6+pziHXy^aQdPyOvsw&# zxr=&%BP_41M5C|xnb8ks(g65%L89{e;^?`Osnpgu(c1u@?i)b2(q)ZN8ou1@vf1`{ zGFc|+=H@mG8Pu85=eC;~EJ@;}vZw;>)s4pZsVEphNA=7VlsYyalL2&2sjBM+g0dw- zQ#*Ez)-Cy1PLcu*y5{);L%g|=VsFI?m!Hh+G=0=Q{}Spwgzv@` z8P-*0jXU_qa{BK3RE!!G!jDIeyyvs+K(6T9t(bQb>J*}8AncfIie<5g0l+v30_q<_ z{QTRQL8-Qj3RuL0gbN?wu1`?k=8vY(xY$_I*9L%DliqN=g_x%2>(AGZevq&LMa4`a z?)YW*shWKK`$6>z&wKlVc;w*j%=rSfs=0iWmdh+ip_TPc@8h-ih9g2G`r7>6>R4kU zDpn70QAE6@UTsD|6@CCK>gKA;TG&{f`Jv3q?kVfH2{1{-WaAN%G!KH>as|DixhuGiND9w$UexL_V@Xvj&aTW8j!G)lam1eK*l`b8+#~o zBoQsGWasRar6t0CWhUfGg(8CS?F9YErzg+j+3R&dZ!a&eezB|P+J~)ym<9PKTW914 z;B9-d`do83I_Si+PeHxsM!^k9(?IJ_zI%Zmu2ewEPae;}cx zt6Q2n@AEwCvkpoH&uC%XoUTTZyxjHO&5wEKZ5R5rb|+1->^nCT6$w(rIUmjaI2|w2 z69SPcQ%lP~rb(K(K*;Cp#;KHdbl6_v&%bW;Ft) z_eD(lNAY3<=?JoOScKK*6PMu4XtE)d<((-5Q!Glas~?hyf?iG7luKT>%Ye?IhDoB=_cP$|n7&TM*z1GvZM?eY^)Q}5C!Uo? zE3`J}Yw5YP>$Ng}*$Uz3!{}yI)$R1P!m=IIIFm<0ulzK0v}{FZlV;e#yqy@83j zwd+Ze-+q*7A@GxIvcY58JM0=<3*BjP4RfsYAb<1RlwSDe$wb1Vn-a<}f=<}41HG%p zlR;Kn+^ql+xN{q{VBO1{6)e_R_ z^lyS$|0)Ck+@H3;2%-@2<}9-YFACxxKKuD66G^wKxG=>{8C+_>fb6g$WSh`!6TxT2d}22(+7 z-gMce2OfZcImP=QdY!#N?B2w$RhkByZMzG4G`X`LTgf>-Eo({4*Q3(|l z&AAyp>8E&`W;4xsPyDTNz1MLmDOc|G z=BrqZ2QiO(-=&tCE5e-w!4_SIx>0@pVnZ7 z#!Z$K$Mi#jb71@*`%;i3y`~zAXP`jdQ0FOq;e1in{cu3%jJABJJE)Gyyz}#dq`;$5 zPK?DPUjc7o&~$yjgOnh2$v%Hb@Zjynetpzh+5Lqj)UFw(_leS~rDRc6{>}OiCZ_&a zFbLRIt?RzWW<00W)2Me}S}N!q0jzdK_<2X2myr~#EGO1puh+Ubs+{9nrZ`K5d}<*X z;=i5A@B3fL!>j25BZyXGGDMu54_4bqb(3?j*7NnxyvF1;m!AthX#XxW43Z>e204YirxLmi3}OQ2herm<#S6?q;ueQzhZYQ@=}9 zo@^HH^RU*kXDKKI^B_j7xuUC+=2H|6J1)K$1jZn~)TLGbUBTCZp~`((XJ3(0_-&Dp z?Z-pk_Zb}Y;3cX*!m9x{JEyBHOj;j^3Okg4B1 zKWdWLFn*E~dhtg+2ir z*J8`f@j!IsqOrjXD0xSdRQNG>GQhNb(Sx

zABz2LAc4P-3wuTYlno@qFS`HwJT@~gq{ElxiEf31pQxRD7>E5 zE+d1RzKan(QJ*W}OfSnufGhG`Z}vsa!Z1D_;)c0Q^X8;&W&-(^YAtYnmMUcu)m1~& zEH<$UI+6DV-)Uw%Pf0iaAPES?m|~Rdj^;((+-~Q3f1`?HP}klE*cHSaIFeCk9O~p@ zId|ba5Pqb?QxxFF+Pv;wq~}619U%V~>w;&f5If;P3gX<`mOKSzpKpcD<0Y>z@?X`z z0y6%@W8s;izXpY(0TD@rMEpb6`8zR*fNk9orvq2*sEpqt-3pHj+)oOIqdBorhi_pK ziXb*wy&(cVt+!w@e*2#XXQ4SP^yjmN$y`$^}m?#BPb5L6aT+K^>b@ie~zmY>w|%Y&?W) z_g{|k&sJ7W5cn!~xw-P|pg*H>DJ@W=w1=6S(ci7O$)MZKytlLY`_3s#L5(@BHT-OU zw<5{=c6Nc6M9-{xWB^XpR)&1cNiFc^j`XxS^rl?|NkPZ6yCzg-#tlZ zAles!Xle1Ye6W#b!FsF?2!i!@p2t{2O^zuyS#~edgckeX*Ef$7zsCF1Ve}e$t0mVF z4mEY$qXS-8*H&N~R-nRXA(9dx;+2Hci6@IFCp+h=qUF?Mc18caJ7Fb6LW^VH>o4w4 zm#6rE_D8r#58m1YEnry*Lu|`tmHg_|LJcyN36Uc&Q7@xT1aE%+DYfZS zM%`|#V)T2P4w@Jv*E@!dL2=XecHW;P?kDPm`up~TA>dqdBX0%IgRm(JjISrY&K5Hb z5!6YKpIyH!pNyRw*K-?fyUliJRKn`n;H&^|O>~6n3B?+@tj+i$j!B5cB-Jyp{oX&! za(X+WlW^8T&A_tMoD}x@chPJmysXulHtM`M7+547mBb|QHnqcClwk|l=hd-Dhjr`S zkEgbb%(<=@9Why9Vz3B$Q{mJz-wCDwJ=M}`*OR9)Lv;9;%)Mm>YxTj?}3;&%l0Ck1b1W#NM+*d!4#a}d#+nou#W zunQ7O9HcrjAi~zRu1`9jFWaK}((k`mvVM1luE!|21SvlD8qZtpiJ%8aQI@}nJGSuYY zBt1BYrr3~+z%NL6be^f8Od@U5egY^=rox6Gu5vS22h17jxM&B$t!l;wR|S)ZuD{_i z*xw{Dn0e$`YX+%Xe|`Vc-_k~^2fd|tn@ZhC7oYR2L7bPy>!i$BSm~jCEM`va`0fcK z+!%y`BI?~wH)`?ZR7c=Mrd~vZM#Dse6gJbhYGEfIAKGR>+tT$Ff)K z>I}n9k4AUO>kCnMo+jCjK2~;`GktGLCE3)U@j;8b!OcvO&z1a`9*f4yjQXego0e4r z{C?Y0WM)h6J+|oa!7*`rg~862aGjn_?DpO=RB@pqY|IlAsxtMRHIEZ9s$BX5raApg z*MVAhF+onQSnwf93my|e$;5FLqY(M?Ek zNO;_j1^*xE5`mg>z)bsEsPfD~S$K|=9%C)j$%Ih(8jFj|d=nURv9*I@#XC)BMhAG0 zxnnBts}*Txe|#Y@FyD%Lx5Z=->Bu)2%Z6OEEiwia&n$xu2n5jU{PeBU<-fant~ho#z91ZOMf#qft>6gt*AWu`-2q|9N9+feq#-7py|C&GRMgsy|>L;G*bwzxP;f|nH$ zVg?`+I9a#KTyf(pm~0njHXEJ;;k?-dt_IZx$Big z>|ou^piyE3HKqn)4aHP(nGA3%uAifeK}cw|eOt4g_-+%9Qor@zY&z{}c*?VU0 zncahJ9tGn&5@$Nr&Xs5Ys_a+v3*Rv`_x*+nUD)=9Ra!S(E#<7x_3VyGuMNe+;`JQH zhe9PCHq(RKe-f&ZVGvwPU0xU8UG2vwg)^3Jj{OeVcZ4@Ox71+}(domq8i*}smq5{R z#n$~|(~M5gro~dZ&jpPnUw!@tBaW_IO5@L92Km`A%ol$^zM=}DG$4R_K&1`(P=1d{ zRVKRa4>$MdW;a178bNADZ7C49cCtHs#?Q%&HdSzbU;yzlfW=h0?_jJk_yq*xyoun! zi&?6PH>twgIum5S9hs3=(t$*RobX&C!3E`Iz?-G|E=ToKNT7z70~$` zm-*uFs)(8u_qcJ!&o)z-HavZy5k4OyVZ)p_#5Ue#GGODI^}2{it+zeh5F>80f81)LKKzYKalLRi3q??%S)+TV2%FxrUGw)aukV={XH>{ zq0ryfQviEK7Go*?EoUQn3AnZ7orY_Y|De1)$u$sDWn1-O{7;~T1vJ9chy7?kNOa)Z zTr;GvX#2S}-KLy>hgSe>!Unzlj7k1|CT6eJdV`bg-4d4@XnKgBpCo=|UB3TSLpF+I4XDT@+j!QTf| z(*m_W@7zqu%@08>_|%pxFf?D}2BGkI4mtKJOX0+xX@8JJ)i1?be&})fS3Agq!QNxT z*ktio;>>MPN;E>4ZWF5a`)WaW54}XAfU2C%N6TD-_-BbA;L8Cl#F4V9&a79}8mW;; zc;}B{cA>K#sUYwWN8`TP%698BJ2PXw1oAl~Kw_f8H$*y?SD2+6-cJ2+_6~>U={?V8 z?4C1NRX*E;0pm+c$R)4rH?9*m^dtV0LW3^9qk$ym99w#_cW?k89hY9eiRJ!IU3J|> zOfp|sLtl7=xSp+nHO{SIu6!4pn-V3}K>TyP_Yj(y92Q0H^?*8=AHf;2fD=6Wr-_)j zbrmIV!kc%hU_v0aW zWMenVx;=hkZ=O-cuCZl)qipjdHs_qed-_8H;K9+z2Y9U1G-?+v+n`N6a z+*TC6P^Oh{G=9Z2PW7q`1(DfaU28x2dtu!N&hiO!VVMb`P36xe8s?TI7kfDtz5m-6 z5`YxwWido9qCXGS``!JL&)U8~(v)F*nLzjgP(9=CWPf6u$DL1-^|-;ue(D+iyO+_pf!S14tw;SuhewE)2cE~+ zwymiASBSxB0Panxok;xKC_xQ85AX0*RqbDO|0WA;$lVeb@_!r2V}a-W8#GGj{?l_X zXgw+b_Z%m9F#c`Ccmq5yq)D&*A5#XPQU$;|p>dlL{a4xmG{RE=&u7u&(Ebx*3HVF_ zVhK)Tjrd2Z0zUp20B-&()}<1tCQaiS0;g=y2OJ5!Jun`xKLd_dU7F_y_qu_%9s;*_ z0JAHFwsZ#Lu(H9(V37-l7=9cHuT=b>?ge<@Z|_t<4eq;E$@m|?_M=fwindB zJjCuaSFW(NF+vy&Amf~6niIm`E0-g=WY3+c{tVll?N)7L4yLJ|-kr}5=v2mgK2mHY zbm?+cf-tW8w;U8+3&+R= zfx&pYYUJWtRZY*b2l2KGazhJAy3yL;b4Siw5^(4#WE1bu^}=FrHKMg_MFzW<+iB_h zygY?3YkIht2ev7$MA=+oo8Az?_R-DXY<`qKI6heIU;lglLyww~47NuTMZ+ByG61*o zM85aY$hSM3a#-~AmI;U|(l#w9v&4f-RrZrI17(g&B0v4!S9B`-H6-IJ9ZdUG8j8jF z^feJqg*x@|Y3&xV>Pk+iOO#3erLiCN=xJL?B=pCGeEuHS(?8a)?3zfY>{2IareV!l z4v*SqAU%1^6fS0v-|tAot;|N(IRjCpTsizU%)uFr6{VK`1Ihn*l8nIKf1yFs+zVlL zA=5fDU`ZQgG@yq|L22EXT4}^ui40?4U|vRPlFEz`9#HvRr&8P&HMuLONe12)re zsZY=H)Uk#*NG6v-Jzy}5H<*AJGh3f%HN?Z=MYS)4N^VtiRUhz%MYPBmfbhCCLxZVa#_p!{8H7)?9fBoDY%Ec(TThKdwz*UEJRi0;d8k zUpm%Kw3&bD3T!aPTWXp~sLDo=F~qi*R|SNnJr>D6Sw4|^jr&T%-YIuxmQTX}ySogIT`5yed(Th&Vf3!(VOMulq z!z(}u{(ORMY`-#+%x;>2HLB%ee9a8EWJD zyg7;lk}KALMZ~37i~nsVC6s+$R(T&hht#^a(rJZ4*%*MNZ;@)CekD7>yzZi)GX`X6 zaBC9MseV_OHv(HcgajCPh;^K*_%DkopzVW6zm&uNVnBM#3D)y5 z+he^BVXnqu$GrbLOu^;!@jFiSd&Lx7U(_~v*L{X<{j(YLouBY4*HI6!tw#`m5d6PX zQ?%?-&yDw<<hg^TS|Dl5PnB>tT( zH)HMwt;@`SMlq?@eka1MY~u-2gt366m59Lp?->P$fPQF0j>;^f#=ZQ4?BzxG%Y-7N z27qUV5Gi01hPX6< zhh6 zj!D#1KX_uxXe--ZUj3P+7xnu13iwN)&Kg^%U&vNlJN@~S1tyOH8TR}9aMbC>1Z}Z_ z7~geK6N0@R@h+RB98Egb0P=Ml=zv(MaD2yqM~p~sbcXpMPRd}3~!~g~BD3_1_`ivX|fE_l@ z>GJsF20eZhBLd)_hWUmLC_cF@KGX=#Kfz6`%p*;tGd}5M(LGiR3b-R!4+yzy;Y|Fh z9b8e!R3vggmvUJUOdb%*9l2-sem`*)f0gj~w-}Ea91?mRb(?|sD_SH^^sc5>^1|e> zLXYH|RdL#&1?@zDt1QImY_xAbnl0Q^U?ti(MV*RYJz&fqtKvV&?3>uqR5u14-9Bf$ zCx&%p(FSwElif`M{y3^WQ`_zJu|h^HrR6WH9Lx-!Cat0lwtJm+zzJKx?VTg5vz5$I zOjZ0y*O0gZ)-~I>H~MMnB-7Bx%HaCl;0$+lVeb=R+;zzq_k0cb&C-bhfqVpH8@3WU z2vEVmIDD$m>Q{(#j@}4RVIpkj*7!Vn!2%e7OD3@r+OPP;!}{oA;4(WVA{bRXihD&0 zaH8EcQ73+p>Dd%IUKmrfRnKJD!BxDt)$=N!v^M9BH>x4QyMz>~M`X~6h2uz%c_~8- zJw~#2@c?oAb5XoErBYD823xC2Z71VsILa-U_J2l5J?Tp`>zKKHxtP?Qx`68R8D zKpMvHd)SK>IzijI-?UsalZ?<>L(xC^TOd5dY9i?L2bHDv6rUnHA5Im>#s?S^0YEr6Jh-Wgu*^KwYsxWlD^g-{>kEUoN?Sde=Qz*(DP^D=TGOK^& z*~%v+K)M~tPIrg$)=<**sw2i>N>HsS=Bnrj|NTt+wDTHjsDsTo2hFrLv-)3|d%s7$ zl#oc5R}oo!XC>vcYY*sWz{L; zx{z7;VcGJpLqJGXptuW&y#nvMGO0{!QtMIFpet`Wz<16RuzghaH3x@@SiR-GFH@BT zFk6)o0K33PhTb5BAOi0bEo_C;vtKtfF%bv}i*owjE1x!7p(}~Vu5gx0Jq`0q%l0+- z(>n{%b}NM6te5;^=-2){RzWQq(d9)YZ9(G;C;2np#_S*qh6$Ic50KEK90IS+5s!3u z?A8Z#xm#7S26S}M`W{b_V_S;6)2EF$k%1ZU%{)iMgFe+RY7e?M>mcS}Wql@mr&sjA z5vVS9iH{;D`^%*%RsZeMEML`SSrz?qX((4NIM8DSfHs;6OqGy60lzq^YE({fvR2m8&y1R z3k=~$vS2zSCrCb`2FeYBRVX+lHZ^0R z;KMLnV-Eiz%LIhr0SNv766B&^c zIUqH!?Me0sE%2_9mR6sG$R>lPGm4-5C7tR=X02M&CY|A_WTfnFWhc?&uq@FZ^FvI1 zrpX-LZfic$3pRb#=vg zjZyZ(ZzPeuN@)gX!J8;%A8UmGqgjZf)88)P4t;+z2mYzS+1uUdu^{FUo{(!8rsJVe z0>Yc6o(kVjHP;Qja){0ghu968;m&}wl)wuOmswUz->-J3s_=N6BvAO^tas^`e})?l z*d4Kz&t4DCYdPyxTl`FDkG@GOsOUi}jOA;a)&4W;OFNH)pnQ!$vpH4{E*qkJN6BIz z`~gCG9r-IQypu>5n**Uo{}T|n*dvh<-q-&l2Jls)1$A!DC#_p9^x?7AQJuNEyD~y! zV`L7u*Vwav)E>?j^Ncr?FEKCI>7qQD(=dF%e+>iW@tvMepmWfm0_TLtQ@l6Q@Hr`5 z#C&D7Aag(2#JtYCBWa*ai>NT2QDTjBx%FRgbIBbawL{`~Kp?qM{N)M%8i`*3di}1V z*Ly~g!gt6u=BF|n9qZOmWz7tNdq&2+mzcw)1QAYF3;uJhSP=Uj0<)4~3agk(M#+dIYFJsAS)FheN{X|L0;5~!J_dFY3?|)HtjVmWPIbGg><*1dn^;|w0>jIXOCt0R~t**WlM8ORo! z+q0_TJpO9@Qm5rXv`JkB^5A`IN7$-W-+(v_i?L>q3-pD)+Vzr=G*`c{9sARh5_-Us zlI}JxroblH#HgRCM3QItO?3#wLU9<8zKNv!Qy2h@%p0N?D6Jx$E~Os)p9??~0Gbbt zLIV4r^q7E;0l?TrnybWa{7)UinC=*3$N!{7)+|00+}p5;Y_MHAo2uENdS2=73S+xKx2~)EDl> zRe>Z?*tC*SATx3hoq`EWPiGAp;QDwzKz&B=*?4$%*$WMN(0F}(ric8rf(34Gb&&*D%mJL9`3*YY4OBVeyjrKdrDk5rMAQ~P`4z^YQDX*ILq zwO4+9h5%nICb1Op05#=>JfMLT_I#t*zYg(o?KwO?Jygrh0^GZ>px;FEw=y72@j{CL zl?G|LkS!tSd^yh=iXE+t`GP`C9fFGCnBG;)%kHT?D9-%~n+E1Ra$Y|PrdQL zZKBAC;OF$4tmu7bNij}tR##;HzTQ}?5{Uom8Tt^nF(+Cikv}yl?|8_kQP}0d8?jj2 zoJEgGwg|pr_z=#~-EpD8r{|cXj-;!TCIcpB)&fOzn%uwM-VZDZR51SNJ29UQ?|8o( zV<%tV458|QtD;R^?G(uOjt>bP3Dtw!o^B-YM5VyG4kvzr&?!ZXe3sH~QM$?{f4bO# zebhXi!wq)H{uEr+_*AN%-y8bkW7UZ!-x$@8_04?QwWuVcvUrdDX`a#Dw2(04?C(wV z)f1HL10r29QU>ltigaP2Da18Fs7pdx@E;Mzj0Jr;I3QEXw_9X-5_BbSZf6yA9GUEw z1~@^-I*j@da=Y-BB3G9u-8qCymKY>HHt4EN;D-y*iaF9TGpo=e8(_2?%p>)e$K)6! z;K2XqQV3)O*u49KNdF*c4tyyK{&#vm6vEjPy7C+_&QhM;0sf%0pm8Vg4?Gpb40<@V zYvF|HETttb81RvxDR>?yi27H;H`!O@Ed6&4TQ@6*ySQ#MJbq9T-jA>7L@+n(F14>N zqTTXZHR^<^8Fg=|O9f6AgzOqOMObC&+~81#Q6oJAbIy!8EIvyHK16|7(0d}a{D`%{ z?%mRVZl*?2@WQ`XYW^Z{fxL8t<6U+;&4Sl$F8S2G1c?p2JY86&W?>r zUE&0JBUeT{))MaJw&_tlw=ekM4IY%3mb@ac zpK9M!zZW`ndNr4%fTk|_X9|oaP#j1mBSTEO7!n!~tx@UzR<{wOaHn`Z?~}uWR2V=V zFHj~JQbMc8lx~j(7dp6G@91n01^WL^A>SXYvprVFh>|>#14^Ci?y{rxUVP1nv%=Aa ztx|K#nxk49JaJXJqYv7WuD|!29qa@AMwt`kr{!wk%a(p=i%uV)Ez+E}MiLOCQcDll zja7*UKR_F{8zQU*(@oNJ7_Tc%tYyYHc>W4L@)n93JG%9gT01$Z^^Gipr6bhP%s6CO ztJPc{ms?H8u3&J2Ks+sS_!p-`H5C#qB_gW7Yx5Su-a0+-2!HB;1!(To3@5XCsmN();I6V(tV$5~Yy&TS3bf6jMOQJBzLK4^e zrCPwx#57>?`B@7Or@e0a>({O(106gZh;W!)fmABEE>l3 zqwt^sasZ*3cfysa@O-rJj;mG=Ob<6B7P@X)_r966-a~nvom(AkyQ#d^!L^Y}iQfjz z4X}*4yK`I4&C8W_Z-{85K2$?OG7V6_ElhZqHa}u^q_VhxyTy1B^+)LkFo0cFm7A?L z@Qpl^nV{LL2-47NF&H^?V^yxDY2g&}vc1y9IzO*ZT7>tq|KaXEi^Js#woVJuYtx;5 z*5{e4qI_q@+HqToqc-O;jvD4)ku}|x*Dd%x-Et6FGpZ%6AP(go1`j%=0=s|18UUQB z01QN{Foq`7LnY7LUT&JQe{#2e-g;MpnDD+)hS;Z;8yp?Mq^H%G4?9@f=RNitx4n$g ztgp;1I+4Ah*21^XSD-ch_fAWx%6Ez!){&%;>-G~zbA?3OTRnGA3hz+mlJqFFxOim$ zuE!kI=2Gh1S^o$HwNEj-#|mh-Gb-6^NI{GSj>Uj;beQx6uvJNvg1*o(*Vq9Fdix+HV0rw_DS@K&A-EKWv(0fDJUr?zP1s9o7heYvZn?tXzy0a#BzJ&jH|xRM z^PUBVRc0?g$EMRQV~IOO894;=o$cUcyBFE@B!>3{7~UEtDtJvHNzh=gzc~<= zO5iU&sYHnWx_?>BJO~w79rYKrt{+hgIFrDy*~%8;q%Fgi-wI0Rv~V{-=47m zIf;RrWar$5%Jl0~UOByvIM&I=yi8G4DW{p_6{4PUG#hNoHU|o2V6yq18)IQ7TiulF z1-Jp_G1@Q=ru&$%2J@e=xeiYC(z#_)^QNoN!qG4OT8pr70HUUxWhBfkhF+61_)PMf zi!F@o7DDgh;R+;^K_iMXZeGJI3%a4>cOJQT=AYA_rUX^1v~7nl9&)0S4!2v_qOAJ8eOv9UnUfoih1RO(>T08@3~|#(-Y2yo-I1J-D+uQg+o%LER9&*BTh9M z@@g>#VLr=gxB_E)#Tt=llfiu{w@&pSr2+AM&r_rIr?{IFvAx3@XQ`6OT*2yz)Vy$N zbWnl-!OeC;x&6M52WrIVI00zRo=W+L(`q1{fBun!bM$ld2KRajXPHvy8+hsn;yu0to(ETPHbhJyIfJFEW$^7noU3ca-=2 zuw*x8sKN5}-pP){2pX@ZQoiCh@_wJvPW1CjnaFW;LJs>3!J@p^xozk+WWL)uvb446 z;ykV+gkF1pEAO8+$65qs=?F74F^*`JNu1$uo;aHN$V{}UqR7!40I&+hUUXQ zX$i06akn5wTr}MgQsD^qW=LliD?TP>j@u7#B%Y*y%v`-0MAUm8r!@0Q@}+KYbnti2 z;tJ_z{nB*F#ORegh_8O0QTGh9_Yj$v(RbeNy_<6D@-rT^5W8cBri7APcI-hXeUEnWR8Z_I$dPeX7!&!4|O@FxYs3LqD=31%t^a+@UuhWMHg|C zA)izsH91uXLv`F18kuXb64x25XS=+B$_|+DMwKN)&KUeIq`UBKFx z8mo^O2xEguE0)CfPC)0ba+~HVpH2xZ;v!G{akw8fy>`|H{2bHUA>pZ9S= z$NO2wAWfTWZANtt(`A5Z_6#JYLxitJZ-u13K-jewcg2UXywHh)gF)W@;4WuL`6F1T zp8ca62(_gF`(b^ktis5~z7<+#=YiJ_kKuk8CrdcJ<*YMKF9tQ^BdT!gB@2h5;!#Sx zBVBUFC*B8lUiwLZ|#4OGwhdTCQf6*u&7W)ZZGPz(vs~$<=7AOdC;9G2vr`gjPFr&JhkDF8MC}-ApvPUfK3j`84hw>2Zo0(0_ z`qg2MUj`a+pLs!o=vCdY}f z6~Rv5{_yzF;${b@^|L%T1@H5DN&Q1Yj%{Y({0XI$5T~0 zvU~xJ{XTlSsX(y{ngVp#T+y-a+QKFtcbe?nUO*mdW}^&QLqLq3!3&FtEUtswd>LhF zM^F{V{Hb8Q>uAv2u997$-1`IyIEcHKmBDKGuHk&Sp;o>KA3gDcvH0!^m0<1FN9+rv zl*MarAvBU8KUnT{b@V5Q`d4TYAtkAWb12P!;G$tj+wi@{EfhW}81Xyo@Tx`eI`t|E zbKW=DPnGD3F)2tpm#$LTOE+N~WO3`AYT>55hykW?oE9<(#GfvdTHP^TKf`%pKL%7V z$1rP9Q}>GZCW)Cd^e`)Keu!EYzhWYYE&#KI0z$veBQ;b9AoR-wg&E#C9gW(wV4z6( zr3}Lt$`^7iQvT@0V~UCT=>vF$w6eYN^77iy!q?B{eqdFJXT4W`JK@3AM5P%>dUlR? zs0)^4JBNa|wLLf#`V*0^B9i_`_kxz1iQ4hU+H=9993mdiMLohVUq4l;%*sR^$2o+` zpK{YyaCDhVI;P)}|A7M%pDoJAh#9|Uwi0t=;y}=1SQi~SeCpvcbV}hX0lf-}<9bHN zkB*u`nyBeW+1>8YsetuNyDFmsWa+?OGIF>=OOWV3Mu%0V z8ZM%R^kwbBCtucqJA86D6zj*Nzx)nAKN+8y@qL=efCmnPyYX2bZNqkuqsiBDjPwRvlJbH{kN{Sb{^>5(BKJ1_%h4)!u3T4W< z!dx2$4EYJ1iwSRB10^8s;?{|d-fcb$h@@{u#2>3_L)ji(iY9{N-dwRT z%aKkq?Ovw(<9&m{57-0F@u5>p$>~EP3+cjJ!4$ zTt*|!j*W|i+B7~`OpU%eEVb_K#EhpXekX!_FU?`7oO`NdhW0k7q%2eMGktPGU_j-^ zljNJZe8`$Klz-Pf3BG(hd7y?HvAy3T)DFYm;VLOjc`aUrfHf#jZ9)dy+$>;*}${r*8(*Vggx6i`;;+s z2HQ(Y&evX5qrALs?=v6MKIrNTND@ZacFfnSDA}Hy84um(UMVA)hkuEp_T{UJG1r^6 z&z(tA@6atZFVe7|6j%zj%%{hxj?Rsi}z8Be7sMFJ7J&Uqx#f>~#IA;BONv30o{`D~`r zkd4McBc1HW_y24l@boZzc@0(?as)X%c-pbj1MYut;SJUG$g-F>MRPf3I)OB{rjqDC zwZ2THrY)jP2_X9q;uO#_RdJzn4Z>}!n7!pJudNjWw|e9~?L5E>G|(Gbyitaa=xlVq zk8t*?yT^zAkvhOZke~qc35R#|(cv?-@0T%y?wiLUG-z>|LTzxeP*|H)Z+7Fti`m^D zqdm6y1V0MS9|j_AOn(DWfIs?10z@2;vP?wRL5tNPOy1IXGq448B9u}{B(J`cnxT-e zoc5rdEhUgjYF2uy8HpkM(B5OhdG(%z8R_-E^wR(l1Yshd+crK8*1E)MYfa-M7C2XU zVJUZHdNKwE!bjmrf}uN;O6>yNJ@np!iNsN92zIu9!Wos%r#zk&Vtm#kr$e=5Jd!w*YNG1ElAEt3ule{7DL6( zu8~+Jxq0(k>cHFi)kP1IIPb{B0r4ig8|Ih_=|Xm=$qQVF<`?+(6wK2t&UYxsDuXh5 zrgZrKp-`l^j5jYLTL}4$`L;hCH1T@FXr2KKu#@!#`ZpO3oE1Jdyh`+hr@>u;exA=l zf(}3`OV6(4|0qV49}se5Oq}G&H4d*kBqBzgoe?lS`%EevNw|)W5O|8l5eB|Rj#jXa z1$)a2xo$2|!MGWXm>h^A)#sSE5-?AHWh~oX*gZc*_-l@lVhkDKLTwkcELX zmZm3i>ZQo+O^NJO$j$de%n_b=Zm~3)klVS0FBAC?X~=Uo1nw~PV1@ky$xPKN27mtI zAb;tuPtv1)? z%{M8KGXrB_I(FCY>Ms%j(*)R?M{3B@0om_xh-@@*VSD#Aj$k9^X1CMBDV6iXTiA8u z0)4|$sX#d7aAHr(OUJrYGgtbcJ*5qUjC!_W5&)uR{B&4vJ6;s=3&*Ah9jZ3lmVW#= z_f;eHRVrfLKh{(2Df<1cW!Zw+_s$Ix;sy5UmsYm*v!8co{lr;1cN@cV_@H-59v`kC zaM(%)5YjL$^ab!w@U}D2u;*lLBwFVEIFGlY&z?0wLK^w;Q<(Qe8Q|?Q!*Sb8_n`p)@|#^dD9x~1|4d6$>?QakHOp#SZvJaHXDQ2x9GT<7RvZ6B zT?ZdSa&N=b%pnoPd_q(yFG4)#Nt!o(H6<_9G4DIq=PVzzg{KO0(R-AR{{v9+$W*AnmO$AbOq2#iO4J`1K-O7ky;CkPDD6Lwjymi`p#+_89cIc}WpIj` zekd?s`-ti%=Z?oRU{}nCwFqr;TdXsbNfudcOr}1Rj#_t0Q=-0$?dC8K^FJs%EdZ?i zT+MEG$h;^u9UapBvrOxa*M-_P-2s?WYK2yZXJv3f#rQ#MZ!aWO0j9amODEaY>&&_K|NJD(Hw7d4=R;sZ6!0g%0of zNpavbSpKqogR=XzTX4m{)`C2e5m1~i&1bI)uaC?)piyhhr+sBo5ELR4$U@P^R+7%- zRy#jE=TLVc%zLlhQQNJuDiRtO)morEAqW??gWP;B#8LxokOpaE@Cjo-At~NItENR) zVP8SqciM%n)i_ouw7h7oc2+2rdB(mz|5yv1b95bA>r{t* zt0r$d+x@Qx{1C$sMumkJS=41<6pe_!Mb|dwWe!7CV>9Cm^JYJ!vBDVFBLFhv1Ac|? zH8GFV3@^&?k3Sr4RtVG4nZy1E@T8X9Xn5-W* zDkJxZ?ihM?~?s$E>d$G z7iEb?^#0%ja+qC^c-+e7-t%|1SrTF$+>BcH>YFzrmSHnScf2=ph_9``+PU0gz+lb!!sG`_3TB&DP9;`XFY!F@t%R}f^MHbrxHyQGjX$&Dn%j@KN9YWLay!sN&oPuxhsRq2QB z-&D<$e2ZRybR`r;xrF#4ED|HG%{1#5wwYBN(pSeihwb0I6UG+b@#A7Hj%epa)KG1W z=0!k9v&H#$qmyG;&uwqAz!~0o%RYEL<1&ALi&I|5sA?$=|3g(uZ&tiuxe5{%k&pwe1gGB{$a=r$=(&;Z&(wt1 z@e2)Qqri|gPoV#?i zfl6k-(@8D0d7M!at{Ud&f{#%kqDq9~c1}U5pZT@nMGrqTDzBS$amtC;`X*f z<1>Sbn$hsKsYwmL`8MN#1#K#Ne^2n`Vt)MFy}CZ8IDQ}GtR2gG~qiv@imp z!H==A-8QQERds%4Ef^GSi##V&Nn$rc{>(&84?***aE%W?wPv25)19y)nLUKuIo>cB ze0X88$(WmBu_xC5MS0b=A9;1PI0M%q!P6|2*Xf5&q6P$Vw^PV0Q`m}To|wrNy}tMn zN={`P)!?SBo!9**+nmbE_9+@0Z%r{_5j%IWP9xl_o6pD@gbA?WE|!Lk=996#jui@{ z^y2QwVnw-CIhCAxG>TtGRjLN7ix*hxr>XmKV7dv$Tyr#P>y*b5*IAU}lYgeuhk78h zcF|Xe?-b6lOk^u5##`x_1&{_qo8`I8wR6p%--IP2>?FUv!778%77mz7v{GVE0foDs zG|<-UX6&1Zl=gqrY*)m!dR113gmTlmy!lDDJ3pmDmt{-|_iCN@>o}Yyc8lu?-@MAa zj=Hv2wd$@cVOJRp9!>x*D(>=RMctNWm9)6uq=ZXL2Q|V%5OD?_E8(a4uGqOCNUa>9 zV|wbUbYm^6w2J;^M#mjUnNOls{WpS1Q>uErJ59s{dA7h8T)0lS@Rvq5A^KhN^<@R3_pK8QkN9R-~1E<9v(sGKlPSS4z4o zQ1^&|h30IAbx*l#{B1P&Dx`}t_s0_Bnv2yKBbWTO%HU4bQa`3;btPTigXD#ID#tw* zuSM7;vBz7Zx>vws`$CneX`n(Y?6x0QN=jBPuA)ZXDbem zTenKPSY?;KDgG`ln$|n)NmMtk)?L!w^Ns0zqM2sU)x~Jb(jWljkk9H#K)s-*lx zVg=vwZ58c^YYF0>Jsa6n$zhSuH^^XtTf1Uh@?ig{sl_ZSI8{};r-{x1t$0#G z;OS-JC)eqhU6PQ%+YO6I7EW)08;`e8XjoDDym&X}%*(z@`O`=wXG=%V;@RhlvLST$ zbG5Tb>#$}>u{;)2CsSH^Uys404BPpA#8%6n$zCeo)SdB4j%B+ZUgN?ZP@QPSl)%m? zeN&wbb@A}mtedDPce7!Vt{FY8Avilbr}fDkdc{T4O7?o&Qyot#1*k7zT(qL@2A3jH zV%cOaStyKzxn9!$W~PPM=bnvs<=ULk#iIuSh>Fd3)?-^h1_i<@c#Mq%odkTf zinN==N2&fWVhab{DGkf}dKvR%Hhx?E_-9GmjMe7%0kUD9GOFak(P5kV!-QFTgW zODj#R#_gFf+beVwFInfEzMyzrnlRRr$iO%a#F-Q{)50kisg5^pVhDYv*$H``G~awJ zBG2%Cs9qpdze^5J3_NsA*z-3iVe6ayxsq`!vM+vjHySv@S4Ab>Pa*8qp;g(NvT!W4 zY{j||_%?CQssrzRv%{4ba671;`8bS$OL#Q9Ot4`b);3ey;eyC8Nt%gomcq;NR3pRfVxWe>8o946){1~|oG1n4^!E&aTffbnQE(H3O3nK;Lu-ofk zu#0?Og1!*D?I?|*emT@g?>aBXu8-));}y~B9X@ymxxisMuT9EhD?{j|3!Z*sjq~Xv zzgS77|Boc!aP+Wn$6J|wm7~!H+pFdZ=h-pLxQdD~(8EQ?MMXgyY=;{(Kl43S#-gGj z)2I8Abcp&kIx)t0o89mlsTizrOvXHZW-mU4Q7_dJZRtG}9n<;{wOEZkw`rXTGJhCf?uodk2*YU&f52V1PeHKP@A1>q zMJlIc`P}a}U$bKGY|V|pDolw>-xMxBOw-Ed&?Llp4Z(#h^-si{laX7=p&EN*L=r>)}us@$+V7r9)9|< ziIp&phqPiYKg9ex&1|N4VzAg8gBWo>%_*g7*c4q(ILa6L9UnmV-5KI);i!$F9}n+F z-YD(6qHFVL(4Ncj>*qAX3^q(IF}%?VP$5);Et|-~DZX=0^z4E$rAhBhUVK1oQr|$H z*M?A3N8KxQo(Nxj2u&+IiEnQ>!-%Q~PSYP;U0jZcqGI@LYE~>y+sa??BlY!jO<64 zyo0jiLs^lx+xLTnfVpr^UHIN)v+C<+%7d;o&j0`tH!W1_O?@wOe zhn_OH-%RTt_B%AZUzteUYdssezY%8M*0~wvVvf2mP)#hI*{t{OxVb<{`YIu#W_o{p zWmEDE1A&`n+h)ie^I7K*Tp98gVtE{dH^(+h()ydQ3|=lKp- z*DqisT4Z#hmrFxV=BP+eN`ou8)Aj2qbmFVVR7lifV|aq@00KJmq%&xS=f{azf$ zPnQ3c9nW+|Vqm7KV;18iL7- zN%p9bx-AIGCME9`H@}eT*)wQ~pKm^kmzQ?voNQxsq%^YMn-=7A2p{0ENNXTfR?P*P znbq9}t|`_KJQG#_L0EAS7XBbwsDDH!|5Mc{JLk_7g|x_#SRdE9pMJgi`*xt$86@Bc(2*4(woO9mp#gxth&6Cx6}W*Z1->;ux(<0I8ntMc-;xr z+O_>uQ)NW6l@S#Zg7wFi+?Hg6igK%(PxrfQ3=5W-TP~i5V_oKPH>K3(fWEON*QDH6 zuRYctsOW%Y2aOc(`8-1D_*tyXNnw!7_YtgCj)BV4Gf|tYS~CtyS#RwtHX6*M7F!3A z^o&z|JHGVUAhRM1Luck@F8W~Lv7X4%^;D*e^$&<_{IrH^=20I~*;01eCOYXkPjvp? zV24k+9$nw|1H#W-L2quD?GzU@DPfjR55GaRi4!W{)ugGd=**Yo-;{JaUvEZgZ9iZb zvT+k0&yn`2qq(-rJRuCKyyRWYm{bn34zZgY!E$23rxVO!itka(lC&*`$O>Ge&ZW`& z{5TEN-r`=WH~eYx8YHMAh3O+)P)87Hx?C(+^tBvz8A#e!=?;xfZSw+zoKjR?sFRxQ zV@oAjwoYjpLRy?wi{ugZ{qL;?ov)z>T89=S;^F-qkxWwKix0)>N=B>HX8`!Hx?43W zsiZSwW@DIQn_3WMWRGP)HKVGw-OE0OM2F$0%Cv^&ti=EDPxHa`;^EMy#Y?=5LMKoC zJ)xdxjg}7A6NR=WLtYKesH?YeS^gnxB7YWVqrz#EMFs3;CD=du4vxzZeHPxJR)C2; zQbpKxx=^eyy{EGm{!u@3ieWZ6ayhIRX3{n-3djI_MHpuFVei$}*|F_)HOPlN3M5o> zk&Us#&)8xmqKF~HGyS?S6qMhXqy0?#yjiNnJta{`%ja1j@<%_` z!oh|;tX9{&?BrOM9ZJ$Y>)eHaS=tUC^$RT8%t7bJAWGg@H-^cP-xZc_UosOai1we^ zBbT(TU+YhXJOy>`+IXL@4ZFOQyBxcIXmdS7bBf@_^+ClKNNZF0c;V1jjah~5`Y-U& zruu;`71)B$5517L>9vxTkuWDtoE27H9-{@uzz(>r7f({6!9VN~WZr=H_{~_mXF1kO zq_-kel}p3f!2tp2o5se*^xhcg7i&Ws$G;*7!Z!e&1tbT`9!c(?rr%ZNBPt5Sl-ZF< zh*igWN)^7aO?O3+tT1zPJ=Up@%}PApt%Hw|op|)EJm1V%M%_ON)a{15ma}lIqYHEmMDmkbkS^Dkn&}2_XYG|8P+%8+PUTml)V`p9nHma+s>i=E0f+)9#EVsK<}jq z$n>3t@BomHi{nmu3zbop_C+zvLrQ+Ed&L7ve@SN5jGon<1Qt4R=wDs$IaAO5B%7Wh z3Z&@hh~uf=K{(PFhp7Bxmt_~l{hS{ss&wFojb+}w92diL6a~JBr1;-W68}S>AuOm; zJ-t0H(7ncWv7vx(4w2bicpKXe|0_LnmShF9{!69*cKrecSAGeaKEBtF)Ff0X#G%xoQlXOzX$;8TR1XQhfWmXf z-6(y~>udF^y^NFyO+1ROQ#-r zjg3N=V$jKhnSKSwvl)P)*tK%Y$?Z>QE%jwX4{srEGy$ENWhOGJw= zmssxpjJT+do879I)A8@l=3XO(6)WwGdNPr6nCZP2^D<{*+IHDRUo*L$I=k{y^*!q`A;m_#g1P=uXJheO{GY}<3enBV?+24d z8#FJbOk0kA>yg@zr(4`zBf-KLT4U9Gq1?F+lgLh^N{_7GJSH}xzC(stA36miuYYJD zt~*ydqRv%nRJEMTrBJ-`7OxQ{W+7RsVpY$*q!lZ*K>#kE||Oq)ck>d=qd zE9HIECuqRgv7n~ye>_XJA0@*Fgnd8@iN}}e3mu%jB>`*wBa3rfbt&$ny)2EX*1S%t5!~1H-M*mD2cYJ@wD*+__*`^&J!rPAq&xX8iyCw1-5cs2U z>nEg-B@i3OVfu1fRPM#g0czlwQODsnK74vfruw9%#jmnoLft|oM0}i--7S8@;7RSA z+UwgRvXvSH}GCdG_?%k>fW&O{2f+8+L<+v1#BH( zGIdF~B*1p~aFj9At_k4aCaBX#eFl>}T8F;H@;h_pPDfm!y+UR3brVSvixIHYdd&-4NV3sy7BZREY63NWj}t%^JdxmRzjlg9lvuyWtO%-l?ZBM z^?O^a?5hQ>gTAx~xeuVCOGn{&RYL037KNL&$-@sVABSvO0%KYvtq@b8uenoB(3Wmg z488v(KF-;Og@1l+iAC<5f`MX%$=y7h^Gzgb(ZbToDwQRnU8 z&yfPEyS6{zOm_qBE=+0aCNteHVp@PhaUv7$!zmM`v>pXfIpN)U?#lXYZl7w|w9{uL z4-^fA@@2h=YVzpFo!_hjPt#lT@g$ceDXL~$&ulLsGd`l%KY5*+nz2jhkgSNzV!$Gu zAyLjFw~#))+DDZ0+b^;>Z{ZaO2v{ZI+gR2Ma0bXm7e_dMWNk-gLV!}ZfYBUAtxo1o zvfm2T_vTZ}XR{?k{MjoqNf`})pU!xTOR>t(Tb2hR!a?Y4aT4h;qLa?Va)B&4&-=U{ z4DPoDtfYK6J@>&WBZ)GHs%D>yry`U=hosDKNw zh5hz+E-okAc>K_9m-K24(^m(-Br%Fo{cO9b_mq{Fk*j&i1r>BYXiKtn9`@Rb*XAJ- zh6o}y1dPO8ANA*WW3enEdB{DCyH6|Lz4Es4ZyQSA``)V3^+VN{H1oyR#>2vzsmaj# z4?SDNTR=uf651K+yjkMQ=GW5bM90amceceVcPlLq)?oA@O~5ItLgSB$wke6@ty84n zh&J;|c3){-Pn}Mt;;mP$+E3n=zH1dhFAq)OT9toiLe+VD_tgR6LPxfqCXz{0*L5)N zL$ap{B*Kuq+DmIG+k^X!=TcGFHF8%c2@OC$T;8{Fc0`2dQmv{~KcdzRPW`-wZU;o# zKBh!pVQi#a+e%anOOXAn4c7H9!+;rif1k^f#8!sOuHR-W;2jtR55&7F!eb|pO@nlY zXaHji%p!nb{1(!U^QJllzDnjY4lT+-7+=xh%M6lz zW{@osM*E32v7t2dv5=7g86+D&$2rM(Joc2v*M(mxJ2bXll-a@895Xue*~b*MFo}4O zV6t`7v~C**37fxWfW_kV8_%Qfr(Z6*mA_0%Sa?pX+u2t79h-^zzuf*-3>0%p$__pB{DOi_m)PhnVFcNT~4w^w@Ow`CI8EywRF~>dnwQ7Y=^j{`r>*%0K17> zuojHKo|hLS@e6Q^2Y;YZcWZ_fPCxn3K-JETie8_C&m0K^ZMcNxB1^o&(5SM@)^|#M zXv@defB7u>fviHNmiFi&DXttZpUO&O2~Drd_lrwJzn%Cn)~J=4Uz+Q62F_l7i`BWe zDLdYgLd4G1qeX|55Er`h{Gj17KMNpuenps;X5UZ%NM-c5wzdW z1)WzG#N_jGw>~Q}P1^I#Zo&MY!SFDTnKweQ8Vg7(Wu(Y6fIX@SEuSbh7Y;y(Re0~v zV)X_EF?9$IMG5oB55nyCH7%VhQ-)ZSXIKNO*dh|+5Yh+M`VGKN$mSV(x^FCUr!pV+i!^vrfTnw$#Sm0e;0AVAb(9naW(J zZ$tmMFr9IILDQhejLQ54=7-S(LN86q1A%7uXEjZ>og5vqA9%sOIm~1L`WO)mX1TmY Y561pbMvM;wqMi~s-t literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/replhist.png b/docs/interpreter/screenshots/replhist.png new file mode 100644 index 0000000000000000000000000000000000000000..5291404fe1670739f979bd1b26e0d916a3144379 GIT binary patch literal 31481 zcmeFZby$>J7Y9m7D3U52(mizNp`}Fyq(Mp;x;qr4W>AnWX^%=vNlFae(hWoBkVD>g zJl{DV-;F=-^W5h?hd<_l&Aa!z_TFo+^;>KG_C#uHD&N0Lc^3^0?Y^pt!c#OfOj$HE zbT}?H&@#iFE{ukDH^)w1URzaOo?hG4$=c4r3Jpyq@?#>-GhG8p*q+};>?2&oC+ix% z_vjnKd1xHoV5zV@X2Bws;1|VUjCzO57DW)sCi+OWBkIn*u+Y0Fc>HW^TV`_4o}Hkp zO-xGt@H@$Ja|=Qu8ukMA8vO>4n6kSTcvu^y)Myl!T;?@dtWv@}nUHuiT%=j>N)8T2L#Ets`J|K|fVl~$GX%sx%I&A0ma2BcGkXgTarFr=HO)SaHXU%TY*DO!$%k|lxW(FiuEH?Ns$cft@ z-_%my7*cF3)%vZ|hxI-@k6;uaHmEqS?3HCdB$fYTEg6>5m1SN$A@dqC$xw18wpv<` zxu&1~2+jxNTD<&T&t<(reNUh@{}{RPSZ?@SRh^wR(w|{fG-a(Pec8zIRWG&8VUGN& ze!?SS(X3_W*n91Z!m&_Ns zvtfRCRd}JgoU@I)@!g;kJ8k*d3)u<(4Bn0NU|S;euOZyBp87AIYL2<*nxusO`orX| zNc3(gsY2@jEb$n_tPB$`u@A=o5q(|ugx^4r zPJs4~EDJ^O7i@?p)cz7|aRh&+mDQYn3h|vC!V|s_#gHGiv zhfNgv+>Cny>#i*E1c7JB6Kza_P+w>KbhK{^Ts2t5A%+VCHH5U7c;px*E#zmoERS)2 z$~|~@_wyewee254M&30xZcoO`SUYaRED1(mTDuQVX)8BqrE}&76xyqI7fEdd=VWb!zT3V$Fx{ zwUV3(NkTB#NTR}rl~O*Dvw@zmanOE@A;}rby{iK+dijj>PnutmbK65D$B{O1!yzTk< zaN%SDvc$9C>mpyHA7H{UJ7Szdqe}4R#@@1a_xNM5!d%$bGUrJqglMXg75eyECyfmIuu!S3ib*)2>M$n@VN@Sw0manK0t2Y%d06cXYUWg z5-t;1OnsIzBm7olN5iMUPs8t##UpW^70_4X2`44tL*5=?dqFDR!W5j8wUp}Arn13` zchwW-Lv{zV!~OiTh&Z?<=bbNTUnIYHe(@S(8FSd;*zyy8KxLYCUl=Ux1l9n@JDg5R zm*!60nFg0_m0noynSm;u%IRDN-Bg^5JlAd5_uwzO>cK?XtB1UL2l}02=M{ru zg0gQ2ZUPIiw{?LFZq@B@JEp-dnoiMfnpus zWxhLru*be{d)ZbT-SDvR5iHt18rH518*hh#4h+iey9S^B$iJg@kx0SQW8i67JB2uc zuf6CjHv1-;60G`8RrJID$A{g2TE(*RlYSwEO_*%YZjV!YX;RoQbuoVy+^{NFbG1V_ zN2zu9ClD7?Ri{gIA1*yd%oUs$j^%0Qy)B^8OnU-Vb?R@nVS1Im$hkjqrpGTN;KuKV zRS=31@+yC%+n5vfCgi6$G1E(y*F8@a@HLYrR4&83>8FK$a9oW1x&EBhZN=?O%=nAO z3n$|%{&A7hHKBE(Z6O-_@8gayB})4(XG4w$&)be^sN6+XoXDrvtIGmOU38}k<`GO`rOITX`{8g82Hn_(jRwOR2J?ifXT{i^c-V*wma<(1p(h z9reD%;8S~T!$2ZG-iw83`Jo8$AnVH+?ZOv&&rWxEZ%Xr|>#v`L$;-DAA2Tw?I_K87 ztgH{`dO>{X?CtsO#Rt{xdBh1I(a@%I=EbB&(hyd0O@2+`jA5DQ0ja)qrFUK%%<_+Q zgFjZbe?Lyg6CD}aoe4bGJ2WNC`Xz1Xp}Aqy<+FsmJk%v~1;v;?FrscqaJ4J7RD><} zlqKyM8~Ep6yk7XVHSS+xynD1>?>q}XpQO?h>7RKu{Nt2VlN z34AnW0<=wgG><`Q@5ml?%<7-XRACT{G;S>AUM|sEb=VfqBedIayfoc!Qk*G>e8N=`9ZY3bt}L zr}qXsIJ${@OELU@LLB%V)eK^w|NV%&y%dAKhBm#tldBcI5RV`aFN5@5dU|?E*H_l! zPZgB@(;fIriow?1-B}z2^78WH@e<&1a>xC9}pi8 zFX*4Kfv%FMR&i}RZz~6V1v{{nqZ{xJX;A@w$=}caU;gvoH{R-L@ZX+-qC&TO-ulmf zdP;&&6Sy^@zgFvaE3jPBcO^mpEWPwy<%VfoG&ET>RRy_c-ss!2_mW>cZ#X+poI`V> z_xXlfd2d1|n{!pBy|~CO*|=2GBF{L6d>so>y}@oO3E( z75&ZwZP~v+Y|%s3DrM<*axm_)We5NL5qAea_)_V=Pif1BBogzYy-v{uD?hx|Y}UGq zOY3*`>1dr1`e?HLd65L?Dd&HO$(C)nQ->c+8&Jdzu3QYaTaSBemm4emr!NLzd@BLi<>2_;rBL=qY7N@Px?P1pi zfX0B;XOr5uTlG!RF|&^!R@UF1)e!~IDDC#AL(%QluO-3ggXec&n*6;3sO3D52}ak> z5_>NE>~`yzUNf3)z#Z>4G!kVI^Ia~s$2a@+Y~Luac5xs7Tnw=j83 zlUMtV^l*#j)-o>(_82PjA%K$C z>}6_`=JB`hpLcI-e8!#EBxtiKJT?9f~R%^Df3VloyFaOKP8U5Ff?*wE?^ zt<0|#AkYw4<59o2mU+C=C}cyEJe%yY{-)k(`wia4Acb3Ix|N-pTLE3_Dwjd(BO~!| zI!@~6U&RQ^1^ZH8BuLo@o~{+zZpCy7jQoTvrbY8t`fOJg+jvrb+!f>HHs-HRj`hjO z5?JH%x6qsZDHyOlA!v?Rd3r&W|IT7;v%(*VsH_C5Q;t+g!jJRSMi5o&v%`XJD{~vO zNi!b`G{~R-x!?6`>BEnd2ncwBOW#tsux1o|Vqo`&<5sr&V5}D5ypl$GrlY9SK;`&} zz{u2ER%W1n^(`}|{T8(}u_hlnoNn~R*S5&=KqmE~`As+C#;$9f?!$hbc1J#o+wvoF zZY+82U-Sxpec98h?oCZk20i9Bb`BJ`E*Y{r!s{8iAMK=?q<;2ocE_8A0C^U4eWr?kI31m&meu&-|yfb31R#=dt z3zKmf&5eMlAHoLItBu@T>kc^k@NaMm1oyH9T~{gv55n7PXZZZIG{oqs zL>V+1+&xppeA*~?pw?ge3c+35g6`{smE(LO1ynM%dM5LM7ds=BlWMLyp{-g4QX@yI z8CWuk+Cl-gE))wBDI3>6ufjLfhHIYESD1~p3GN1~ja24*JH5FIclXz^eDi#WC($z6 z%voKW#lz)}iP(>=TW9YXi#8OE4V+Ane6lDA{|M4_@)ABPXd z^VAA8RT#q`z?EV(J|};+&D)9kF3+R-B|7-^Xc4g;;s>iR&rSC)ka1jpDldP)2gxMq zhweh%US+N-d|&w85EFv0+a}yQhlq{L~SfDiTl{Au{yTbrMVY z9E$^flJsS(&1T_UmzGh~i{76xVuz7xGc|(Xu@zR#Op6z6`KopblZY0(Sf z&u8>yifUF~cjV`%q~^27rU>&9_pFT8)JIQ#O6cd>wKFi}DCSbL(abt}H7LNK(d2%v zdpaKTWTUgeQ%$*lT42_BY(>eevZ}6oI_c4;p33Cs6nuPrsT44_wapq6EL_WeHBtsj z_Br9Sx}%Na4}9|CJJTQTxJ7@MSIdP#wU&J}l3&)(3vjdZgxMR`mA-4$)FjRQW=w0T zLfLX1Vr=bNc+1{=yf?~*_9U{f(YSQoXM@I4SR*VPstKAfH=-2SFFRV3h{Oud!_&1X zI9Yo7)v#C$Wb8ZWxG|`fBpBR%$cf+IQ$d;UT~woG`+_gr$&pFZ*?o>XdgP<>fZ8&4 zpNbaEHgfE5nc zGDf^G>*JZ4+ju;cSfCc2TD9eFQ%xffc1z?27VTWL^{UI!Y7x4t%t~0lVZpDPOPirC zzv1~QVHMEi<9uYrS^;xUv}}<#*K`qH{K%0PS<;>NvMxc!$CC@rp|x=%})HppdaU5Ipq6X&7)9&%*3^HW%+H>JUWj}Q*G zq;y}DT5nX@S*$Xo=OP>;O-~clb>FVz4e_0=WwO5Cwjiv160fez@K zI6v6*$Y$_Uk}zaCUrWbgG|ymT1+I9J=v>CNOx{J6j7GR}Ra#!gGp;gd_cg;nQ- z;7y|1aC(EX$c(a9#)Sf8sl0JM9l7g1So6tF`yl%b@%T(!KWFGL9FF)(CLpitCBZ@y z0LROivl-?4v3Cpm6+Jckjey5JgCkyiQfX6tpQ2yT`Begsi~-DYn5e8->KnzQtXG&jK;^@$=%F`8O+w|Q3w9H>NY-OV8dxd z{%7!lr@eHX`Rt#YZ=Yr$zZ!4{=7renKM0SH&PMn}r>q_D(LmRo=NqkgArvRbI; z;ekf6lUZR_Qd>lcCQXCh`P}0qGQt$wRoWtgh~sa!^_NRKo+7(%7&413bCe!(5?6SK zAKd;NY&>?>rpa!k?CV&44l;T+nz(RCW@3kFU|5S5604^8A3(YP_3r2^Y}+gRNBtQYiH;(l z;!~oJzf?b06ZkS>P&z^ioh!;^g$b1060r~0VM4v2Zf)_I~*+iTX~=?dH*E0NyQN?Xdo@nzLog z?%e~hedA}L+i+D@1Az9geJvakZ}&fH1fca^+RNPAjsFh%@0$LrQvY8)QQDj#FuEW~ zaA^y+U2`zHUF&@jb*S{Yt)nTI59tMFU&%tn%^dg6+Dgy5~aSOt4ZpuSCE#5;1@0_2!E@C~WLt0LbjV0=J zk?rJX{sKaVT&T2oEVUSakk-Bwkw+WXHPowk#c)8NKS@Px=pN5zOeCOk+J4orbjjAE0tB_}&!n zNM32{`DAy~r=He#UkFdWikDolF{Dm9_tq-?{_BOIP$&;X&Ifxc5BEWiR6^u~iyUJe zua(H1dK-GJCVd+TSpI!#dvIjHCc*>{s@y4ahO@9kdu)R zd-z;Buu^FA9W!#-d!?{(;*rvO5eHF|ZNL2%98&Zx`s>C#slT7`T5YZ7){ADC;u zIpl(wHgh!Ue~M4_2%q=+Jw0MSm!(OFH2Zimlv(=ja%gv5FFpF~y65ACB9Pix4`~jz z>e2gpEOI0NCZNU z*>XOEPYkeg`Sh)`DKRba*{ERmNxKzjPeuslU@k?B-Em3BwwxYq*~vRYELHI$*vmT7 zQ>2*IQ>s3j(aVZ+w)Xf{xf*3Mn^4QLtbi5hN&7*!M@6iEWk^c2$`FLD^<-js)s7rSh z?e>JFyPZqp0S8@f?j4`*dFA>-Zgb_?A-%+O<=#oH+Wo?GRMO2>shJ|%I-xfg@Uute z=-83?40uH3vixSRWV=194lFXj+tDp7Ruh_0+3!L&FbO5&UVMA`v06Ep2xi6@X7Mz^ zD!V(n+=XisBFE)JG0JbtLdcHjSV$Cp&qj7UQlMXGLIR5cujJEiu0GeSOcS4^!vvq` zhLc4~Zr>xU(vbl(5MCJAP#r7O+HxWp>2`8?NctB$_|uD`eHq%z7|%YL!X<~+*yN3= zf6Qb}kb!fg7D)p~>8ylj-A87Gr&RV^PvAXCYb-i4Aw+ALo^AZ+8YWM%WT?}EIjYK- zY-6wAP=S{(-(Vtfb40NtPn1l>UR0)?Givp(lcDxk708CMeCjPg&Hgz$b`t(03fqq6 zG&x%_HZv*g0=~Ec^_56Dwu^}>{ z@)#ka3|G5eO+7niW;9_w-7eJFP55;w#!KXU$pmh5rtU+Ec1vxM8_0p6K*z29#nzFu z`ODR#*}XuKab>Ba5IH`ikIwiokaX~yJIp+)Uy}k=M6PXHSru{>UinBhSRx?+JOK^hTsXi!i-_*i|zP+(d8IwrUlJL+y~^% zhdF^J0yh2X61z2)(gZJ#Na;c&2!qaAH{OE$&HJm@GW`mWhihvA)LGZ>L7Q-?tpjNz z#=WUa>%P>FTaljSdGqF77b-`5{bB)da%vGs%Li#i3hVerWS>((!^srqeF}c2tRKc+ zvqBmEh%V#@1%#5{=cIELtjP$vK<~yq+%LwSlgt4dYNp*6csVKwxi>7R<%eMyVN_R* z&w9-pU-Iz(HvLB)Axlt9#-2+K?AV?5?C%*?eA;~_h^kK5hi6z=KB^Q|4>1Q$7~a`| zcAs}m=WYjGuLZ3JtgvIGbsTt`;#(YE3z1J}y2miMjXHNrxT2d}mIe(4>>5OE{=@(^j`KtI>anG^-Qd`UO`U zaglYkZL_o75o}pZyLKlGYoRGT@B=a$j z(}lf4e8g$cfn41j%G}5g%@mNIDQCDioal;_Sez8_kwebe$->OK_fsW(_}izVdkPUB z(0%!G%R5{coPh0zeNYI>9e@WAH4LF_UZ0-sD!ZSp zwcJ75kq(yEKVjPID-;TySzl5U!~HZrgu|73kSn$4JN|=mEnYT!SxF{pGP6UBUM2c` z`OKx*n+{AN6X@^gRwOHT>ft+3B_+Kj^NE(T7hg+v zLljuZrb?fbLGzogk4uol0=w{J5hoMhK6{gqnpa!f6$6ed@Ny9nj|XA1{;H%~4u!k+ zB@M#H{s--1ggYzcMeWgKYid1@c#M*z&xfF^{;$|DJ{)~9z2Y#fQ$%K69~Ew_raARn zeU1h)U0H8?zGzAwv?*n6nC9)jJ6)9Z;rV`X+H{k#XSpbqG&CgBU61%!qAoJ$Z7Ey_ zSeIc{){KNN%{xg=msX8g;rH8RrKgt^CPf+#Vk0ka&R{abKjyD?l~NekRDSGK8FE|` zr|kXkxtN~Mj1?U_9ygt@5#*cF^ivr!LFn9s-nmzI9PK)PbA4JNvKPI;HQr9T5w*bS z=Z3$zHb=J!b#;giaL9#{nRuI@?>GgeP4`}u1YK>_LXYAPWqrDxRp+6BN4fP7ye%V+ zu0V+2=I6rI!{@y$`6HSV+-uS0)SOc-b-#VeOTecr=~e&Uku{8Vy0;xczoJ8ImYde? z4WXAb1^{f4wibwL37qq~*r{H#Xh)L-Axor_aujQqOwuLQNN*ZU4KsR~s68jlV_kb+ zDNt}&XVfk83vNCR+P0Jsz;%$>tyxBRZsy_JZH|79t+O+PJ=n1_z>2f} z)khgX1Nz|>9J(3X<*CbLWMtzbbn9Y9>#s%e0WJ{N{PrXWY`5mB8I#aq6bTq|>2V4x z+vSbIthr=k2B-A#rRy>y2t^iQz`A_w&QO-!NCCX6G|MvuC~k##5byI%v^#0XqYmu+ zohWpNT?UaV0f|4Bn%3I0kL)5Du8r-e?$vtP_?{so`kT z%cV=AHw^mkI4HF^mPLErOJnM62}>+w)2o|Sm_e%TQi8SLZcc-4lA!V?Cju3+$gScZ zJQ~Tok4u`?6+urF(GsEU;#M0Mdw_`%^xU4Pr@e0;zVy8$0KBYpZY#e{C@`l>NXTfW z6w&4)CLLK-dIdm>J^^9H(j*y?h)FUM>lJ95A3_&0nc%&TDInZi-`2>mu4?E|rpWW? zLX-v0o6}Iq2hr-7=n(f&ilzKjNoVD)tw8*)Y)TXxwjw%8qeKI3^_%MBdWpG_}cdsYnVgK_qrNt;B4+W9sD;!F^+d0Q< zm5bXzD11r?)W>{-tzMuUNy%N_U@M|7*>rSUA2h0fC@{@oM_^*c9a)E_r6|r}AQhbi zGPEewWB`S|APF<(36nUPusr+#mW0Q&1mQbQDg{EcmJpno;!4t+b$~Y<7M^w(AwQ~! zt;f1635J{;x{LF;FtX8mXE$NlVo^%Ik2z;o&Y{*~iB>?mMtPRzX=Y+8H>~9LF<}E4 z?D?Av?+=taOitT2QWzMC?{iG1h>vwx&Pgv?A+BHD)KAJx967h({J??N3AZc-g9D8o zb>a*unIPO^5PYArmfKud05O9s>(V8CKe!?Wzv>c})_d3H69aR+0X$0g z-Xtvy?iX4(K+N{2;#us@3Lnac_TBX+)UJ5CstW-6^CDS%T0Cs>PX6XtbhlbHcmSUz zu~iRJ+%Ra%a6Z+>BC6*z$xS;e-vTpVX9IvJM&L=NnS1uN=bK*+n}wvEE6-<1kF%N(qohcfy@*p#E zmgAts%Y-TeAfIfnRWQ*ZmjI!_+j4;ZiH1$xx!(q7vXPXrb?q3mjb9K6Q*egz$*!)oeO^I&(Vrj{oYz4Zf zdgA8uII>E~^borVRdbRe0!papi3UK%F{F{LIXHnnlq{@+Tr>$MuB=~rj4^0s=g)b3 z6HDO;4{N`ggpK=7-trudF9+zhy8^`dR2nx5(kLs~;K8Am&PJisiFp80lWMZbQ0pTn z7my&@u^1fCZMO*S!-@OgJs>5s!kpo^TkAtlbM=Z!t2kQtAP^jB8MhReZfkhpBN@ve ziG+B@uaBgQxly9yW1ba-UAgqys@1a+URiWCLgZ9dpml7pDp!h4R>isThFy1t@558bh(j{TY`yISD6Mvjz!HmBzHMGIkITs5&fBJ)bWTxNW9}v?O#&YD?b4l56(^b$}z`OAl0_F}W&GX}SQNU^&*v7A{Pf_keGn zz75?L-+pZU`;rRgu!*FGZL8RxiKxQZd;q75AR8%8_%NHls!+@DuyT$+3=5#WFruB% zOySSxV>|-9iD2qB*t2<3OQ|`pqB?kE#SbK^GBo zf5-f!z?;Ni*S?k}6_%l7u>>|S^?8YxA7o76%jL1+ z5}Eg^-sjLFKF(KYHd#u*g61#g#=p&O|wA%O5e})>F2$ zfIX$h^2hx{#n)r*w#hw%vPzY=D}Zsbdb`17%?1^CP}CmDUf^;e;e zCJQr7T*)=U-vqKE>ql@B{`gWR-JG%IHBl5@KJo$B~#LXMAqdWg9_KS zIE3c(rc6BFme}2~B&lVl9tK!?z6)k~I!e0NMaO=km{t@v`A`}b{=kQku93JCu#oQy z>+>>8%_YKoyUY4NNO$n%Qm@4YBv>_6C!ig1kzDXu%b&+Q>WO=&YcpTs>RxD=}SGq(!sp9IpP^fK&yaj^1dW*+)5XB>5#G zE_fhd*UcV(yVfYGEjaN(m~l6Mr_ISb*mIb4;5M=-&ex8z6uYG`q1qXa zDb)Zbh{wu%D!@*EY%g59!@aV1CTfz^_AB}VSdEo(AwqHjYA(7c1dS;7j zS5qqi^H-unXC-E$9|QzrPb5V#8P65>rTk8|I~rtNjMP<$MJqBq6E7yqXc|$xjWLb| zoKKIMlr&HtSB8uYJ4!(c872(C=iKUcv+o&tOeY@?J3N7%CopLb{;pGOWXiV=4g${J zT;r_g^mj5srcSz-1~dBeCcQkBWJ%%Q$uJi#9~Z%Wkqe_JK)=(zPz?kgWSBEbRZDzb zI{={dnvRxb9XG}=osLe)JrQZx(6IMcvEzH^=ugfDV|bV~FcP@_DWZxDI_e1GseKKS z_A0ol9MQA~(cYUq%YJrF8hNcXmD)v?+dzvz`IMEpSP^+v5oEtDyQWSlf?ld*< z;ek(-LFQ#+^4qRy3kj-d99qGXfMu$ATM%u?T>mM0z=B_HO=Vd_4Tx(EP$s=2`-7$S z9pD~?-*hz0ZSBwq>*-EAmu0_}#7|zQ{b-cKl1B%Ha0bSwq7dRWS98!9vP9xDd7iK} zU$XgvA_sORvi)LdPi0wVD*@iLT^4iM9xQn?o~f2`<|LzawiHOv{UNz;0l~zx!Jz0f zHc7VEgPeG@!!<5XK>}Vm0}fO*n;BDJg0dmu9$DMkrhzz4dKnJW-@MEB}T|J+|M*+HVDumhq`6 z_6ifmW`2>mhZz%j>ffx{120D)qIWp8DB*@PZtV6^J@0*ejRC^M+ zd*rZ0mfRvK>AESe;3T}EbepllrO?w+n&S$nG;AT`xTY{lE?~QmTL*F-*GUy%L3IqP zD)#S^{~39ro#?x+hctq#XZUaQLm99hGM&pdFhP0_axxsEmtFi%+Wj!7o~BbJ(uC1D z;3l?)`7)lF(|PEyMiMH)r7pxCZJEQwm=B~ZP!?oN5r~C6bShBgqrnI)@^=E>ui{iK zGFoi#^Cp!t$?H4JvgB;=mwLix^+5x^ZG1(X*F6K`VSD5?hndTXH(_+(C4IOYFH)tF z4||1A6tWBpPWI<~@zu6>t~3jwOyluPeCun)*t*1Yu2urH(G}W{$||KNA+|Zk2l#RV zzQVR~x8CP`bGb~0ziW(xihC<+lY%3q-?NVOG%j{ttE?<1>*zU{PJg(}E0Q_a+tsUN zo$9@CmF}(pRVg;N`E6R!3A;%5fVU=a<|{(@2x3;0VhIb})-*RQa~RU!YSI zbM$Kh5~at|9D^mDnIX zft!UIT+8XY!jQhxyRc~Cx9n0_7fBAPjG%d6>eQ^GNcMkPZdc1GdwuAB^puakNx1~{yV zQdiW+dXP-Ff}GeI_cM2fXsaq>`H3qRWVM_5y2t{e#B;dop@B+G-dZ{8FjpVtje9L> zdV!Ukq4BOaMGO#_Z>>}r?bWIjc&R>d9EfR5rYNqwEw)GjtPV2DF-f$FcdZp=@kqFM zS_?t=)@DMA z4>Ic*$lrkzmfKIPbt~g9X{Pmx8P7YbY)vauP7|1GVy=~F5y}_(tU3^31jkzRvHpi@ zOM|MithQ5|%BBi`v3OIIDzczrgE#zXzzzXE{I8FrfRNQ2kI~bM*Mz_$s67AgkL-5f z*_W48&AYc)h=Wf6YUMZgs-4^HHf|mOK`zasd7A#ySvKSa2~ax8uK=6gs_xsm0Qu!d zH`t{Yw_acQ0Vw`*W`HklktJoLf!gu+Gm+rgTV%=Xk3fX`a>HR-?{5(SIbRw9rRVl0 z^zFu5Q~JgP2=v5ey75-&d2k7kocsE|+39V8m;r%ah)`U&Wq=VX`N6t3`F%f7_^CV|Gc1gt^<~4s zg34TbGsC{B z7{`Fw{Bs;xDun8lMf&c-6xW@6Us<-fmuPE-Y9x#Fsv}r7j{eVz?j;E32uAj!rLv*4=8M@WzUg-22n&zgJ_R7_hMM*TgFd+O2C+ zmEXU^hc6Epn-^uWR+ihvgK#G`vs;5OeH1vRRUOs{880jh=N3_g%zwOCkvbr_>dVlF z)&aP$7;q^?oy`bd7cua7(UUV2J)U?>H_bR0NqCn@7RW6UA#)p9(kz5;_t#ejmX@}e zZ;Mnw4hux1YxD@#OV~o7#^V%i@EAdQrXW3r7c6eVKU8Kif6Gk*Od(>4XChLQ3^ZgPuXMz4A=V{PGt0mUc|Fs=KS}Z zGz%~+tf2{YsW0d@>e>AI^EpyVjxedlMQkSOA*ZWs8{DaPQ$1aj4@ZK}{%9eLuz<6q zp5NHx*Yk}qx=Sk-UOSX^n2b#|Et=Bp74 zZ*drSIom!Md;)RMYd2i)rSfWoJifjS%RBdL3r*rz{4RO^2bnbcqV9&EL7Q2vLz9t3O(ljwf|+?*a;Y!8=YK^nm&-iGa<7NNTw(t^ zyx#BOxhfkb5(aik>t(&SOJI8|kz*rr_41YIoPgoca8jcn4hP7)<=*caosDTK zp6t>Ye3hhkpMieUAxO-r7mfH#o5lK1Ha&vyZY!hPu&xP!R>uo5i8dj)Z<1Xedn4OH zf$!}X-2xq(u1?&yzEu}YJO1G2HYjHzMpNW%;~K1*c1%k~iXD&YQVD>tSZD7%CT>>P z|A}t-s3?UeVGBCR5lTN+OAYb3z42GZ%{or;Hp$J5p}1p~*tW-;zwA(y6;GS}g%-PU zV=oQMj+n0RiJ14g_bn3HHXoB_Q9VF^s;3djKS~^VoON@#R?7|d^R)F!cD8a_gFBmShjRRzh~@OfcsKLB=M)Sun0eY6 zgDrup61LM*-F3#dkoGnGf;^G0^CLWdTxxw1(R~KC+MDZ(5qp!v)Zcl>D@#~T_y}b zZrwAu`fFxtXmZ&^=<-IcO1waM)}MJ6sKncy?Jpt&vjMtIK@X@&@;;5YpwrFFn)EoX z<^&l!zFHWRMJssnmWr+40o2(+1TnX@E|%dz-KXH<+!pLC%Op1W3qU>N{kjkqM|~{Mz^* z7rkyAa^J7IZtPp^h0juX6+)Z=ORhedc!_wT_pHs~spS1)5BPTNt!)}e4;GMZc%>mL zzaSrV@y1(gK|YQ&snuoD5KE>P%?D`+%0T;qs*Lffi#C%%K03#SKIHPBGaxr1pqwRL_EiVei>~V?Aw)&WhXr zN!dg(pT&Opek)qemc0+W;py!#Bet@!Vg|2?SxuF}66@{bSs_jLUK(1s{( zd%@7qc#Kis1@Nzh{M&8+zh?J*ouASMT^^)MB-Z-?Ma{7ZfR_Z#M_iwroLpuyf3Am~ zmSy}8tiSsVxK%%z2MXzN%RIy)>rti)5KNl!UXBIWOvEz^(g=KVUiu_U1A=hcz_Udo zo+^?5yD(EIQaSsND2g=i0b%O^6)b5~(#a$Us6Y>gQ#no~Ken*M(n(-;j;garxp#ic z5u@MXAe|^JPrWc`=hKxh{ps6_0HDDLaQT4Ndm-fLS4p5yUxtLp6~G@<1Iln}y+=gb zk~hc!trCAY=ZJ~l&PM`??NVxTaCsMt7+X~K=dAaWH2=7H^gFLv7x1+SwN#BZA0_?J zNzY!tJRH!H*s0V#Um|NtMg_e`<4xB>-(G&_;3HLV{v9ku^VG2gEMU^9v_=qWjhpy^ zd2IGaT1m}3Z;dP~*s)59p@WaVDtMFBvnEB=4V1<+Xs)yzkrv5`#IZpQ|2 z4T!C!y8{;$3W*t&^7=&PC2gi(fBA-Bb|z)jRIjiZ(1g)=88u?G1GG1|2>`AIE}V4W4-YBRW$aNc@r$0c z$FHP1MBR=&fNUNraCoz9l97C8Q~%8ZODK)C8-sq76*2@5OEL_Hus?)Q?pehtnxZk> zGHFkq!)ebU|h#3YIVkxR=Re zJf?_I+WX@rv3|Qt-4{zBIu%nJCH7E~n*Hd7s;Ol+kK8$%?KjJs-y_B!w3w7ap$UxkV{8sOYcs=v9chgmo2H$(`m znunY(RwC#x7jR@$oC3BCM^ND*W)`WIBp=QnI!>eGll<3TUNj~^{ISgXuy`+t89+UV zgO?kG?l#4aC@$TYUT_o60Uwk~*7K zrGu^pR}`1!to1Zpr2a9AF8n(`Rfl5Lab9nI2Y6MhFmqj&Ya)Cga?A)gneUitY;`8K0zeYb#|j*}OB_IFKT@H<+PEGaG#*1-U%7}xfrLKfqJ z*ZU@|%K-M93f_|+C`xoDIHWMpQfiv}Gx7k>gh6|ekh(=dtVnFX8FK`6HNYk)5K!;J zG^a+fS+@Zxq|O8?Gsi&mJ3_jizqtrPvb#(>H3jVQwWtG1V$9bTM1suy!>>EYxsHSE z!qy23Or1n%!Q3A4{qLMm-@W~diWVe_whn`s>nbY3r0{^{8iHt#Y%jNhs0C6<_PmDg@mdHZ?TeYbSj%LaRD8 z>WFL`AcqlYkj|`@n3vRel#hfucv)G>z=9S+a1eCNo4NO;-}1N{abyGE5rU!)*G2(s z7pH(Po4WAj(~IICyQ$XzXL_}Y6pN2^be=RwZ$0SJZ5Lo}d8hJOD(!k+UTy7RpJ)NB zghU`<(#R}HmWni8h10*wev`cvBhcTOh1u3iC?F~M=t3Y1seY|xh6Os9=L=;f5#T?F zsQ6K^ugn544XAYd#|E7M3XH!h_09$la5pKa8=RAg2x95kn*Fu-`%6hez5~nUo(8T` z9XE2*Xv8q9=o9X_VKVfKY;20)yn9wi9h4;v*v-O=y(XC(x7a4NzDw}t1;z=myXUDu z&`sD+E~h58Z=PX#seZUuyOs%Plw&vgeIzPizoaWgkx(`K=LmzSaWiWKgR>)U5_A$3 zWQWyr=4yf>vZE0{w#(H5_=Cl`W;C%*WvB|$e3R~c%#ANM=SLD+4XGi z-o;tOc-^l#uO~y};Of~bm*)!ecD3Bkfs!Zbdf-&{FNLvT)4;NLT*@V=fjaW=%s%s6 z*kPjdHw_*~A<5X&U{LzYz%_^Ejn|7)ZfXmo9D-whltakC{iZJSyeuv#a}P{YBE8)>2wKnzLF2w z?yruQU!4FE(~$o?w@y-r_BFyKeQK~S6R;sejhKa7(rj7byn~+(;EZAR>o6KeXc7)r zv-%)~*W9`f=Qf%7bxT}a4SupsXDt0*>#4KO4^)dsAHVUL8W5kg48?^v%41NrNf3$f zH;Dff48!?GRLk3gP(f(9af@{q&WF)Po<4ig5LcLsZT0GQjtfrx?b)d(Y0i`{rf%v*R_CCk?ytwOey)*;BT1My(mYO96~PIW-2t}SQQ zL$!)2NQCvzlPZ9AU*!3gb<9RDAjZCV9lZK8Du1=YC;$7+|5oX*z`^|&A^+`;|8fXO zjsIoE{}*S6pX)(rlEJ}AVD2r+NcQTwG$ya+Yob~L$yrwB z`>_zoAF(?e@+)jS==S3Ynv?lX#Xpu;Ch45M(k6OUAT1RN+XAbik-s<=mQQ{ zEYzsA0$*oJ`H$x=PbvV~vG@ZrJban@;DXl(oG%d2{1FkY}y}GL5~YJPd<)RZRo}>cTzK;GL276OGTgIOEs+%_c&Uva*b9=9DC@| zY-0WUHp3J5%+%M(8FSL0%ewYF1FVh!R=OiXT8SjvcQ1x8Tr1|%q;WuMp^|Ib-s7r2 zz?Y`kCifKN9d7+>g#05Cuaedy1^Q4o4Lb~@l;L`~jHNeg7$EeoMy7_JcMOy8s^2qH ziRhcLEeO|50qpR|a=4XZ&F+7{4p10Tg1)!nIB9=$!JpjiLYlGRcH%qm|3J43rn zS;Di$@De$2&IEFGd~v!kqzI!4YTD$~UF9KejCrQu=3=g6btdhxLO*I3N{KmOg+`)X zA%1cNxI@h$599BJt`{IPue-rh$WG;sZ&#jw9apBprQgJ6;t&pZk+D`@4+eaOBBVp@ z1VlBJwrz^Z|6Ij(!m8#*n-)#xKkzPDQ=_gJrfPAZ;t?XepZXVSwKE{q%7+9E#flDg z*OzjwvOx*PVW|0R0|N#;UI`JA%iKO-CI^L9e$!CjITCj>^@bgvq~6{?+-kNIO(5i& zm@2=&QR;PX+&KoBJ*!Z@CV;#XECZ2krkLz`ybJt9tb69jwsQ>}{3~?e?^EYq^6CH0 z7R!OLAlpfhl}_+)EqO`_TvJ8^4}TW|r!K6Rwa`h$$6_^SAqR8u&|TB%kuel%Wmvny zL<;zq+pd*N#P%)s%@23VkdP!o{Cg!X1GKnt%WDJ0NLUCgQeKTDVneqRy1k2%2YUGt ze*$JS)jAzA@4Y-8{i*4@z~VbaxJ)dhF<9yV1{-J$M*IZE#W7+KJ?csptdm0x=-a5D zXg{O#CxZ27$<{(fTo!^68+Z@!)`sy*Bsv}`Bs&0bVGJ}`N8--meTxB2-v;4rEZwPU zp|;tvwl>fziNz(T7b?sRu&I9^++jwWO(9n~YffHAv1{uKpG6o@Q zadmsN42t$kZ#Fcl3)By^(5I)$t2)a%4enLX6C6j2=jxOA8iWw&N+!UzCXaW9l_D<6 zId~QFzAUMB8{TR`9>hNZjU}C+PAZ;kD2C+CPN!(EDEy6QsQVbD4w19Z0@UzRksd*X z;>BA|JR`53(i@pO1FVIXNtu;3w~kmJ=Tyj3528$e z`1u8V%e)4c5d=1kDhq_sAD>Ocij379>V2q@pN=lR_~r#!KYtZqfd`-sV#u!y4}&uO zx#U37$l4Mk5Z;YP6<-WU0>R!^>t!> z*T}51?%|w)9s;)EAtVLppP^JfOeGNp!0F(j3qUv_4)lEat_4K`?Rq5#*TpsfXbsta zmvu_*OF@Vhk<80mfI{F~S|3ufzQOO!gL$`rSi}*xZ1H6!3mCk^px!6bQ%c*i zOC`H?&xUSU&f0NwG>*g4(e@`$`DaQSje%Q4rC({;r+UV&J(Npw*V%U?u&H_{$)K{D zt!Ia})>i7r-j@lNb_Vl$qB_y=4V+75dn#j!vtEjOqV$-kP$@PuY^=|p;f&aiFld6K zSyzk4G8Ta|B-YVoV7G3pdfNSc1M3e>V`%M(`>kKkrAe(QO#tQEVu~n<)4>$8_a-6K zSq>fs-1&47KGG(V5J`4APtC!>&n`At_i+jm2&*7K)*PJ8;yHhKeAu(Nfd1tA-lj-` zo*>?3ah4B%d)FGd95^Vb*CexF>AQ&tb8M&*AiGhXII9JG-Q)q=T=fxn$m7Ak!dYq% zTZ8%vbsJ?2WJyBY(e>2wX?^Xoj{)#q(T8Z1$idwd$_CD8{ke{SaOCCDO#%nQQ^Vwm z$KJ#hd`J8OA_m(+tul4H>a?OMj?=e&ERseyDLVxFur#X#mAe}Kny&rplfEG?Yiux< zHf(u!t6{26io78lvfV-{S|>H!lnP*}V$Ewkh1Dkp;<+&$;RMBfQzTw}2 zzW5+mx$6jy(!^h2`e%OR;R^&TAqJ>5Y8T6CL}Ste+CJ+J!n5vf5*3d*b!7%Z4PGj zph8CX1E{swHEm#**Q{Yo!&={W^p*z4%@j2HgWhl7(n2)}4Ou->Yw|ko}0F{3s zKR~9;fEEmcJYNt(KV&d{rxaf=6P6AkRJ~x(z@k1m&ttM^Bx4@@0j0&)yXTVrLH59R zM2C$jiK>?hjBhN)@BAuQ08I`0K*nO-1X|u)YHI~2%?WGw+6^0gE{jUtU3zbU-~Be! zw7DTqb&J-=r)yG-WvalYPY#^nsiD>KR}q>c$=)`_(5M5TZkpEDN9^tCrle(5%p^00 z0(<<8)=5Hvg8UZF*?|z>d8W+odbwlh^_2Jmz-$el_LP&nj3Pf1YV2S@V&%UP$<3oj zpy1bZ2NX>dwfbwsB|RHm!7Bc^`Uk-&(;EaZWYe|3ZF$}qp3hB)@4WydI%5zA1nROw z?1$oT2{_ z*el;PPh^>TeIwXr)yn6+!f3;w8ab5GxdqRl#R`#Rz?ra z*t>zlEvU;ja;N+01`YwTSan*SuP|KTz}g%MV)hRxR0ke$BCv=(5XpmY72_lCwm-t} z`dG+K3N??Yp}TNm9}TX1-Nk}gALLz=uD&+8rl_IYGb6-E=)It?8U(aiKHtQ~5ypKR zK7CeRck1$lKoRAHA_{Qu5&6c^vnWK(is6tf49N3tfAJ?+{+vwlYXxy&DH1p^w`FKD z@n3frBJrcJxWXDE0UwLL!}K2=!|U#5^XO6NRN-h27BGl+^e*I$4wHU}UmCjv_Vl75 z7tnYmU?Da`mr*)1&GqPY)H1=xhqMk+-#lubdMd6Gs(atYabZfw%v_E@Q+86&H~j;U zUXZZYvl@LUy~txEV}^>wp5v*b2>q$ZUw_Ltxx`#6s9(zG@<9W+qC8PL)2xF8E6Lr% zTAXQ%w3&VEIaRYQGp|{9hsy|FW}P}ssU;c8d#a9h8DYzT(0NhHh6r;m!>RKKT@B#h z@a(#jNe_s#@w-&M`9(m5rMHCFPa5=B>Ur}58aeNiDAsr&ax2}myEaPf3y2NraDPH! zkMn%5Hv9C?VGdAVAb-j2#r$6C>@~n0?hfU4NDPZzKWp>;F-at&2(3}p947l$rQv% zsIEp=y9%HTo5KJZQ~D4HFCkW4ERgoG11h(csud0H%u4}ng0GZ@A#i8-%pnG36h4yT zKhOi~0`FvEcc#VA@rPDz&y{*-4D^()D0EZ5NDtHGY{(Erl zxozW82yP<7d;qJYnBrrb2xdhk?sc;jH3;x27jWu$bzyOas0uW`dO{(tLkyuVt>Z-e zb{vy(J}h%@tu$fvW^K^HGNeFHgPCzp`>1N;E942qHX~GnUob1GMhbk%24>Jx-PYG!rZ!8HR}hi;^Xe*$t2GEbe_$#!jkQPdVZtOE0Pm^r}Fqmwg}CsqYx*b$gH znv)`Xor+dx%UI>5Y+lV8BPHgoO(aBhbmOg`l-9TqA&aB=FTK2_lY&U_n zaoaFLS3rN(lHYxlZ`I6}wmCQxQo#a6$J41s&zTR}7Ld6)Vs+Qcw$A+9aB6Dhx6jXJ zg79|ICk;G(36_0*QePTZ1n#jrESA%8$ZG5^?vTR>+>}RU|J11?A6=HdQ-gLS`vUm^ z;_^&V1TE}bV$-+k^AW4!HEKfFa^x0d4p`2D`AtKekL&xtFr8n*S4^Zi4Os!xVdQG6 z+A4a2q0H_!!;bm0+7ym1`L9l#yRwP-Hj&|5-tX(iZO!6$+9(plKKoUryN<13nIs~O zCkhTRBSTg(H9=7ePmU0bm@`1REE~kxqMZ5gE>v31W?KY4mFGOYGLh8Gp2c$D9Tpem zR{$5?jLl><)zY7#QL_~(*pF!oio6<~O(!d$CjOp+S%X4{F!IM24VMZOjj`vn3say8 znl~2nl4kP!Ig=`|#Gqn%6aZZfN8UUNnXJJV=ptvLF5}B^87>f zis7Gmj8U#2!(>9eH#F^Ub?1l_Eca#CRz3gxHf#`^tREDUQ(24z#|?O?agDCZJ(a`_ zGxBb%(+THPOACjbBX<@Y=92U|uRC)ru6oWRl9kVUg6<%Q{2Lt z9?&zjWv^D0&2WFtju>3Hir%-chjrFXS!~mRobMMO8CzLdp?BQ4aX&=miPBiCoOi^Q zN8g{nx{W=ny{YIV!g4K#;BIz@m@4PWORbCCpLki{J=M6{zlk!Z-fwmfF}#E5 zfI!7cg$R%oqqq#}1VeE9S*VPRjHjc%%X7~8@E>K~m&y&SYyCZu=}mWS8`S9{-oo#c z3JLO2CK|kg#aCZbpCgtI6TG$T$OJ{!vIK1STv$u5x|L*b{YOnav72N0Qv`RWbxqa~$8@bLlVt zJg?1|J?6*WxmvNj*|!W4YMLst3B|`1V(u4%#)cqe=T0PGya4-eS+^>_&nrhuGs}lp z@OEVnI@S6(p8Ni1q|{u^<9*(_%QM~zQ6|_+7W%aY9boMp;YfCPkad4?vXp1|tiBa{ zIfat(G6s=&j2|f>%6Bq0z?`PBjB(Gh;?7-4&)hRo@_>K{wIECB@dHJ*t_L;#cvXvew^IBBAu5s3;gH=2i7p400hLh!(L1?E2xbem# z_9iYzL{H479xt-Y&Nx;zrI}Nxu!XU@v8MkH0pS2XK;)}Yuu{}xtAh@!kuxJat%vpR zdxjZ(%UQf9Xt$l%DMTw$WR?z=Rn1!&9{Rd+b&CQ1PhK3}Lf+M<)4uH8ZNV zZS~l;gP}tFiVjB(NF?vB?9B`EQ5Rt+tE^HSCne;WC5Xga*d3H8Z}?UPT=+s2c(sd* zK7Ll&J}B(T;;SVibw@OL^jo&vUX_#P;699l3*IIm*7os>WyDlD0QnCXy5GgmTHRyO@oT zQ|(564d0`5Me~PBZ(aITW2CUEXWw3vC@gVff$6CBH8;1|*F{U%SCKZ-mwt@@(9O|9 zCco(Bw&e-BsB(n!pBwvmk6_vAd2;q56Tpp~K3(u3N&EB;^BmnX_JKf9_}llR=H{oS zDA&WuFV9t+^43woy4^8iRSRD9GX3>Rf#@|ibI$MRtp7OQ>_*^{-;uE)tSKRXUuqQ6%w5sh;Tk~J0Xr+oTy z)y>U+l^vM8`7216^vT{5dq!W`Z?x}S`B$Xf3k~2A{q^2>E;sw1i~RQ$g2{oo=;`l~4Qgv!|O=^v_bMn2Sh>9D}Qi5(XY%vf!HA zfW8I$_?@57qjy7`M+vULtn%7_e)6^FSnFl9EpN-hf{%{(q_r=b<=fl;;oVUJVZo%{ zWw_+*y45}J30>tToimcp&JW4OFD_h2skwX4S-UZQ2=?r@;a>sr*S%LBMI^q4T_`eS zU2NiS7whRRejMh3()(^|$qEVi*M$|}ACS^2xWXzZuBY~qu|cXMRI(ay0IQhBs$?(6 zPx?)C<r0#nqN}SN>b0q zQb9rC+t*twV=3c~>z)b+#|lB4dC1kJ#B1XBE!ZS2=j|XoUbr=5vMk63JAvm|b$+t< zS*&!<{(pzt>J898D%tr7Q#EvS&J5xgr|GXRe}1Z4#jz<(u)w+dl&Vds)gJ>dY|3=4 z5c!g`~bJx%8E03n`4kwT<}w z53gHaVU*KB7&?v7U-2c}ej??@rfvL~n@G&AP2%m+4mTV7X>!=Vx9p#9B%TQF6*(?I z3Y!4?=*oR5eLv0kNzpHRbFfzak_G`*Rw~y&B<}f9GDvW!zaU_;Zbxi@-cShNDM=MQ z;6BSn>s|kLG8rLrW%a0;*#j}{Yxf81V&cH&zkg5BVr#X0#d5Ly_9{;wO4(A#o@G)e}(Z$ acn}AxO>I9iQG@^kUnU34jbH3PPx?Or%SfaE literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/sparkrfaithful.png b/docs/interpreter/screenshots/sparkrfaithful.png new file mode 100644 index 0000000000000000000000000000000000000000..ec956c7be79aa3a42c7d96c3946bfde85729acf9 GIT binary patch literal 52235 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 literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/varr1.png b/docs/interpreter/screenshots/varr1.png new file mode 100644 index 0000000000000000000000000000000000000000..ac997a8c6bbaafc2da8ec4d946502a9dcb22a1c0 GIT binary patch literal 16703 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 TQegk*B$=3ylpug#$M63E1GK@c literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/varr2.png b/docs/interpreter/screenshots/varr2.png new file mode 100644 index 0000000000000000000000000000000000000000..b49988d571129072ca4c241e3e05b3a78ddde347 GIT binary patch literal 18973 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 B&d&e< literal 0 HcmV?d00001 diff --git a/docs/interpreter/screenshots/varscala.png b/docs/interpreter/screenshots/varscala.png new file mode 100644 index 0000000000000000000000000000000000000000..7f95ad23fbe30eea1fd4c509ba8daeaba16fb7d8 GIT binary patch literal 21073 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 IZHK6T1C35V-2eap literal 0 HcmV?d00001 diff --git a/licenses/LICENSE-rscala-1.0.6 b/licenses/LICENSE-rscala-1.0.6 new file mode 100644 index 00000000000..e0d577fca77 --- /dev/null +++ b/licenses/LICENSE-rscala-1.0.6 @@ -0,0 +1,29 @@ +Copyright (c) 2013-2015, David B. Dahl, Brigham Young University + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/LICENSE-scala-2.10 b/licenses/LICENSE-scala-2.10 new file mode 100644 index 00000000000..90d75306c5e --- /dev/null +++ b/licenses/LICENSE-scala-2.10 @@ -0,0 +1,11 @@ +Copyright (c) 2002-2016 EPFL +Copyright (c) 2011-2016 Lightbend, Inc. (formerly Typesafe, Inc.) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the name of the EPFL nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/pom.xml b/pom.xml index e5f7d9ac4ae..1cc2698c2ff 100755 --- a/pom.xml +++ b/pom.xml @@ -303,7 +303,6 @@ org/apache/zeppelin/interpreter/thrift/* - @@ -460,6 +459,7 @@ .github/* .gitignore .repository/ + .Rhistory **/*.diff **/*.patch **/*.avsc @@ -520,6 +520,9 @@ docs/_site/** docs/Gemfile.lock + + + R/lib/** @@ -674,6 +677,13 @@ + + r + + r + + + scalding diff --git a/r/R/install-dev.sh b/r/R/install-dev.sh new file mode 100755 index 00000000000..a3b52248cd8 --- /dev/null +++ b/r/R/install-dev.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# This scripts packages R files to create a package that can be loaded into R, +# and also installs necessary packages. + + +set -o pipefail +set -e +set -x + +FWDIR="$(cd `dirname $0`; pwd)" +LIB_DIR="$FWDIR/../../R/lib" + +mkdir -p $LIB_DIR + +pushd $FWDIR > /dev/null + +# Generate Rd files if devtools is installed +#Rscript -e ' if("devtools" %in% rownames(installed.packages())) { library(devtools); devtools::document(pkg="./pkg", roclets=c("rd")) }' + +# Install SparkR to $LIB_DIR +R CMD INSTALL --library=$LIB_DIR $FWDIR/rzeppelin/ + +popd > /dev/null +set +x \ No newline at end of file diff --git a/r/R/rzeppelin/DESCRIPTION b/r/R/rzeppelin/DESCRIPTION new file mode 100644 index 00000000000..b34f5cc053f --- /dev/null +++ b/r/R/rzeppelin/DESCRIPTION @@ -0,0 +1,28 @@ +Package: rzeppelin +Type: Package +Title: Interface from scala to R, based on rscala, for the Apache (Incubation) Zeppelin project +Version: 0.1.0 +Date: 2015-12-01 +Authors@R: c(person(given="David B.",family="Dahl",role=c("aut","cre"),email="dahl@stat.byu.edu"), + person(family="Scala developers",role="ctb",comment="see http://scala-lang.org/")) +URL: http://dahl.byu.edu/software/rscala/ +Imports: utils, + evaluate +Suggests: + goolgeVis, + htmltools, + knitr, + rCharts, + repr, + SparkR, + base64enc +SystemRequirements: Scala (>= 2.10) +Description: +License: file LICENSE +NeedsCompilation: no +Packaged: 2015-05-15 13:36:01 UTC; dahl +Author: David B. Dahl [aut, cre], + Scala developers [ctb] (see http://scala-lang.org/) +Maintainer: Amos B. Elberg +Repository: +Date/Publication: 2015-12-01 21:50:02 diff --git a/r/R/rzeppelin/LICENSE b/r/R/rzeppelin/LICENSE new file mode 100644 index 00000000000..0ed96c451f6 --- /dev/null +++ b/r/R/rzeppelin/LICENSE @@ -0,0 +1,14 @@ +Licensed to the Apache Software Foundation (ASF) under one or more +contributor license agreements. See the NOTICE file distributed with +this work for additional information regarding copyright ownership. +The ASF licenses this file to You under the Apache License, Version 2.0 +(the "License"); you may not use this file except in compliance with +the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/r/R/rzeppelin/NAMESPACE b/r/R/rzeppelin/NAMESPACE new file mode 100644 index 00000000000..8afdfe69add --- /dev/null +++ b/r/R/rzeppelin/NAMESPACE @@ -0,0 +1,7 @@ +import(utils) + +export("rzeppelinPackage") +export("progress_zeppelin") +export(.z.put) +export(.z.get) +export(.z.input) \ No newline at end of file diff --git a/r/R/rzeppelin/R/common.R b/r/R/rzeppelin/R/common.R new file mode 100644 index 00000000000..a52e22e2292 --- /dev/null +++ b/r/R/rzeppelin/R/common.R @@ -0,0 +1,14 @@ +strintrplt <- function(snippet,envir=parent.frame()) { + if ( ! is.character(snippet) ) stop("Character vector expected.") + if ( length(snippet) != 1 ) stop("Length of vector must be exactly one.") + m <- regexpr("@\\{([^\\}]+)\\}",snippet) + if ( m != -1 ) { + s1 <- substr(snippet,1,m-1) + s2 <- substr(snippet,m+2,m+attr(m,"match.length")-2) + s3 <- substr(snippet,m+attr(m,"match.length"),nchar(snippet)) + strintrplt(paste(s1,paste(toString(eval(parse(text=s2),envir=envir)),collapse=" ",sep=""),s3,sep=""),envir) + } else snippet +} + + + diff --git a/r/R/rzeppelin/R/globals.R b/r/R/rzeppelin/R/globals.R new file mode 100644 index 00000000000..17b59aadab8 --- /dev/null +++ b/r/R/rzeppelin/R/globals.R @@ -0,0 +1,3 @@ +lEtTeRs <- c(letters,LETTERS) +alphabet <- c(lEtTeRs,0:9) + diff --git a/r/R/rzeppelin/R/protocol.R b/r/R/rzeppelin/R/protocol.R new file mode 100644 index 00000000000..0fe07e2cb67 --- /dev/null +++ b/r/R/rzeppelin/R/protocol.R @@ -0,0 +1,35 @@ +UNSUPPORTED_TYPE <- 0L +INTEGER <- 1L +DOUBLE <- 2L +BOOLEAN <- 3L +STRING <- 4L +DATE <- 5L +DATETIME <- 6L +UNSUPPORTED_STRUCTURE <- 10L +NULLTYPE <- 11L +REFERENCE <- 12L +ATOMIC <- 13L +VECTOR <- 14L +MATRIX <- 15L +LIST <- 16L +DATAFRAME <- 17L +S3CLASS <- 18L +S4CLASS <- 19L +JOBJ <- 20L +EXIT <- 100L +RESET <- 101L +GC <- 102L +DEBUG <- 103L +EVAL <- 104L +SET <- 105L +SET_SINGLE <- 106L +SET_DOUBLE <- 107L +GET <- 108L +GET_REFERENCE <- 109L +DEF <- 110L +INVOKE <- 111L +SCALAP <- 112L +OK <- 1000L +ERROR <- 1001L +UNDEFINED_IDENTIFIER <- 1002L +CURRENT_SUPPORTED_SCALA_VERSION <- "2.10" diff --git a/r/R/rzeppelin/R/rServer.R b/r/R/rzeppelin/R/rServer.R new file mode 100644 index 00000000000..af74d7d5d35 --- /dev/null +++ b/r/R/rzeppelin/R/rServer.R @@ -0,0 +1,214 @@ +rServe <- function(sockets) { + cc(sockets) + workspace <- sockets[['workspace']] + debug <- get("debug",envir=sockets[['env']]) + while ( TRUE ) { + if ( debug ) cat("R DEBUG: Top of the loop waiting for a command.\n") + cmd <- rb(sockets,integer(0)) + if ( cmd == EXIT ) { + if ( debug ) cat("R DEBUG: Got EXIT\n") + return() + } else if ( cmd == DEBUG ) { + if ( debug ) cat("R DEBUG: Got DEBUG\n") + newDebug <- ( rb(sockets,integer(0)) != 0 ) + if ( debug != newDebug ) cat("R DEBUG: Debugging is now ",newDebug,"\n",sep="") + debug <- newDebug + assign("debug",debug,envir=sockets[['env']]) + } else if ( cmd == EVAL ) { + if ( debug ) cat("R DEBUG: Got EVAL\n") + snippet <- rc(sockets) + output <- capture.output(result <- try(eval(parse(text=snippet),envir=workspace))) + if ( inherits(result,"try-error") ) { + wb(sockets,ERROR) + msg <- paste(c(output,attr(result,"condition")$message),collapse="\n") + wc(sockets,msg) + } else { + wb(sockets,OK) + output <- paste(output,collapse="\n") + wc(sockets,output) + } + assign(".rzeppelin.last.value",result,envir=workspace) + } else if ( cmd %in% c(SET,SET_SINGLE,SET_DOUBLE) ) { + if ( debug ) cat("R DEBUG: Got SET\n") + if ( cmd != SET ) index <- rc(sockets) + identifier <- rc(sockets) + dataStructure <- rb(sockets,integer(0)) + if ( dataStructure == NULLTYPE ) { + if ( cmd == SET ) assign(identifier,NULL,envir=workspace) + else subassign(sockets,identifier,index,NULL,cmd==SET_SINGLE) + } else if ( dataStructure == ATOMIC ) { + dataType <- rb(sockets,integer(0)) + if ( dataType == INTEGER ) value <- rb(sockets,integer(0)) + else if ( dataType == DOUBLE ) value <- rb(sockets,double(0)) + else if ( dataType == BOOLEAN ) value <- rb(sockets,integer(0)) != 0 + else if ( dataType == STRING ) value <- rc(sockets) +# else if (dataType == DATE) value <- as.Date(rb(sockets,integer(0)), origin=as.Date("1970-01-01")) + else stop(paste("Unknown data type:",dataType)) + if ( cmd == SET ) assign(identifier,value,envir=workspace) + else subassign(sockets,identifier,index,value,cmd==SET_SINGLE) + } else if ( dataStructure == VECTOR ) { + dataLength <- rb(sockets,integer(0)) + dataType <- rb(sockets,integer(0)) + if ( dataType == INTEGER ) value <- rb(sockets,integer(0),n=dataLength) + else if ( dataType == DOUBLE ) value <- rb(sockets,double(0),n=dataLength) + else if ( dataType == BOOLEAN ) value <- rb(sockets,integer(0),n=dataLength) != 0 + else if ( dataType == STRING ) value <- sapply(1:dataLength,function(i) rc(sockets)) +# else if ( dateType == DATE ) value <- as.Date(rb(sockets,integer(0), n = dataLength), origin=as.Date("1970-01-01")) + else stop(paste("Unknown data type:",dataType)) + if ( cmd == SET ) assign(identifier,value,envir=workspace) + else subassign(sockets,identifier,index,value,cmd==SET_SINGLE) + } else if ( dataStructure == MATRIX ) { + dataNRow <- rb(sockets,integer(0)) + dataNCol <- rb(sockets,integer(0)) + dataLength <- dataNRow * dataNCol + dataType <- rb(sockets,integer(0)) + if ( dataType == INTEGER ) value <- matrix(rb(sockets,integer(0),n=dataLength),nrow=dataNRow,byrow=TRUE) + else if ( dataType == DOUBLE ) value <- matrix(rb(sockets,double(0),n=dataLength),nrow=dataNRow,byrow=TRUE) + else if ( dataType == BOOLEAN ) value <- matrix(rb(sockets,integer(0),n=dataLength),nrow=dataNRow,byrow=TRUE) != 0 + else if ( dataType == STRING ) value <- matrix(sapply(1:dataLength,function(i) rc(sockets)),nrow=dataNRow,byrow=TRUE) +# else if ( dateType == DATE) value <- matrix(as.Date(rb(sockets,integer(0),n=dataLength), + # origin = as.Date("1970-01-01")),nrow=dataNRow,byrow=TRUE) + else stop(paste("Unknown data type:",dataType)) + if ( cmd == SET ) assign(identifier,value,envir=workspace) + else subassign(sockets,identifier,index,value,cmd==SET_SINGLE) + } else if ( dataStructure == REFERENCE ) { + otherIdentifier <- rc(sockets) + if ( exists(otherIdentifier,envir=workspace$.) ) { + wb(sockets,OK) + value <- get(otherIdentifier,envir=workspace$.) + if ( cmd == SET ) assign(identifier,value,envir=workspace) + else subassign(sockets,identifier,index,value,cmd==SET_SINGLE) + } else { + wb(sockets,UNDEFINED_IDENTIFIER) + } + } else stop(paste("Unknown data structure:",dataStructure)) + } else if ( cmd == GET ) { + if ( debug ) cat("R DEBUG: Got GET\n") + identifier <- rc(sockets) + value <- tryCatch(get(identifier,envir=workspace),error=function(e) e) + if ( is.null(value) ) { + wb(sockets,NULLTYPE) + } else if ( inherits(value,"error") ) { + wb(sockets,UNDEFINED_IDENTIFIER) + } else if ( ! is.atomic(value) ) { + # This is where code for lists, data.frames, S3, and S4 classes must go + wb(sockets,UNSUPPORTED_STRUCTURE) + } else if ( is.vector(value) ) { + type <- checkType(value) + if ( ( length(value) == 1 ) && ( ! get("length.one.as.vector",envir=sockets[['env']]) ) ) { + wb(sockets,ATOMIC) + } else { + wb(sockets,VECTOR) + wb(sockets,length(value)) + } + wb(sockets,type) + if ( type == STRING ) { + if ( length(value) > 0 ) for ( i in 1:length(value) ) wc(sockets,value[i]) + } else { + if ( type == BOOLEAN ) wb(sockets,as.integer(value)) +# else if (type == DATE) wb(sockets,as.integer(value)) + else wb(sockets,value) + } + } else if ( is.matrix(value) ) { + type <- checkType(value) + wb(sockets,MATRIX) + wb(sockets,dim(value)) + wb(sockets,type) + if ( nrow(value) > 0 ) for ( i in 1:nrow(value) ) { + if ( type == STRING ) { + if ( ncol(value) > 0 ) for ( j in 1:ncol(value) ) wc(sockets,value[i,j]) + } + else if ( type == BOOLEAN ) wb(sockets,as.integer(value[i,])) +# else if (type == DATE) wb(sockets, as.integer(value[i,])) + else wb(sockets,value[i,]) + } + } else { + wb(sockets,UNSUPPORTED_STRUCTURE) + } + } else if ( cmd == GET_REFERENCE ) { + if ( debug ) cat("R DEBUG: Got GET_REFERENCE\n") + identifier <- rc(sockets) + value <- tryCatch(get(identifier,envir=workspace),error=function(e) e) + if ( inherits(value,"error") ) { + wb(sockets,UNDEFINED_IDENTIFIER) + } else { + wb(sockets,REFERENCE) + wc(sockets,new.reference(value,workspace$.)) + } + } else if ( cmd == GC ) { + if ( debug ) cat("R DEBUG: Got GC\n") + workspace$. <- new.env(parent=workspace) + } else stop(paste("Unknown command:",cmd)) + flush(sockets[['socketIn']]) + } +} + +subassign <- function(sockets,x,i,value,single=TRUE) { + workspace <- sockets[['workspace']] + assign(".rzeppelin.set.value",value,envir=workspace) + brackets <- if ( single ) c("[","]") else c("[[","]]") + output <- capture.output(result <- try(eval(parse(text=paste0(x,brackets[1],i,brackets[2]," <- .rzeppelin.set.value")),envir=workspace))) + if ( inherits(result,"try-error") ) { + wb(sockets,ERROR) + output <- paste(paste(output,collapse="\n"),paste(attr(result,"condition")$message,collapse="\n"),sep="\n") + wc(sockets,output) + } else { + wb(sockets,OK) + } + rm(".reppelin.set.value",envir=workspace) + invisible(value) +} + +new.reference <- function(value,envir) { + name <- "" + while ( ( name == "" ) || ( exists(name,envir=envir) ) ) { + name <- paste0(sample(lEtTeRs,1),paste0(sample(alphabet,7,replace=TRUE),collapse="")) + } + assign(name,value,envir=envir) + name +} + +newSockets <- function (portsFilename, debug, timeout) +{ + getPortNumbers <- function() { + delay <- 0.1 + start <- proc.time()[3] + while (TRUE) { + if ((proc.time()[3] - start) > timeout) + stop("Timed out waiting for Scala to start.") + Sys.sleep(delay) + delay <- 1 * delay + if (file.exists(portsFilename)) { + line <- scan(portsFilename, n = 2, what = character(0), + quiet = TRUE) + if (length(line) > 0) + return(as.numeric(line)) + } + } + } + ports <- getPortNumbers() + file.remove(portsFilename) + if (debug) + cat("R DEBUG: Trying to connect to port:", paste(ports, + collapse = ","), "\n") + socketConnectionIn <- socketConnection(port = ports[1], blocking = TRUE, + open = "ab", timeout = 2678400) + socketConnectionOut <- socketConnection(port = ports[2], + blocking = TRUE, open = "rb", timeout = 2678400) + functionCache <- new.env() + env <- new.env() + assign("open", TRUE, envir = env) + assign("debug", debug, envir = env) + assign("length.one.as.vector", FALSE, envir = env) + workspace <- new.env() + workspace$. <- new.env(parent = workspace) + result <- list(socketIn = socketConnectionIn, socketOut = socketConnectionOut, + env = env, workspace = workspace, functionCache = functionCache) + class(result) <- "ScalaInterpreter" + status <- rb(result, integer(0)) + if ((length(status) == 0) || (status != OK)) + stop("Error instantiating interpreter.") + wc(result, toString(packageVersion("rzeppelin"))) + flush(result[["socketIn"]]) + result +} diff --git a/r/R/rzeppelin/R/rzeppelin.R b/r/R/rzeppelin/R/rzeppelin.R new file mode 100644 index 00000000000..c033efbe321 --- /dev/null +++ b/r/R/rzeppelin/R/rzeppelin.R @@ -0,0 +1,95 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +.zeppenv <- new.env() + +.z.ohandler = evaluate:::new_output_handler( + value = function(x) { + if (is.data.frame(x)) return(x) + if ("html" %in% class(x)) return(x) + if (require("htmltools") & require("knitr")) { + if ("htmlwidget" %in% class(x)) { + return(.z.show.htmlwidget(x)) + } + } + if (isS4(x)) show(x) + else { + if (require("repr")) { + return(repr:::repr(x)) + } else return(x) + } + } +) + +# wrapper for evaluate +.z.valuate <- function(input) evaluate:::evaluate( + input = input, + envir =.zeppenv, + debug = FALSE, + output_handler =.z.ohandler, + stop_on_error = 0 +) + +# converts data.tables to the format needed for display in zeppelin + +.z.table <- function(i) { + + .zdfoutcon <- textConnection(".zdfout", open="w") + write.table(i, + col.names=TRUE, row.names=FALSE, sep="\t", + eol="\n", quote = FALSE, file = .zdfoutcon) + close(.zdfoutcon) + rm(.zdfoutcon) + .zdfout +} + +.z.completion <- function(buf, cursor) { + utils:::.assignLinebuffer(buf) + utils:::.assignEnd(cursor) + utils:::.guessTokenFromLine() + utils:::.completeToken() + utils:::.retrieveCompletions() +} + +.z.setProgress <- function(progress) SparkR:::callJMethod(.rContext, "setProgress", progress %% 100) +.z.incrementProgress <- function(increment = 1) SparkR:::callJMethod(.rContext, "incrementProgress", increment) + +.z.input <- function(name) SparkR:::callJMethod(.zeppelinContext, "input", name) + +.z.get <- function(name) { + isRDD <- SparkR:::callJStatic("org.apache.zeppelin.rinterpreter.RStatics", "testRDD", name) + obj <- SparkR:::callJStatic("org.apache.zeppelin.rinterpreter.RStatics", "getZ", name) + if (isRDD) SparkR:::RDD(obj) + else obj + } + +.z.put <- function(name, object) { + if ("RDD" %in% class(object)) object <- SparkR:::getJRDD(object) + SparkR:::callJStatic("org.apache.zeppelin.rinterpreter.RStatics", "putZ", name, object) + } + +.z.repr <- function(x) { + if (require(repr)) repr:::repr(x) + else toString(x) + } + +progress_zeppelin <- function(...) { + list(init = function(x) .z.setProgress(0), + step = function() .z.incrementProgress, + term = function() {}) + } + diff --git a/r/R/rzeppelin/R/scalaInterpreter.R b/r/R/rzeppelin/R/scalaInterpreter.R new file mode 100644 index 00000000000..c7b236f2e1f --- /dev/null +++ b/r/R/rzeppelin/R/scalaInterpreter.R @@ -0,0 +1,123 @@ +rzeppelinPackage <- function(pkgname) { + environmentOfDependingPackage <- parent.env(parent.frame()) + E <- new.env(parent=environmentOfDependingPackage) + E$initialized <- FALSE + E$pkgname <- pkgname + assign("E",E,envir=environmentOfDependingPackage) + invisible() +} + + + +# Private + +checkType <- function(x) { + if ( is.integer(x) ) INTEGER + else if ( is.double(x) ) DOUBLE + else if ( is.logical(x) ) BOOLEAN + else if ( is.character(x) ) STRING + else if ( is.date(x)) DATE + else stop("Unsupported data type.") +} + +checkType2 <- function(x) { + if ( is.integer(x) ) "Int" + else if ( is.double(x) ) "Double" + else if ( is.logical(x) ) "Boolean" + else if ( is.character(x) ) "String" + else if ( is.date(x) ) "Date" + else stop("Unsupported data type.") +} + +convert <- function(x,t) { + if ( t == "Int" ) { + tt <- "atomic" + tm <- "integer" + loav <- FALSE + } else if ( t == "Double" ) { + tt <- "atomic" + tm <- "double" + loav <- FALSE + } else if ( t == "Boolean" ) { + tt <- "atomic" + tm <- "logical" + loav <- FALSE + } else if ( t == "String" ) { + tt <- "atomic" + tm <- "character" + loav <- FALSE + } else if ( t == "Array[Int]" ) { + tt <- "vector" + tm <- "integer" + loav <- TRUE + } else if ( t == "Array[Double]" ) { + tt <- "vector" + tm <- "double" + loav <- TRUE + } else if ( t == "Array[Boolean]" ) { + tt <- "vector" + tm <- "logical" + loav <- TRUE + } else if ( t == "Array[String]" ) { + tt <- "vector" + tm <- "character" + loav <- TRUE + } else if ( t == "Array[Array[Int]]" ) { + tt <- "matrix" + tm <- "integer" + loav <- TRUE + } else if ( t == "Array[Array[Double]]" ) { + tt <- "matrix" + tm <- "double" + loav <- TRUE + } else if ( t == "Array[Array[Boolean]]" ) { + tt <- "matrix" + tm <- "logical" + loav <- TRUE + } else if ( t == "Array[Array[String]]" ) { + tt <- "matrix" + tm <- "character" + loav <- TRUE + } else { + tt <- "reference" + tm <- "reference" + loav <- FALSE + } + v <- character(0) + if ( tt == "atomic" ) v <- c(v,sprintf("%s <- as.vector(%s)[1]",x,x)) + else if ( tt == "vector" ) v <- c(v,sprintf("%s <- as.vector(%s)",x,x)) + else if ( tt == "matrix" ) v <- c(v,sprintf("%s <- as.matrix(%s)",x,x)) + if ( tm != "reference" ) v <- c(v,sprintf("storage.mode(%s) <- '%s'",x,tm)) + if ( length(v) != 0 ) { + v <- c(sprintf("if ( ! inherits(%s,'ScalaInterpreterReference') ) {",x),paste(" ",v,sep=""),"}") + } + c(v,sprintf("intpSet(interpreter,'.',%s,length.one.as.vector=%s,quiet=TRUE)",x,loav)) +} + +cc <- function(c) { + if ( ! get("open",envir=c[['env']]) ) stop("The connection has already been closed.") +} + +wb <- function(c,v) writeBin(v,c[['socketIn']],endian="big") + +wc <- function(c,v) { + bytes <- charToRaw(v) + wb(c,length(bytes)) + writeBin(bytes,c[['socketIn']],endian="big",useBytes=TRUE) +} + +# Sockets should be blocking, but that contract is not fulfilled when other code uses functions from the parallel library. Program around their problem. +rb <- function(c,v,n=1L) { + r <- readBin(c[['socketOut']],what=v,n=n,endian="big") + if ( length(r) == n ) r + else c(r,rb(c,v,n-length(r))) +} + +# Sockets should be blocking, but that contract is not fulfilled when other code uses functions from the parallel library. Program around their problem. +rc <- function(c) { + length <- rb(c,integer(0)) + r <- as.raw(c()) + while ( length(r) != length ) r <- c(r,readBin(c[['socketOut']],what="raw",n=length,endian="big")) + rawToChar(r) +} + diff --git a/r/R/rzeppelin/R/zzz.R b/r/R/rzeppelin/R/zzz.R new file mode 100644 index 00000000000..d901b99c492 --- /dev/null +++ b/r/R/rzeppelin/R/zzz.R @@ -0,0 +1,9 @@ +typeMap <- list() +typeMap[[INTEGER]] <- integer(0) +typeMap[[DOUBLE]] <- double(0) +typeMap[[BOOLEAN]] <- integer(0) +typeMap[[STRING]] <- character(0) + +.onAttach <- function(libname, pkgname) { + +} diff --git a/r/_tools/checkstyle.xml b/r/_tools/checkstyle.xml new file mode 100644 index 00000000000..618d74d14e2 --- /dev/null +++ b/r/_tools/checkstyle.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/r/_tools/scalastyle.xml b/r/_tools/scalastyle.xml new file mode 100644 index 00000000000..f7bb0d4819c --- /dev/null +++ b/r/_tools/scalastyle.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + Scalastyle standard configuration + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/r/pom.xml b/r/pom.xml new file mode 100644 index 00000000000..911db101558 --- /dev/null +++ b/r/pom.xml @@ -0,0 +1,396 @@ + + + + 4.0.0 + + + zeppelin + org.apache.zeppelin + 0.6.0-incubating-SNAPSHOT + .. + + + zeppelin-zrinterpreter + jar + Zeppelin: R Interpreter + R Interpreter for Zeppelin + + + .sh + / + 1.4.1 + 2.10.4 + 2.10 + + + + + amos + Amos Elberg + + + + + + + org.slf4j + slf4j-api + provided + + + org.slf4j + slf4j-log4j12 + provided + + + log4j + log4j + provided + + + ${project.groupId} + zeppelin-spark-dependencies + ${project.version} + provided + + + ${project.groupId} + zeppelin-interpreter + ${project.version} + provided + + + ${project.groupId} + zeppelin-spark + ${project.version} + provided + + + org.apache.spark + spark-core_${scala.binary.version} + ${spark.version} + provided + + + + org.apache.spark + spark-repl_${scala.binary.version} + ${spark.version} + provided + + + + org.apache.spark + spark-sql_${scala.binary.version} + ${spark.version} + provided + + + + org.apache.spark + spark-hive_${scala.binary.version} + ${spark.version} + provided + + + + org.apache.spark + spark-catalyst_${scala.binary.version} + ${spark.version} + provided + + + + org.scala-lang + scala-library + ${scala.version} + provided + + + org.scalatest + scalatest_${scala.binary.version} + 2.2.4 + test + + + org.scalacheck + scalacheck_${scala.binary.version} + 1.12.5 + test + + + commons-codec + commons-codec + compile + + + + org.jsoup + jsoup + [1.8.0,) + compile + + + org.apache.spark + spark-core_${scala.binary.version} + ${spark.version} + provided + + + org.datanucleus + datanucleus-core + test + 3.2.10 + + + org.datanucleus + datanucleus-api-jdo + 3.2.6 + test + + + org.datanucleus + datanucleus-rdbms + 3.2.9 + test + + + + + + + org.apache.rat + apache-rat-plugin + + + lib/** + **/r/lib/** + + **/R/rzeppelin/R/globals.R + **/R/rzeppelin/R/common.R + **/R/rzeppelin/R/protocol.R + **/R/rzeppelin/R/rServer.R + **/R/rzeppelin/R/scalaInterpreter.R + **/R/rzeppelin/R/zzz.R + **/scala/Console.scala + **/zeppelin/rinterpreter/rscala/Package.scala + **/zeppelin/rinterpreter/rscala/RClient.scala + + **/.idea/ + + **/R/rzeppelin/DESCRIPTION + **/R/rzeppelin/NAMESPACE + + **/*.iml + .gitignore + **/.settings/* + **/.classpath + **/.project + **/target/** + **/derby.log + **/metastore_db/ + **/README.md + **/dependency-reduced-pom.xml + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + true + + + + + maven-enforcer-plugin + 1.3.1 + + + enforce + none + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + 1 + false + -Xmx1024m -XX:MaxPermSize=256m + true + + + + org.scalatest + scalatest-maven-plugin + 1.0 + + ${project.build.directory}/surefire-reports + . + testoutput.txt + false + once + + true + + + + + test + + test + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + + *:* + + org/datanucleus/** + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + reference.conf + + + + + + package + + shade + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.8 + + + package + + copy + + + ${project.build.directory}/../../interpreter/spark + false + false + true + + + ${project.groupId} + ${project.artifactId} + ${project.version} + ${project.packaging} + + + + + + + + + + org.scala-tools + maven-scala-plugin + + + compile + + compile + + compile + + + test-compile + + testCompile + + test-compile + + + process-resources + + compile + + + + + + org.codehaus.mojo + exec-maven-plugin + + + compile + + exec + + + + + R${path.separator}install-dev${script.extension} + + + + maven-clean-plugin + 2.6.1 + + + + ${project.build.directory}/../../R + + **/lib/** + + + + ${project.build.directory}/../../interpreter/spark + + **/zeppelin-zr*.jar + + + + + + + + diff --git a/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java b/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java new file mode 100644 index 00000000000..63c60e24839 --- /dev/null +++ b/r/src/main/java/org/apache/zeppelin/rinterpreter/KnitR.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter; + +import org.apache.zeppelin.interpreter.*; +import org.apache.zeppelin.scheduler.Scheduler; + +import java.net.URL; +import java.util.List; +import java.util.Properties; + +/** + * KnitR is a simple wrapper around KnitRInterpreter to handle that Zeppelin prefers + * to load interpreters through classes defined in Java with static methods that run + * when the class is loaded. + * + */ +public class KnitR extends Interpreter implements WrappedInterpreter { + KnitRInterpreter intp; + + static { + Interpreter.register("knitr", "spark", KnitR.class.getName(), + RInterpreter.getProps() + ); + } + + public KnitR(Properties property, Boolean startSpark) { + super(property); + intp = new KnitRInterpreter(property, startSpark); + } + public KnitR(Properties property) { + this(property, true); + } + + public KnitR() { + this(new Properties()); + } + + @Override + public void open() { + intp.open(); + } + + @Override + public void close() { + intp.close(); + } + + @Override + public InterpreterResult interpret(String s, InterpreterContext interpreterContext) { + return intp.interpret(s, interpreterContext); + } + + @Override + public void cancel(InterpreterContext interpreterContext) { + intp.cancel(interpreterContext); + } + + @Override + public FormType getFormType() { + return intp.getFormType(); + } + + @Override + public int getProgress(InterpreterContext interpreterContext) { + return intp.getProgress(interpreterContext); + } + + @Override + public List completion(String s, int i) { + return intp.completion(s, i); + } + + @Override + public Interpreter getInnerInterpreter() { + return intp; + } + + @Override + public Scheduler getScheduler() { + return intp.getScheduler(); + } + + @Override + public void setProperty(Properties property) { + super.setProperty(property); + intp.setProperty(property); + } + + @Override + public Properties getProperty() { + return intp.getProperty(); + } + + @Override + public String getProperty(String key) { + return intp.getProperty(key); + } + + @Override + public void setInterpreterGroup(InterpreterGroup interpreterGroup) { + super.setInterpreterGroup(interpreterGroup); + intp.setInterpreterGroup(interpreterGroup); + } + + @Override + public InterpreterGroup getInterpreterGroup() { + return intp.getInterpreterGroup(); + } + + @Override + public void setClassloaderUrls(URL[] classloaderUrls) { + intp.setClassloaderUrls(classloaderUrls); + } + + @Override + public URL[] getClassloaderUrls() { + return intp.getClassloaderUrls(); + } +} diff --git a/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java b/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java new file mode 100644 index 00000000000..55f72199c2e --- /dev/null +++ b/r/src/main/java/org/apache/zeppelin/rinterpreter/RRepl.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter; + +import org.apache.zeppelin.interpreter.*; +import org.apache.zeppelin.scheduler.Scheduler; + +import java.net.URL; +import java.util.List; +import java.util.Properties; + +/** + * RRepl is a simple wrapper around RReplInterpreter to handle that Zeppelin prefers + * to load interpreters through classes defined in Java with static methods that run + * when the class is loaded. + * + */ +public class RRepl extends Interpreter implements WrappedInterpreter { + RReplInterpreter intp; + + static { + Interpreter.register("r", "spark", RRepl.class.getName(), + RInterpreter.getProps() + ); + } + + public RRepl(Properties property, Boolean startSpark) { + super(property); + intp = new RReplInterpreter(property, startSpark); + } + public RRepl(Properties property) { + this(property, true); + } + + public RRepl() { + this(new Properties()); + } + + @Override + public void open() { + intp.open(); + } + + @Override + public void close() { + intp.close(); + } + + @Override + public InterpreterResult interpret(String s, InterpreterContext interpreterContext) { + return intp.interpret(s, interpreterContext); + } + + @Override + public void cancel(InterpreterContext interpreterContext) { + intp.cancel(interpreterContext); + } + + @Override + public FormType getFormType() { + return intp.getFormType(); + } + + @Override + public int getProgress(InterpreterContext interpreterContext) { + return intp.getProgress(interpreterContext); + } + + @Override + public List completion(String s, int i) { + return intp.completion(s, i); + } + + @Override + public Interpreter getInnerInterpreter() { + return intp; + } + + @Override + public Scheduler getScheduler() { + return intp.getScheduler(); + } + + @Override + public void setProperty(Properties property) { + super.setProperty(property); + intp.setProperty(property); + } + + @Override + public Properties getProperty() { + return intp.getProperty(); + } + + @Override + public String getProperty(String key) { + return intp.getProperty(key); + } + + @Override + public void setInterpreterGroup(InterpreterGroup interpreterGroup) { + super.setInterpreterGroup(interpreterGroup); + intp.setInterpreterGroup(interpreterGroup); + } + + @Override + public InterpreterGroup getInterpreterGroup() { + return intp.getInterpreterGroup(); + } + + @Override + public void setClassloaderUrls(URL[] classloaderUrls) { + intp.setClassloaderUrls(classloaderUrls); + } + + @Override + public URL[] getClassloaderUrls() { + return intp.getClassloaderUrls(); + } +} diff --git a/r/src/main/java/org/apache/zeppelin/rinterpreter/RStatics.java b/r/src/main/java/org/apache/zeppelin/rinterpreter/RStatics.java new file mode 100644 index 00000000000..361fe47492f --- /dev/null +++ b/r/src/main/java/org/apache/zeppelin/rinterpreter/RStatics.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +The purpose of this class is to provide something for R to call through the backend +to bootstrap. + */ + +package org.apache.zeppelin.rinterpreter; + +import org.apache.spark.SparkContext; +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.sql.SQLContext; +import org.apache.zeppelin.spark.ZeppelinContext; + +/** + * RStatics provides static class methods that can be accessed through the SparkR bridge + * + */ +public class RStatics { + private static SparkContext sc = null; + private static ZeppelinContext z = null; + private static SQLContext sql = null; + private static RContext rCon = null; + + public static SparkContext setSC(SparkContext newSC) { + sc = newSC; + return sc; + } + + public static ZeppelinContext setZ(ZeppelinContext newZ) { + z = newZ; + return z; + } + + public static SQLContext setSQL(SQLContext newSQL) { + sql = newSQL; + return sql; + } + + public static JavaSparkContext getJSC() { + return new JavaSparkContext(sc); + } + + public static SparkContext getSC() { + return sc; + } + + public static SQLContext getSQL() { + return sql; + } + + public static Object getZ(String name) { + return z.get(name); + } + + public static void putZ(String name, Object obj) { + z.put(name, obj); + } + + public static RContext getRCon() { + return rCon; + } + public static RContext setrCon(RContext newrCon) { + rCon = newrCon; + return rCon; + } + public static Boolean testRDD(String name) { + Object x = z.get(name); + return (x instanceof org.apache.spark.api.java.JavaRDD); + } +} diff --git a/r/src/main/scala/org/apache/spark/api/r/RBackendHelper.scala b/r/src/main/scala/org/apache/spark/api/r/RBackendHelper.scala new file mode 100644 index 00000000000..9c1eb38d587 --- /dev/null +++ b/r/src/main/scala/org/apache/spark/api/r/RBackendHelper.scala @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* +With grattitude to Shivaram for advice regarding how to get SparkR talking to an existing SparkContext in Java + */ +package org.apache.spark.api.r + +class RBackendHelper(val backend : RBackend) { + + + + def close() : Unit = backend.close() + + + var port : Int = 0 + + def init() : Int = { + port = backend.init() + port + } + + val backendThread : Thread = new Thread("SparkR backend") { + override def run() { + backend.run() + } + } + + def start() : Thread = { + if (port == 0) throw new RuntimeException("BackendHelper must be initialized before starting") + if (!backendThread.isAlive) backendThread.start() + backendThread + } + + +/* +The sequence is: +1. Before initializing spark in R, after loading library, Backend goes up and starts listening. (Note that its able to execute arbitrary methods!!! We can use it for +zeppelin context!!!) +2. Tell SparkR to make a connection to the backend, setting the EXISTING port to the one in backendhelper. +3. Track sparkR.init, but where it calls spark/R/pkg/R/sparkR.R calls org.apache.spark.api.r.RRDD.createSparkContext to get sc, +which is then returned as a jobj link, instead call RBackendHelper.getSC + 3a Actually the object returned right now is of type JavaSparkContext ????? Need to understand this +4. SparkR for the other contexts calls related methods, org.apache.spark.sql.api.r.SQLUtils.createSQLContext and +org.apache.spark.sql.hive.HiveContext is just made new, with the jobj reference assigned to an object. We should track +the same pattern as above. + + + */ +} + + +object RBackendHelper { + +/* +This function creates a new SparkContext, but does not register it, based on whatever properties are provided. +Its for testing purposes and should never be called + */ +// def buildSparkContext( props : Properties) : SparkContext = { +// val traversableProps : Traversable[(String, String)] = propertiesAsScalaMap(props) +// val conf = new SparkConf().setAll(traversableProps) +// conf.setIfMissing("spark.master", "local") +// conf.setIfMissing("spark.app.name", "ZeppelinRContext") +// conf.validateSettings() +// new SparkContext(conf) +// } + + def apply() : RBackendHelper = new RBackendHelper(new RBackend()) + +} \ No newline at end of file diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/KnitRInterpreter.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/KnitRInterpreter.scala new file mode 100644 index 00000000000..bc779c7a4f1 --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/KnitRInterpreter.scala @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter + + +// TODO: Capture the knitr progress bar + +import java.util._ + +import org.apache.zeppelin.interpreter.InterpreterContext +import org.apache.zeppelin.interpreter.InterpreterResult +import org.apache.zeppelin.rinterpreter.rscala.RException + + +class KnitRInterpreter(property: Properties, startSpark : Boolean = true) extends RInterpreter(property, startSpark) { + def this(property : Properties) = { + this(property, true) + } + + override def open: Unit = { + logger.trace("Opening knitr") + rContext.synchronized { + super.open + logger.debug("Knitr open, initial commands") + rContext.testRPackage("knitr", true, true, "Without knitr, the knitr interpreter cannot run.") + rContext.eval( + """opts_knit$set(out.format = 'html', + |results='asis', + |progress = FALSE, + |self.contained = TRUE, + |verbose = FALSE, + |comment = NA, + |echo = FALSE, + |tidy = FALSE) + | """.stripMargin) + } + logger.info("KnitR: Finished initial commands") + } + + def interpret(st: String, context: InterpreterContext): InterpreterResult = try { + logger.trace("interpreting" + st) + // need to convert st into an array of Strings within R + val commandSt : Array[String] = st.split("\n") + val chunkOptions = commandSt.head + val chunkLine : String = s"```{r $chunkOptions}" + val chunk : Array[String] = Array(chunkLine) ++: commandSt.tail ++: Array("```") + val out: String = rContext.synchronized { + rContext.set(".zeppknitrinput", chunk) + rContext.eval(".knitout <- knit2html(text=.zeppknitrinput, envir = rzeppelin:::.zeppenv)") + rContext.getS0(".knitout") + } + + new InterpreterResult(InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.HTML, + RInterpreter.processHTML(out) + ) + } catch { + case r: RException => r.getInterpreterResult(st) + case e: Exception => new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage()) + } +} + diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/RContext.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/RContext.scala new file mode 100644 index 00000000000..ffab1608d2b --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/RContext.scala @@ -0,0 +1,321 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter + +import java.io._ +import java.nio.file.{Files, Paths} +import java.util.Properties + +import org.apache.spark.SparkContext +import org.apache.spark.api.r.RBackendHelper +import org.apache.spark.sql.SQLContext +import org.apache.zeppelin.interpreter._ +import org.apache.zeppelin.rinterpreter.rscala.RClient._ +import org.apache.zeppelin.rinterpreter.rscala._ +import org.apache.zeppelin.scheduler._ +import org.apache.zeppelin.spark.{SparkInterpreter, ZeppelinContext} +import org.slf4j._ + +import scala.collection.JavaConversions._ + +// TODO: Setup rmr, etc. +// TODO: Stress-test spark. What happens on close? Etc. + +private[rinterpreter] class RContext(private val sockets: ScalaSockets, + debug: Boolean) extends RClient(sockets.in, sockets.out, debug) { + + private val logger: Logger = RContext.logger + lazy val getScheduler: Scheduler = SchedulerFactory.singleton().createOrGetFIFOScheduler(this.hashCode().toString) + + val backend: RBackendHelper = RBackendHelper() + private var sc: Option[SparkContext] = None + private var sql: Option[SQLContext] = None + private var z: Option[ZeppelinContext] = None + + val rPkgMatrix = collection.mutable.HashMap[String,Boolean]() + + var isOpen: Boolean = false + private var isFresh : Boolean = true + + private var property: Properties = null + private[rinterpreter] var sparkRStarted : Boolean = false + + override def toString() : String = s"""${super.toString()} + |\t Open: $isOpen Fresh: $isFresh SparkStarted: $sparkRStarted + |\t Progress: $progress + |\t Sockets: ${sockets.toString()} + """.stripMargin + + var progress: Int = 0 + + def getProgress: Int = { + return progress + } + + def setProgress(i: Int) : Unit = { + progress = i % 100 + } + + def incrementProgress(i: Int) : Unit = { + progress = (progress + i) % 100 + } + + // handle properties this way so it can be a mutable object shared with the R Interpreters + def setProperty(properties: Properties): Unit = synchronized { + if (property == null) property = properties + else property.putAll(properties) + } + + def open(startSpark : Option[SparkInterpreter]): Unit = synchronized { + if (isOpen && sparkRStarted) { + logger.trace("Reusing rContext.") + return + } + testRPackage("rzeppelin", fail = true, message = + "The rinterpreter cannot run without the rzeppelin package, which was included in your distribution.") + startSpark match { + case Some(x : SparkInterpreter) => { + sparkStartup(x) + } + case _ => logger.error("Could not find a SparkInterpreter") + } + isOpen = true + } + private def sparkStartup(startSpark : SparkInterpreter): Unit = try { + val sparkHome: String = System.getenv("SPARK_HOME") match { + case null => { + logger.error("SPARK_HOME is not set. The R Interpreter will start without Spark.") + return + } + case y => y + } + testRPackage("SparkR", fail = true, path = sparkHome) + if (startSpark.getSparkVersion() == null) throw new RuntimeException("No spark version") + if (!startSpark.getSparkVersion().isSparkRSupported) throw new RuntimeException("SparkR requires Spark 1.4 or later") + sc = Some(startSpark.getSparkContext()) + sql = Some(startSpark.getSQLContext()) + z = Some(startSpark.getZeppelinContext()) + logger.trace("Registered Spark Contexts") + backend.init() + backend.start() + if (!backend.backendThread.isAlive) throw new RuntimeException("SparkR could not startup because the Backend Thread is not alive") + logger.trace("Started Spark Backend") + eval( s"""SparkR:::connectBackend("localhost", ${backend.port})""") + logger.trace("SparkR backend connected") + initializeSparkR(sc.get, sql.get, z.get) + logger.info("Initialized SparkR") + sparkRStarted = true + } catch { + case e: Exception => throw new RuntimeException(""" + Could not connect R to Spark. If the stack trace is not clear, + check whether SPARK_HOME is set properly.""", e) + } + + private def initializeSparkR(sc : SparkContext, sql : SQLContext, z : ZeppelinContext) : Unit = synchronized { + + logger.trace("Getting a handle to the JavaSparkContext") + + eval("assign(\".scStartTime\", as.integer(Sys.time()), envir = SparkR:::.sparkREnv)") + RStatics.setSC(sc) + eval( + """ + |assign( + |".sparkRjsc", + |SparkR:::callJStatic("org.apache.zeppelin.rinterpreter.RStatics", + | "getJSC"), + | envir = SparkR:::.sparkREnv)""".stripMargin) + + eval("assign(\"sc\", get(\".sparkRjsc\", envir = SparkR:::.sparkREnv), envir=.GlobalEnv)") + + logger.trace("Established SparkR Context") + + val sqlEnvName = sql match { + case null => throw new RuntimeException("Tried to initialize SparkR without setting a SQLContext") + case x : org.apache.spark.sql.hive.HiveContext => ".sparkRHivesc" + case x : SQLContext => ".sparkRSQLsc" + } + RStatics.setSQL(sql) + eval( + s""" + |assign( + |"${sqlEnvName}", + |SparkR:::callJStatic("org.apache.zeppelin.rinterpreter.RStatics", + | "getSQL"), + | envir = SparkR:::.sparkREnv)""".stripMargin) + eval( + s""" + |assign("sqlContext", + |get("$sqlEnvName", + |envir = SparkR:::.sparkREnv), + |envir = .GlobalEnv) + """.stripMargin) + + logger.trace("Proving spark") + val proof = evalS1("names(SparkR:::.sparkREnv)") + logger.info("Proof of spark is : " + proof.mkString) + + RStatics.setZ(z) + + RStatics.setrCon(this) + eval( + s""" + |assign(".rContext", + | SparkR:::callJStatic("org.apache.zeppelin.rinterpreter.RStatics", + | "getRCon"), + | envir = .GlobalEnv) + """.stripMargin + ) + } + + def close(): Unit = synchronized { + if (isOpen) { + if (sparkRStarted) { + try { + eval("SparkR:::sparkR.stop()") + } catch { + case e: RException => {} + case e: Exception => logger.error("Error closing SparkR", e) + } + } + try { + backend.close + backend.backendThread.stop() + } catch { + case e: Exception => logger.error("Error closing RContext ", e) + } + try { + exit() + } catch { + case e: Exception => logger.error("Shutdown error", e) + } + } + isOpen = false + } + + + private[rinterpreter] def testRPackage(pack: String, + fail: Boolean = false, + license: Boolean = false, + message: String = "", + path : String = ""): Boolean = synchronized { + + + rPkgMatrix.get(pack) match { + case Some(x: Boolean) => return x + case None => {} + } + + evalB0( s"""require('$pack',quietly=TRUE, lib.loc="$path/R/lib/")""") match { + case true => { + rPkgMatrix.put(pack, true) + return (true) + } + case false => { + evalB0(s"require('$pack', quietly=TRUE)") match { + case true => { + rPkgMatrix.put(pack, true) + return true + } + case false => { + rPkgMatrix.put(pack, false) + val failMessage = + s"""The $pack package could not be loaded. """ + { + if (license) "We cannot install it for you because it is published under the GPL3 license." + else "" + } + message + logger.error(failMessage) + if (fail) throw new RException(failMessage) + return (false) + } + } + } + } + } + + logger.info("RContext Finished Starting") +} + +object RContext { + val logger: Logger = LoggerFactory.getLogger(getClass) + + logger.trace("Inside the RContext Object") + private val contextMap : collection.mutable.HashMap[String, RContext] = collection.mutable.HashMap[String,RContext]() + + // This function is here to work around inconsistencies in the SparkInterpreter startup sequence + // that caused testing issues + private[rinterpreter] def resetRcon() : Boolean = synchronized { + contextMap foreach((con) => { + con._2.close() + if (con._2.isOpen) throw new RuntimeException("Failed to close an existing RContext") + contextMap.remove(con._1) + }) + return true + } + + def apply( property: Properties, id : String): RContext = synchronized { + contextMap.get(id) match { + case Some(x : RContext) if x.isFresh || x.isOpen => return(x) + case Some(x : RContext) => resetRcon() + case _ => {} + } + val debug: Boolean = property.getProperty("rscala.debug", "false").toBoolean + val timeout: Int = property.getProperty("rscala.timeout", "60").toInt + import scala.sys.process._ + logger.trace("Creating processIO") + var cmd: PrintWriter = null + val command = RClient.defaultRCmd +: RClient.defaultArguments + val processCmd = Process(command) + + val processIO = new ProcessIO( + o => { + cmd = new PrintWriter(o) + }, + reader("STDOUT DEBUG: "), + reader("STDERR DEBUG: "), + true + ) + val portsFile = File.createTempFile("rscala-", "") + val processInstance = processCmd.run(processIO) + // Find rzeppelin + val libpath : String = if (Files.exists(Paths.get("R/lib"))) "R/lib" + else if (Files.exists(Paths.get("../R/lib"))) "../R/lib" + else throw new RuntimeException("Could not find rzeppelin - it must be in either R/lib or ../R/lib") + val snippet = + s""" +library(lib.loc="$libpath", rzeppelin) +rzeppelin:::rServe(rzeppelin:::newSockets('${portsFile.getAbsolutePath.replaceAll(File.separator, "/")}',debug=${if (debug) "TRUE" else "FALSE"},timeout=${timeout})) +q(save='no')""" + while (cmd == null) Thread.sleep(100) + cmd.println(snippet) + cmd.flush() + val sockets = RClient.makeSockets(portsFile.getAbsolutePath) + sockets.out.writeInt(RClient.Protocol.OK) + sockets.out.flush() + val packVersion = RClient.readString(sockets.in) + if (packVersion != org.apache.zeppelin.rinterpreter.rscala.Version) { + logger.warn("Connection to R started but versions don't match " + packVersion + " " + org.apache.zeppelin.rinterpreter.rscala.Version) + } else { + logger.trace("Connected to a new R Session") + } + val context = new RContext(sockets, debug) + context.setProperty(property) + contextMap.put(id, context) + context + } +} + diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/RInterpreter.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/RInterpreter.scala new file mode 100644 index 00000000000..2859f308896 --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/RInterpreter.scala @@ -0,0 +1,167 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter + +import java.nio.file.{Files, Paths} +import java.util._ + +import org.apache.commons.codec.binary.{Base64, StringUtils} +import org.apache.zeppelin.interpreter.Interpreter.FormType +import org.apache.zeppelin.interpreter.remote.RemoteInterpreter +import org.apache.zeppelin.interpreter.{InterpreterContext, _} +import org.apache.zeppelin.scheduler.Scheduler +import org.apache.zeppelin.spark.SparkInterpreter +import org.jsoup.Jsoup +import org.jsoup.nodes._ +import org.jsoup.select.Elements +import org.slf4j.{Logger, LoggerFactory} + +import scala.collection.JavaConversions._ +import scala.io.Source + +abstract class RInterpreter(properties : Properties, startSpark : Boolean = true) extends Interpreter (properties) { + + protected val logger: Logger = RInterpreter.logger + logger.trace("Initialising an RInterpreter of class " + this.getClass.getName) + + def getrContext: RContext = rContext + + protected lazy val rContext : RContext = synchronized{ RContext(property, this.getInterpreterGroup().getId()) } + + def open: Unit = rContext.synchronized { + logger.trace("RInterpreter opening") + // We leave this as an Option[] because the pattern of nesting SparkInterpreter inside of wrapper interpreters + // has changed several times, and this allows us to fail more gracefully and handle those changes in one place. + val intp : Option[SparkInterpreter] = getSparkInterpreter() + rContext.open(intp) + rContext.testRPackage("htmltools", message = + """You can continue + | without it, but some interactive visualizations will fail. + | You can install it from cran."""") + rContext.testRPackage("repr", license = true, message = + """You can continue + | without it, but some forms of output from the REPL may not appear properly."""") + rContext.testRPackage("base64enc", license = true, message = + """You can continue + | without it, but the REPL may not show images properly.""") + rContext.testRPackage("evaluate", license = false, message = + """ + |The REPL needs this to run. It can be installed from CRAN + | Thanks to Hadley Wickham and Yihui Xie for graciously making evaluate available under an Apache-compatible + | license so it can be used with this project.""".stripMargin) + } + + def getSparkInterpreter() : Option[SparkInterpreter] = + getSparkInterpreter(getInterpreterInTheSameSessionByClassName(classOf[SparkInterpreter].getName)) + + def getSparkInterpreter(p1 : Interpreter) : Option[SparkInterpreter] = p1 match { + case s : SparkInterpreter => Some[SparkInterpreter](s) + case lzy : LazyOpenInterpreter => { + val p = lzy.getInnerInterpreter + lzy.open() + return getSparkInterpreter(p) + } + case w : WrappedInterpreter => return getSparkInterpreter(w.getInnerInterpreter) + case _ => None + } + + def close: Unit = { + rContext.close + } + + def getProgress(context :InterpreterContext): Int = rContext.getProgress + + def cancel(context:InterpreterContext) : Unit = {} + + def getFormType: FormType = { + return FormType.NONE + } + + override def getScheduler : Scheduler = rContext.getScheduler + + // TODO: completion is disabled because it could not be tested with current Zeppelin code + def completion(buf :String,cursor : Int) : List[String] = Array[String]("").toList + + private[rinterpreter] def hiddenCompletion(buf :String,cursor : Int) : List[String] = + rContext.evalS1(s""" + |rzeppelin:::.z.completion("$buf", $cursor) + """.stripMargin).toList +} + +object RInterpreter { + + private val logger: Logger = LoggerFactory.getLogger(getClass) + logger.trace("logging inside the RInterpreter singleton") + + // These are the additional properties we need on top of the ones provided by the spark interpreters + lazy val props: Map[String, InterpreterProperty] = new InterpreterPropertyBuilder() + .add("rhadoop.cmd", SparkInterpreter.getSystemDefault("rhadoop.cmd", "HADOOP_CMD", ""), "Usually /usr/bin/hadoop") + .add("rhadooop.streamingjar", SparkInterpreter.getSystemDefault("rhadoop.cmd", "HADOOP_STREAMING", ""), "Usually /usr/lib/hadoop/contrib/streaming/hadoop-streaming-.jar") + .add("rscala.debug", SparkInterpreter.getSystemDefault("rscala.debug","RSCALA_DEBUG", "false"), "Whether to turn on rScala debugging") // TEST: Implemented but not tested + .add("rscala.timeout", SparkInterpreter.getSystemDefault("rscala.timeout","RSCALA_TIMEOUT", "60"), "Timeout for rScala") // TEST: Implemented but not tested + .build + + def getProps() = { + props + } + + // Some R interactive visualization packages insist on producing HTML that refers to javascript + // or css by file path. These functions are intended to load those files and embed them into the + // HTML as Base64 encoded DataURIs. + //FIXME These don't error but may not yet properly be converting script links + def scriptToBase(doc : Element, testAttr : String, tag : String, mime : String): Unit = { + val elems : Elements = doc.getElementsByTag(tag) + elems.filter( (e : Element) => { + e.attributes().hasKey(testAttr) && e.attr(testAttr) != "" && e.attr(testAttr).slice(0,1) == "/" + }).foreach(scriptToBase(_, testAttr, mime)) + } + + def scriptToBase(node : Element, field : String, mime : String) : Unit = node.attr(field) match { + case x if Files.exists(Paths.get(x)) => node.attr(field, dataURI(x, mime)) + case x if x.slice(0,4) == "http" => {} + case x if x.contains("ajax") => {} + case x if x.contains("googleapis") => {} + case x if x.slice(0,2) == "//" => node.attr(field, "http:" + x) + case _ => {} + } + + def dataURI(file : String, mime : String) : String = { + val data: String = Source.fromFile(file).getLines().mkString("\n") + s"""data:${mime};base64,""" + StringUtils.newStringUtf8(Base64.encodeBase64(data.getBytes(), false)) + } + + // The purpose here is to deal with knitr producing HTML with script and css tags outside the + def processHTML(input: Array[String]): String = processHTML(input.mkString("\n")) + + def processHTML(input: String) : String = { + val doc : Document = Jsoup.parse(input) + processHTML(doc) + } + + private def processHTML(doc : Document) : String = { + val bod : Element = doc.body() + val head : Element = doc.head() + // Try to ignore the knitr script that breaks zeppelin display + head.getElementsByTag("script").reverseIterator.foreach(bod.prependChild(_)) + // Only get css from head if it links to a file + head.getElementsByTag("link").foreach(bod.prependChild(_)) + scriptToBase(bod, "href", "link", "text/css") + scriptToBase(bod, "src", "script", "text/javascript") + bod.html() + } +} diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/RReplInterpreter.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/RReplInterpreter.scala new file mode 100644 index 00000000000..63be30240c0 --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/RReplInterpreter.scala @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter + + +// TODO: Option for setting size of output images + +import java.util._ + +import org.apache.zeppelin.interpreter.InterpreterContext +import org.apache.zeppelin.interpreter.InterpreterResult +import org.apache.zeppelin.rinterpreter.rscala.RException + +class RReplInterpreter(property: Properties, startSpark : Boolean = true) extends RInterpreter(property, startSpark) { + + // protected val rContext : RContext = RContext(property) + + def this(property : Properties) = { + this(property, true) + } + private var firstCell : Boolean = true + def interpret(st: String, context: InterpreterContext): InterpreterResult = { + rContext.synchronized { + try { + import scala.collection.immutable._ + logger.info("intrpreting " + st) + rContext.set(".zreplin", st.split("\n")) + rContext.eval(".zreplout <- rzeppelin:::.z.valuate(.zreplin)") + + val reslength: Int = rContext.evalI0("length(.zreplout)") + logger.debug("Length of evaluate result is " + reslength) + var gotError: Boolean = false + val result: String = List.range(1, reslength + 1).map((i: Int) => { + rContext.evalS1(s"class(.zreplout[[${i}]])") match { + case x: Array[String] if x contains ("recordedplot") => { + if (!rContext.testRPackage("repr", fail = false)) return new InterpreterResult(InterpreterResult.Code.ERROR, + InterpreterResult.Type.TEXT, + "Displaying images through the R REPL requires the repr package, which is not installed.") + val image: String = rContext.evalS0(s"base64enc:::base64encode(repr:::repr_jpg(.zreplout[[${i}]]))") + return new InterpreterResult(InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.IMG, image) + } + //TODO: If the html contains a link to a file, transform it to a DataURI. This is necessary for htmlwidgets + case x: Array[String] if x contains ("html") => { + val html: String = RInterpreter.processHTML(rContext.evalS0(s"rzeppelin:::.z.repr(.zreplout[[${i}]])")) + return new InterpreterResult(InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.HTML, html) + } + case x: Array[String] if x contains "data.frame" => { + val table: Array[String] = rContext.evalS1( s"""rzeppelin:::.z.table(.zreplout[[${i}]])""") + return new InterpreterResult(InterpreterResult.Code.SUCCESS, + InterpreterResult.Type.TABLE, + table.mkString(sep = "\n")) + } + case x: Array[String] if x contains "source" => rContext.evalS0(s".zreplout[[${i}]]" + "$src") + case x: Array[String] if x contains "character" => rContext.evalS0(s".zreplout[[${i}]]") + case x: Array[String] if x contains "packageStartupMessage" => if (firstCell) {""} else { + firstCell = true + "Package Startup Message: " + rContext.evalS1(s"rzeppelin:::.z.repr(.zreplout[[${i}]])").mkString("\n") + } + case x: Array[String] if x contains "simpleError" => { + gotError = true + val error = rContext.evalS1(s"rzeppelin:::.z.repr(.zreplout[[${i}]])").mkString("\n") + logger.error(error) + error + } + case _ => rContext.evalS1(s"rzeppelin:::.z.repr(.zreplout[[${i}]])").mkString("\n") + } + }).mkString("\n\n") + return new InterpreterResult({ + if (!gotError) InterpreterResult.Code.SUCCESS + else InterpreterResult.Code.ERROR + }, result) + } catch { + case re: RException => return re.getInterpreterResult(st) + case e: Exception => { + logger.error("Error interpreting " + st, e) + return new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage() + e.getStackTrace) + } + } + } + } +} diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/package.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/package.scala new file mode 100644 index 00000000000..d3541074a14 --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/package.scala @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin + +// TODO: Keeping interpreter out of spark interpreter group for now, until the context sharing code is developed +// TEST: rmr2 +// TODO: Link getProgress to plyr (and knitr progress) if possible +// TODO: Forms? +// TODO: Completion? Currently commented-out +// TODO: It would be nice if the RReplInterpreter output svg instead of jpg, or intelligently selected, at a minimum +// TODO: Some kind of proxy may be necessary for shiny and widgets see http://blog.dominodatalab.com/interactive-dashboards-with-knitr-and-html-widgets/ + +package object rinterpreter { +} diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/Package.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/Package.scala new file mode 100644 index 00000000000..4028dd50d30 --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/Package.scala @@ -0,0 +1,39 @@ +package org.apache.zeppelin.rinterpreter +/* +Copyright (c) 2013-2015, David B. Dahl, Brigham Young University + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package object rscala { + + val Version = "0.1.0" + + val Date = "2015-05-15" + +} diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RClient.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RClient.scala new file mode 100644 index 00000000000..b73524e3c69 --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RClient.scala @@ -0,0 +1,527 @@ +/* +Copyright (c) 2013-2015, David B. Dahl, Brigham Young University + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.apache.zeppelin.rinterpreter.rscala + +// TODO: Add libdir to constructor + +import java.io._ +import java.net.{InetAddress, ServerSocket} + +import org.slf4j.{Logger, LoggerFactory} + +import scala.language.dynamics + +class RClient (private val in: DataInputStream, + private val out: DataOutputStream, + val debug: Boolean = true) extends Dynamic { + var damagedState : Boolean = false + private val logger: Logger = LoggerFactory.getLogger(getClass) + + case class RObjectRef(val reference : String) { + override def toString() = ".$"+reference + } + + /** __For rscala developers only__: Sets whether debugging output should be displayed. */ + def debug_=(v: Boolean) = { + if ( v != debug ) { + if ( debug ) logger.debug("Sending DEBUG request.") + out.writeInt(RClient.Protocol.DEBUG) + out.writeInt(if ( v ) 1 else 0) + out.flush() + } + } + + def exit() = { + logger.debug("Sending EXIT request.") + out.writeInt(RClient.Protocol.EXIT) + out.flush() + } + + def eval(snippet: String, evalOnly: Boolean = true): Any = try { + if (damagedState) throw new RException("Connection to R already damaged") + logger.debug("Sending EVAL request.") + out.writeInt(RClient.Protocol.EVAL) + RClient.writeString(out,snippet) + out.flush() + val status = in.readInt() + val output = RClient.readString(in) + if ( output != "" ) { + logger.error("R Error " + snippet + " " + output) + throw new RException(snippet, output) + } + if ( status != RClient.Protocol.OK ) throw new RException(snippet, output, "Error in R evaluation.") + if ( evalOnly ) null else get(".rzeppelin.last.value")._1 + } catch { + case e : java.net.SocketException => { + logger.error("Connection to R appears to have shut down" + e) + damagedState = true + } + } + + def evalI0(snippet: String) = { eval(snippet,true); getI0(".rzeppelin.last.value") } + + def evalB0(snippet: String) = { eval(snippet,true); getB0(".rzeppelin.last.value") } + + def evalS0(snippet: String) = { eval(snippet,true); getS0(".rzeppelin.last.value") } + + def evalI1(snippet: String) = { eval(snippet,true); getI1(".rzeppelin.last.value") } + + def evalB1(snippet: String) = { eval(snippet,true); getB1(".rzeppelin.last.value") } + + def evalS1(snippet: String) = { eval(snippet,true); getS1(".rzeppelin.last.value") } + + def evalR( snippet: String) = { eval(snippet,true); getR( ".rzeppelin.last.value") } + + def set(identifier: String, value: Any): Unit = set(identifier,value,"",true) + + def set(identifier: String, value: Any, index: String = "", singleBrackets: Boolean = true): Unit = { + if (damagedState) throw new RException("Connection to R already damaged") + val v = value + if ( index == "" ) out.writeInt(RClient.Protocol.SET) + else if ( singleBrackets ) { + out.writeInt(RClient.Protocol.SET_SINGLE) + RClient.writeString(out,index) + } else { + out.writeInt(RClient.Protocol.SET_DOUBLE) + RClient.writeString(out,index) + } + RClient.writeString(out,identifier) + if ( v == null || v.isInstanceOf[Unit] ) { + logger.debug("... which is null") + out.writeInt(RClient.Protocol.NULLTYPE) + out.flush() + if ( index != "" ) { + val status = in.readInt() + if ( status != RClient.Protocol.OK ) { + val output = RClient.readString(in) + if ( output != "" ) { + logger.error("R error setting " + output) + throw new RException(identifier + value.toString(), output, "Error setting") + } + throw new RException("Error in R evaluation. Set " + identifier + " to " + value.toString()) + } + } + return + } + val c = v.getClass + logger.debug("... whose class is: "+c) + logger.debug("... and whose value is: "+v) + if ( c.isArray ) { + c.getName match { + case "[I" => + val vv = v.asInstanceOf[Array[Int]] + out.writeInt(RClient.Protocol.VECTOR) + out.writeInt(vv.length) + out.writeInt(RClient.Protocol.INTEGER) + for ( i <- 0 until vv.length ) out.writeInt(vv(i)) + case "[Z" => + val vv = v.asInstanceOf[Array[Boolean]] + out.writeInt(RClient.Protocol.VECTOR) + out.writeInt(vv.length) + out.writeInt(RClient.Protocol.BOOLEAN) + for ( i <- 0 until vv.length ) out.writeInt(if ( vv(i) ) 1 else 0) + case "[Ljava.lang.String;" => + val vv = v.asInstanceOf[Array[String]] + out.writeInt(RClient.Protocol.VECTOR) + out.writeInt(vv.length) + out.writeInt(RClient.Protocol.STRING) + for ( i <- 0 until vv.length ) RClient.writeString(out,vv(i)) + case _ => + throw new RException("Unsupported array type: "+c.getName) + } + } else { + c.getName match { + case "java.lang.Integer" => + out.writeInt(RClient.Protocol.ATOMIC) + out.writeInt(RClient.Protocol.INTEGER) + out.writeInt(v.asInstanceOf[Int]) + case "java.lang.Boolean" => + out.writeInt(RClient.Protocol.ATOMIC) + out.writeInt(RClient.Protocol.BOOLEAN) + out.writeInt(if (v.asInstanceOf[Boolean]) 1 else 0) + case "java.lang.String" => + out.writeInt(RClient.Protocol.ATOMIC) + out.writeInt(RClient.Protocol.STRING) + RClient.writeString(out,v.asInstanceOf[String]) + case _ => + throw new RException("Unsupported non-array type: "+c.getName) + } + } + out.flush() + if ( index != "" ) { + val status = in.readInt() + if ( status != RClient.Protocol.OK ) { + val output = RClient.readString(in) + if ( output != "" ) throw new RException(identifier + value.toString(), output, "Error setting") + throw new RException("Error in R evaluation.") + } + } + } + + def get(identifier: String, asReference: Boolean = false): (Any,String) = { + logger.debug("Getting: "+identifier) + out.writeInt(if ( asReference ) RClient.Protocol.GET_REFERENCE else RClient.Protocol.GET) + RClient.writeString(out,identifier) + out.flush() + if ( asReference ) { + val r = in.readInt() match { + case RClient.Protocol.REFERENCE => (RObjectRef(RClient.readString(in)),"RObject") + case RClient.Protocol.UNDEFINED_IDENTIFIER => + throw new RException("Undefined identifier") + } + return r + } + in.readInt match { + case RClient.Protocol.NULLTYPE => + logger.debug("Getting null.") + (null,"Null") + case RClient.Protocol.ATOMIC => + logger.debug("Getting atomic.") + in.readInt() match { + case RClient.Protocol.INTEGER => (in.readInt(),"Int") + case RClient.Protocol.DOUBLE => (in.readDouble(),"Double") + case RClient.Protocol.BOOLEAN => (( in.readInt() != 0 ),"Boolean") + case RClient.Protocol.STRING => (RClient.readString(in),"String") + case _ => throw new RException("Protocol error") + } + case RClient.Protocol.VECTOR => + logger.debug("Getting vector...") + val length = in.readInt() + logger.debug("... of length: "+length) + in.readInt() match { + case RClient.Protocol.INTEGER => (Array.fill(length) { in.readInt() },"Array[Int]") + case RClient.Protocol.DOUBLE => (Array.fill(length) { in.readDouble() },"Array[Double]") + case RClient.Protocol.BOOLEAN => (Array.fill(length) { ( in.readInt() != 0 ) },"Array[Boolean]") + case RClient.Protocol.STRING => (Array.fill(length) { RClient.readString(in) },"Array[String]") + case _ => throw new RException("Protocol error") + } + case RClient.Protocol.MATRIX => + logger.debug("Getting matrix...") + val nrow = in.readInt() + val ncol = in.readInt() + logger.debug("... of dimensions: "+nrow+","+ncol) + in.readInt() match { + case RClient.Protocol.INTEGER => (Array.fill(nrow) { Array.fill(ncol) { in.readInt() } },"Array[Array[Int]]") + case RClient.Protocol.DOUBLE => (Array.fill(nrow) { Array.fill(ncol) { in.readDouble() } },"Array[Array[Double]]") + case RClient.Protocol.BOOLEAN => (Array.fill(nrow) { Array.fill(ncol) { ( in.readInt() != 0 ) } },"Array[Array[Boolean]]") + case RClient.Protocol.STRING => (Array.fill(nrow) { Array.fill(ncol) { RClient.readString(in) } },"Array[Array[String]]") + case _ => throw new RException("Protocol error") + } + case RClient.Protocol.UNDEFINED_IDENTIFIER => throw new RException("Undefined identifier") + case RClient.Protocol.UNSUPPORTED_STRUCTURE => throw new RException("Unsupported data type") + case _ => throw new RException("Protocol error") + } + } + + def getI0(identifier: String): Int = get(identifier) match { + case (a,"Int") => a.asInstanceOf[Int] + case (a,"Double") => a.asInstanceOf[Double].toInt + case (a,"Boolean") => if (a.asInstanceOf[Boolean]) 1 else 0 + case (a,"String") => a.asInstanceOf[String].toInt + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]](0) + case (a,"Array[Double]") => a.asInstanceOf[Array[Double]](0).toInt + case (a,"Array[Boolean]") => if ( a.asInstanceOf[Array[Boolean]](0) ) 1 else 0 + case (a,"Array[String]") => a.asInstanceOf[Array[String]](0).toInt + case (_,tp) => throw new RException(s"Unable to cast ${tp} to Int") + } + + def getD0(identifier: String): Double = get(identifier) match { + case (a,"Int") => a.asInstanceOf[Int].toDouble + case (a,"Double") => a.asInstanceOf[Double] + case (a,"Boolean") => if (a.asInstanceOf[Boolean]) 1.0 else 0.0 + case (a,"String") => a.asInstanceOf[String].toDouble + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]](0).toDouble + case (a,"Array[Double]") => a.asInstanceOf[Array[Double]](0) + case (a,"Array[Boolean]") => if ( a.asInstanceOf[Array[Boolean]](0) ) 1.0 else 0.0 + case (a,"Array[String]") => a.asInstanceOf[Array[String]](0).toDouble + case (_,tp) => throw new RException(s"Unable to cast ${tp} to Double") + } + + def getB0(identifier: String): Boolean = get(identifier) match { + case (a,"Int") => a.asInstanceOf[Int] != 0 + case (a,"Boolean") => a.asInstanceOf[Boolean] + case (a,"String") => a.asInstanceOf[String].toLowerCase != "false" + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]](0) != 0 + case (a,"Array[Boolean]") => a.asInstanceOf[Array[Boolean]](0) + case (a,"Array[String]") => a.asInstanceOf[Array[String]](0).toLowerCase != "false" + case (_,tp) => throw new RException(s"Unable to cast ${tp} to Boolean") + } + + def getS0(identifier: String): String = get(identifier) match { + case (a,"Int") => a.asInstanceOf[Int].toString + case (a,"Boolean") => a.asInstanceOf[Boolean].toString + case (a,"String") => a.asInstanceOf[String] + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]](0).toString + case (a,"Array[Boolean]") => a.asInstanceOf[Array[Boolean]](0).toString + case (a,"Array[String]") => a.asInstanceOf[Array[String]](0) + case (_,tp) => throw new RException(s"Unable to cast ${tp} to String") + } + + def getI1(identifier: String): Array[Int] = get(identifier) match { + case (a,"Int") => Array(a.asInstanceOf[Int]) + case (a,"Boolean") => Array(if (a.asInstanceOf[Boolean]) 1 else 0) + case (a,"String") => Array(a.asInstanceOf[String].toInt) + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]] + case (a,"Array[Boolean]") => a.asInstanceOf[Array[Boolean]].map(x => if (x) 1 else 0) + case (a,"Array[String]") => a.asInstanceOf[Array[String]].map(_.toInt) + case (_,tp) => throw new RException(s"Unable to cast ${tp} to Array[Int]") + } + + def getB1(identifier: String): Array[Boolean] = get(identifier) match { + case (a,"Int") => Array(a.asInstanceOf[Int] != 0) + case (a,"Boolean") => Array(a.asInstanceOf[Boolean]) + case (a,"String") => Array(a.asInstanceOf[String].toLowerCase != "false") + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]].map(_ != 0) + case (a,"Array[Boolean]") => a.asInstanceOf[Array[Boolean]] + case (a,"Array[String]") => a.asInstanceOf[Array[String]].map(_.toLowerCase != "false") + case (_,tp) => throw new RException(s"Unable to cast ${tp} to Array[Boolean]") + } + + def getS1(identifier: String): Array[String] = get(identifier) match { + case (a,"Int") => Array(a.asInstanceOf[Int].toString) + case (a,"Boolean") => Array(a.asInstanceOf[Boolean].toString) + case (a,"String") => Array(a.asInstanceOf[String]) + case (a,"Array[Int]") => a.asInstanceOf[Array[Int]].map(_.toString) + case (a,"Array[Boolean]") => a.asInstanceOf[Array[Boolean]].map(_.toString) + case (a,"Array[String]") => a.asInstanceOf[Array[String]] + case (_,tp) => throw new RException(s"Unable to cast ${tp} to Array[String]") + } + + def getR(identifier: String): RObjectRef = get(identifier,true) match { + case (a,"RObject") => a.asInstanceOf[RObjectRef] + case (_,tp) => throw new RException(s"Unable to cast ${tp} to RObject") + } + + def gc(): Unit = { + logger.debug("Sending GC request.") + out.writeInt(RClient.Protocol.GC) + out.flush() + } + + + +} + +object RClient { + + object Protocol { + + // Data Types + val UNSUPPORTED_TYPE = 0 + val INTEGER = 1 + val DOUBLE = 2 + val BOOLEAN = 3 + val STRING = 4 + val DATE = 5 + val DATETIME = 6 + + // Data Structures + val UNSUPPORTED_STRUCTURE = 10 + val NULLTYPE = 11 + val REFERENCE = 12 + val ATOMIC = 13 + val VECTOR = 14 + val MATRIX = 15 + val LIST = 16 + val DATAFRAME = 17 + val S3CLASS = 18 + val S4CLASS = 19 + val JOBJ = 20 + + // Commands + val EXIT = 100 + val RESET = 101 + val GC = 102 + val DEBUG = 103 + val EVAL = 104 + val SET = 105 + val SET_SINGLE = 106 + val SET_DOUBLE = 107 + val GET = 108 + val GET_REFERENCE = 109 + val DEF = 110 + val INVOKE = 111 + val SCALAP = 112 + + // Result + val OK = 1000 + val ERROR = 1001 + val UNDEFINED_IDENTIFIER = 1002 + + // Misc. + val CURRENT_SUPPORTED_SCALA_VERSION = "2.10" + + } + + def writeString(out: DataOutputStream, string: String): Unit = { + val bytes = string.getBytes("UTF-8") + val length = bytes.length + out.writeInt(length) + out.write(bytes,0,length) + } + + def readString(in: DataInputStream): String = { + val length = in.readInt() + val bytes = new Array[Byte](length) + in.readFully(bytes) + new String(bytes,"UTF-8") + } + + def isMatrix[T](x: Array[Array[T]]): Boolean = { + if ( x.length != 0 ) { + val len = x(0).length + for ( i <- 1 until x.length ) { + if ( x(i).length != len ) return false + } + } + true + } + + import scala.sys.process._ + private val logger: Logger = LoggerFactory.getLogger(getClass) + val OS = sys.props("os.name").toLowerCase match { + case s if s.startsWith("""windows""") => "windows" + case s if s.startsWith("""linux""") => "linux" + case s if s.startsWith("""unix""") => "linux" + case s if s.startsWith("""mac""") => "macintosh" + case _ => throw new RException("Unrecognized OS") + } + + val defaultArguments = OS match { + case "windows" => Array[String]("--vanilla","--silent","--slave","--ess") + case "linux" => Array[String]("--vanilla","--silent","--slave","--interactive") + case "unix" => Array[String]("--vanilla","--silent","--slave","--interactive") + case "macintosh" => Array[String]("--vanilla","--silent","--slave","--interactive") + } + + lazy val defaultRCmd = OS match { + case "windows" => findROnWindows + case "linux" => """R""" + case "unix" => """R""" + case "macintosh" => """R""" + } + + def findROnWindows: String = { + val NEWLINE = sys.props("line.separator") + var result : String = null + for ( root <- List("HKEY_LOCAL_MACHINE","HKEY_CURRENT_USER") ) { + val out = new StringBuilder() + val logger = ProcessLogger((o: String) => { out.append(o); out.append(NEWLINE) },(e: String) => {}) + try { + ("reg query \"" + root + "\\Software\\R-core\\R\" /v \"InstallPath\"") ! logger + val a = out.toString.split(NEWLINE).filter(_.matches("""^\s*InstallPath\s*.*"""))(0) + result = a.split("REG_SZ")(1).trim() + """\bin\R.exe""" + } catch { + case _ : Throwable => + } + } + if ( result == null ) throw new RException("Cannot locate R using Windows registry.") + else return result + } + + def reader(label: String)(input: InputStream) = { + val in = new BufferedReader(new InputStreamReader(input)) + var line = in.readLine() + while ( line != null ) { + logger.debug(label+line) + line = in.readLine() + } + in.close() + } + + class ScalaSockets(portsFilename: String) { + private val logger: Logger = LoggerFactory.getLogger(getClass) + + val serverIn = new ServerSocket(0,0,InetAddress.getByName(null)) + val serverOut = new ServerSocket(0,0,InetAddress.getByName(null)) + + locally { + logger.info("Trying to open ports filename: "+portsFilename) + val portNumberFile = new File(portsFilename) + val p = new PrintWriter(portNumberFile) + p.println(serverIn.getLocalPort+" "+serverOut.getLocalPort) + p.close() + logger.info("Servers are running on port "+serverIn.getLocalPort+" "+serverOut.getLocalPort) + } + + val socketIn = serverIn.accept + logger.info("serverinaccept done") + val in = new DataInputStream(new BufferedInputStream(socketIn.getInputStream)) + logger.info("in has been created") + val socketOut = serverOut.accept + logger.info("serverouacceptdone") + val out = new DataOutputStream(new BufferedOutputStream(socketOut.getOutputStream)) + logger.info("out is done") + } + + def makeSockets(portsFilename : String) = new ScalaSockets(portsFilename) + + def apply(): RClient = apply(defaultRCmd) + + def apply(rCmd: String, libdir : String = "",debug: Boolean = false, timeout: Int = 60): RClient = { + logger.debug("Creating processIO") + var cmd: PrintWriter = null + val command = rCmd +: defaultArguments + val processCmd = Process(command) + + val processIO = new ProcessIO( + o => { cmd = new PrintWriter(o) }, + reader("STDOUT DEBUG: "), + reader("STDERR DEBUG: "), + true + ) + val portsFile = File.createTempFile("rscala-","") + val processInstance = processCmd.run(processIO) + val snippet = s""" +rscala:::rServe(rscala:::newSockets('${portsFile.getAbsolutePath.replaceAll(File.separator,"/")}',debug=${if ( debug ) "TRUE" else "FALSE"},timeout=${timeout})) +q(save='no') + """ + while ( cmd == null ) Thread.sleep(100) + logger.info("sending snippet " + snippet) + cmd.println(snippet) + cmd.flush() + val sockets = makeSockets(portsFile.getAbsolutePath) + sockets.out.writeInt(Protocol.OK) + sockets.out.flush() + try { + assert( readString(sockets.in) == org.apache.zeppelin.rinterpreter.rscala.Version ) + } catch { + case _: Throwable => throw new RException("The scala and R versions of the package don't match") + } + apply(sockets.in,sockets.out) + } + + /** __For rscala developers only__: Returns an instance of the [[RClient]] class. */ + def apply(in: DataInputStream, out: DataOutputStream): RClient = new RClient(in,out) + +} \ No newline at end of file diff --git a/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RException.scala b/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RException.scala new file mode 100644 index 00000000000..43d129ddbac --- /dev/null +++ b/r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RException.scala @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter.rscala + +import org.apache.zeppelin.interpreter.InterpreterResult + +class RException(val snippet : String, val error : String, val message : String = "") extends Exception { + + def this(snippet : String) = this(snippet, "") + + def getInterpreterResult : InterpreterResult = new + InterpreterResult(InterpreterResult.Code.ERROR, message + "\n" + snippet + "\n" + error) + + def getInterpreterResult(st : String) : InterpreterResult = new + InterpreterResult(InterpreterResult.Code.ERROR, message + "\n" + st + "\n" + error) +} diff --git a/r/src/main/scala/scala/Console.scala b/r/src/main/scala/scala/Console.scala new file mode 100644 index 00000000000..6b8f93c0581 --- /dev/null +++ b/r/src/main/scala/scala/Console.scala @@ -0,0 +1,491 @@ +/* __ *\ +Copyright (c) 2002-2016 EPFL +Copyright (c) 2011-2016 Lightbend, Inc. (formerly Typesafe, Inc.) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Neither the name of the EPFL nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF M MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +package scala + +import java.io.{BufferedReader, InputStream, InputStreamReader, + IOException, OutputStream, PrintStream, Reader} +import java.text.MessageFormat +import scala.util.DynamicVariable + + +/** Implements functionality for + * printing Scala values on the terminal as well as reading specific values. + * Also defines constants for marking up text on ANSI terminals. + * + * @author Matthias Zenger + * @version 1.0, 03/09/2003 + */ +object Console { + + /** Foreground color for ANSI black */ + final val BLACK = "\033[30m" + /** Foreground color for ANSI red */ + final val RED = "\033[31m" + /** Foreground color for ANSI green */ + final val GREEN = "\033[32m" + /** Foreground color for ANSI yellow */ + final val YELLOW = "\033[33m" + /** Foreground color for ANSI blue */ + final val BLUE = "\033[34m" + /** Foreground color for ANSI magenta */ + final val MAGENTA = "\033[35m" + /** Foreground color for ANSI cyan */ + final val CYAN = "\033[36m" + /** Foreground color for ANSI white */ + final val WHITE = "\033[37m" + + /** Background color for ANSI black */ + final val BLACK_B = "\033[40m" + /** Background color for ANSI red */ + final val RED_B = "\033[41m" + /** Background color for ANSI green */ + final val GREEN_B = "\033[42m" + /** Background color for ANSI yellow */ + final val YELLOW_B = "\033[43m" + /** Background color for ANSI blue */ + final val BLUE_B = "\033[44m" + /** Background color for ANSI magenta */ + final val MAGENTA_B = "\033[45m" + /** Background color for ANSI cyan */ + final val CYAN_B = "\033[46m" + /** Background color for ANSI white */ + final val WHITE_B = "\033[47m" + + /** Reset ANSI styles */ + final val RESET = "\033[0m" + /** ANSI bold */ + final val BOLD = "\033[1m" + /** ANSI underlines */ + final val UNDERLINED = "\033[4m" + /** ANSI blink */ + final val BLINK = "\033[5m" + /** ANSI reversed */ + final val REVERSED = "\033[7m" + /** ANSI invisible */ + final val INVISIBLE = "\033[8m" + + // From Scala 2.10.5 + // Start of rscala patch which only takes effect if RSCALA_TUNNELING environment variable is TRUE. + val baosOut = new java.io.ByteArrayOutputStream() + val baosErr = new java.io.ByteArrayOutputStream() + val psOut = new java.io.PrintStream(baosOut,true) + val psErr = new java.io.PrintStream(baosErr,true) + val originalOut = java.lang.System.out + val originalErr = java.lang.System.err + try { + if ( sys.env("RSCALA_TUNNELING") == "TRUE" ) { + java.lang.System.setOut(psOut) + java.lang.System.setErr(psErr) + } + } catch { + case _: Throwable => + } + // End of rscala patch. + + private val outVar = new DynamicVariable[PrintStream](java.lang.System.out) + private val errVar = new DynamicVariable[PrintStream](java.lang.System.err) + private val inVar = new DynamicVariable[BufferedReader]( + new BufferedReader(new InputStreamReader(java.lang.System.in))) + + /** The default output, can be overridden by `setOut` */ + def out = outVar.value + /** The default error, can be overridden by `setErr` */ + def err = errVar.value + /** The default input, can be overridden by `setIn` */ + def in = inVar.value + + /** Sets the default output stream. + * + * @param out the new output stream. + */ + def setOut(out: PrintStream) { outVar.value = out } + + /** Sets the default output stream for the duration + * of execution of one thunk. + * + * @example {{{ + * withOut(Console.err) { println("This goes to default _error_") } + * }}} + * + * @param out the new output stream. + * @param thunk the code to execute with + * the new output stream active + * @return the results of `thunk` + * @see `withOut[T](out:OutputStream)(thunk: => T)` + */ + def withOut[T](out: PrintStream)(thunk: =>T): T = + outVar.withValue(out)(thunk) + + /** Sets the default output stream. + * + * @param out the new output stream. + */ + def setOut(out: OutputStream): Unit = + setOut(new PrintStream(out)) + + /** Sets the default output stream for the duration + * of execution of one thunk. + * + * @param out the new output stream. + * @param thunk the code to execute with + * the new output stream active + * @return the results of `thunk` + * @see `withOut[T](out:PrintStream)(thunk: => T)` + */ + def withOut[T](out: OutputStream)(thunk: =>T): T = + withOut(new PrintStream(out))(thunk) + + + /** Sets the default error stream. + * + * @param err the new error stream. + */ + def setErr(err: PrintStream) { errVar.value = err } + + /** Set the default error stream for the duration + * of execution of one thunk. + * @example {{{ + * withErr(Console.out) { println("This goes to default _out_") } + * }}} + * + * @param err the new error stream. + * @param thunk the code to execute with + * the new error stream active + * @return the results of `thunk` + * @see `withErr[T](err:OutputStream)(thunk: =>T)` + */ + def withErr[T](err: PrintStream)(thunk: =>T): T = + errVar.withValue(err)(thunk) + + /** Sets the default error stream. + * + * @param err the new error stream. + */ + def setErr(err: OutputStream): Unit = + setErr(new PrintStream(err)) + + /** Sets the default error stream for the duration + * of execution of one thunk. + * + * @param err the new error stream. + * @param thunk the code to execute with + * the new error stream active + * @return the results of `thunk` + * @see `withErr[T](err:PrintStream)(thunk: =>T)` + */ + def withErr[T](err: OutputStream)(thunk: =>T): T = + withErr(new PrintStream(err))(thunk) + + + /** Sets the default input stream. + * + * @param reader specifies the new input stream. + */ + def setIn(reader: Reader) { + inVar.value = new BufferedReader(reader) + } + + /** Sets the default input stream for the duration + * of execution of one thunk. + * + * @example {{{ + * val someFile:Reader = openFile("file.txt") + * withIn(someFile) { + * // Reads a line from file.txt instead of default input + * println(readLine) + * } + * }}} + * + * @param thunk the code to execute with + * the new input stream active + * + * @return the results of `thunk` + * @see `withIn[T](in:InputStream)(thunk: =>T)` + */ + def withIn[T](reader: Reader)(thunk: =>T): T = + inVar.withValue(new BufferedReader(reader))(thunk) + + /** Sets the default input stream. + * + * @param in the new input stream. + */ + def setIn(in: InputStream) { + setIn(new InputStreamReader(in)) + } + + /** Sets the default input stream for the duration + * of execution of one thunk. + * + * @param in the new input stream. + * @param thunk the code to execute with + * the new input stream active + * @return the results of `thunk` + * @see `withIn[T](reader:Reader)(thunk: =>T)` + */ + def withIn[T](in: InputStream)(thunk: =>T): T = + withIn(new InputStreamReader(in))(thunk) + + /** Prints an object to `out` using its `toString` method. + * + * @param obj the object to print; may be null. + */ + def print(obj: Any) { + out.print(if (null == obj) "null" else obj.toString()) + } + + /** Flushes the output stream. This function is required when partial + * output (i.e. output not terminated by a newline character) has + * to be made visible on the terminal. + */ + def flush() { out.flush() } + + /** Prints a newline character on the default output. + */ + def println() { out.println() } + + /** Prints out an object to the default output, followed by a newline character. + * + * @param x the object to print. + */ + def println(x: Any) { out.println(x) } + + /** Prints its arguments as a formatted string to the default output, + * based on a string pattern (in a fashion similar to printf in C). + * + * The interpretation of the formatting patterns is described in + * + * `java.util.Formatter`. + * + * @param text the pattern for formatting the arguments. + * @param args the arguments used to instantiating the pattern. + * @throws java.lang.IllegalArgumentException if there was a problem with the format string or arguments + */ + def printf(text: String, args: Any*) { out.print(text format (args : _*)) } + + /** Read a full line from the default input. Returns `null` if the end of the + * input stream has been reached. + * + * @return the string read from the terminal or null if the end of stream was reached. + */ + def readLine(): String = in.readLine() + + /** Print formatted text to the default output and read a full line from the default input. + * Returns `null` if the end of the input stream has been reached. + * + * @param text the format of the text to print out, as in `printf`. + * @param args the parameters used to instantiate the format, as in `printf`. + * @return the string read from the default input + */ + def readLine(text: String, args: Any*): String = { + printf(text, args: _*) + readLine() + } + + /** Reads a boolean value from an entire line of the default input. + * Has a fairly liberal interpretation of the input. + * + * @return the boolean value read, or false if it couldn't be converted to a boolean + * @throws java.io.EOFException if the end of the input stream has been reached. + */ + def readBoolean(): Boolean = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toLowerCase() match { + case "true" => true + case "t" => true + case "yes" => true + case "y" => true + case _ => false + } + } + + /** Reads a byte value from an entire line of the default input. + * + * @return the Byte that was read + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.NumberFormatException if the value couldn't be converted to a Byte + */ + def readByte(): Byte = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toByte + } + + /** Reads a short value from an entire line of the default input. + * + * @return the short that was read + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.NumberFormatException if the value couldn't be converted to a Short + */ + def readShort(): Short = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toShort + } + + /** Reads a char value from an entire line of the default input. + * + * @return the Char that was read + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.StringIndexOutOfBoundsException if the line read from default input was empty + */ + def readChar(): Char = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s charAt 0 + } + + /** Reads an int value from an entire line of the default input. + * + * @return the Int that was read + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.NumberFormatException if the value couldn't be converted to an Int + */ + def readInt(): Int = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toInt + } + + /** Reads an long value from an entire line of the default input. + * + * @return the Long that was read + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.NumberFormatException if the value couldn't be converted to a Long + */ + def readLong(): Long = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toLong + } + + /** Reads a float value from an entire line of the default input. + * @return the Float that was read. + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.NumberFormatException if the value couldn't be converted to a Float + * + */ + def readFloat(): Float = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toFloat + } + + /** Reads a double value from an entire line of the default input. + * + * @return the Double that was read. + * @throws java.io.EOFException if the end of the + * input stream has been reached. + * @throws java.lang.NumberFormatException if the value couldn't be converted to a Float + */ + def readDouble(): Double = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + s.toDouble + } + + /** Reads in some structured input (from the default input), specified by + * a format specifier. See class `java.text.MessageFormat` for details of + * the format specification. + * + * @param format the format of the input. + * @return a list of all extracted values. + * @throws java.io.EOFException if the end of the input stream has been + * reached. + */ + def readf(format: String): List[Any] = { + val s = readLine() + if (s == null) + throw new java.io.EOFException("Console has reached end of input") + else + textComponents(new MessageFormat(format).parse(s)) + } + + /** Reads in some structured input (from the default input), specified by + * a format specifier, returning only the first value extracted, according + * to the format specification. + * + * @param format format string, as accepted by `readf`. + * @return The first value that was extracted from the input + */ + def readf1(format: String): Any = readf(format).head + + /** Reads in some structured input (from the default input), specified + * by a format specifier, returning only the first two values extracted, + * according to the format specification. + * + * @param format format string, as accepted by `readf`. + * @return A [[scala.Tuple2]] containing the first two values extracted + */ + def readf2(format: String): (Any, Any) = { + val res = readf(format) + (res.head, res.tail.head) + } + + /** Reads in some structured input (from the default input), specified + * by a format specifier, returning only the first three values extracted, + * according to the format specification. + * + * @param format format string, as accepted by `readf`. + * @return A [[scala.Tuple3]] containing the first three values extracted + */ + def readf3(format: String): (Any, Any, Any) = { + val res = readf(format) + (res.head, res.tail.head, res.tail.tail.head) + } + + private def textComponents(a: Array[AnyRef]): List[Any] = { + var i: Int = a.length - 1 + var res: List[Any] = Nil + while (i >= 0) { + res = (a(i) match { + case x: java.lang.Boolean => x.booleanValue() + case x: java.lang.Byte => x.byteValue() + case x: java.lang.Short => x.shortValue() + case x: java.lang.Character => x.charValue() + case x: java.lang.Integer => x.intValue() + case x: java.lang.Long => x.longValue() + case x: java.lang.Float => x.floatValue() + case x: java.lang.Double => x.doubleValue() + case x => x + }) :: res; + i -= 1 + } + res + } +} diff --git a/r/src/test/scala/org/apache/spark/api/r/RBackendHelperTest.scala b/r/src/test/scala/org/apache/spark/api/r/RBackendHelperTest.scala new file mode 100644 index 00000000000..cdc314dc2fc --- /dev/null +++ b/r/src/test/scala/org/apache/spark/api/r/RBackendHelperTest.scala @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.api.r + +import org.scalatest.FlatSpec +import org.scalatest.Matchers._ + +class RBackendHelperTest extends FlatSpec { + + val backend : RBackendHelper = RBackendHelper() + val backend2 : RBackendHelper = RBackendHelper() + + "RBackendHelper" should "create a SparkR backend" in { + val rbackend = backend + assert(true) // only looking for exceptions here + } + + it should "initialize properly, returning a port > 0" in { + val port = backend.init() + assert(port > 0) + } + + it should "start a thread" in { + val backend = backend2 + backend.init() + val thread = backend.start() + thread shouldBe a [Thread] + } + + it should "close without error" in { + backend2.close + assert(true) // only looking for exceptions + } +} diff --git a/r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextInitTest.scala b/r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextInitTest.scala new file mode 100644 index 00000000000..3d74e5802e7 --- /dev/null +++ b/r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextInitTest.scala @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter + +import java.io.{File, PrintWriter} +import java.nio.file.{Files, Paths} + +import org.apache.zeppelin.rinterpreter.rscala.RClient +import org.apache.zeppelin.rinterpreter.rscala.RClient._ +import org.scalatest.Matchers._ +import org.scalatest._ + +class RContextInitTest extends FlatSpec { + import scala.sys.process._ + var cmd: PrintWriter = null + val command = RClient.defaultRCmd +: RClient.defaultArguments + var processCmd : ProcessBuilder = null + + "Process command" should "create a process builder" in { + processCmd = Process(command) + processCmd shouldBe a[ProcessBuilder] + } + it should "be persistent for testing purposes" in { + processCmd shouldBe a [ProcessBuilder] + } + + var processIO : ProcessIO = null + + "Creating Process IO" should "not throw an exception" in { + processIO = new ProcessIO( + o => { + cmd = new PrintWriter(o) + }, + reader("STDOUT DEBUG: "), + reader("STDERR DEBUG: "), + true + ) + processIO shouldBe a [ProcessIO] + } + var portsFile : File = null + "A temp file " should "be created" in { + portsFile = File.createTempFile("rscala-", "") + assertResult(true) {portsFile.exists()} + } + var processInstance : Process = null + + "Process instance" should "launch" in { + processInstance = processCmd.run(processIO) + assert(true) + } + var libpath : String = null + "RZeppelin R Package" should "be found" in { + libpath = if (Files.exists(Paths.get("R/lib"))) "R/lib" + else if (Files.exists(Paths.get("../R/lib"))) "../R/lib" + else throw new RuntimeException("Could not find rzeppelin - it must be in either R/lib or ../R/lib") + assert(Files.exists(Paths.get(libpath + "/rzeppelin"))) + } + var snippet : String = null + + "Creating the snippit" should "be impossible to fail" in { + snippet = s""" +library(lib.loc="$libpath", rzeppelin) +rzeppelin:::rServe(rzeppelin:::newSockets('${portsFile.getAbsolutePath.replaceAll(File.separator, "/")}',debug=FALSE,timeout=60)) +q(save='no')""" + assert(true) + } + "Cmd" should "stop being null" in { + while (cmd == null) Thread.sleep(100) + assert(cmd != null) + } + it should "accept the snippet" in { + cmd.println(snippet) + cmd.flush() + assert(true) + } + + var sockets : ScalaSockets = null + + "Scala Sockets" should "be created and signal OK" in { + sockets = new ScalaSockets(portsFile.getAbsolutePath) + sockets.out.writeInt(RClient.Protocol.OK) + sockets.out.flush() + assert(true) + } + "The R and Scala versions" should "match" in { + assert(RClient.readString(sockets.in) == org.apache.zeppelin.rinterpreter.rscala.Version) + } + var rcon : RContext = null + "Creating an RContext" should "not fail" in { + rcon = new RContext(sockets, false) + } + "An open RContext" should "destroy safely" in { + rcon.close() + assertResult(false) { + rcon.isOpen + } + } +} \ No newline at end of file diff --git a/r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextTest.scala b/r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextTest.scala new file mode 100644 index 00000000000..8b11156ec4d --- /dev/null +++ b/r/src/test/scala/org/apache/zeppelin/rinterpreter/RContextTest.scala @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package org.apache.zeppelin.rinterpreter + +import java.util.Properties + +import org.apache.zeppelin.RTest +import org.apache.zeppelin.rinterpreter.rscala.RException +import org.apache.zeppelin.spark.SparkInterpreter +import org.scalatest.Matchers._ +import org.scalatest._ + +class RContextTest extends FlatSpec { + RContext.resetRcon() + + val rcon = RContext(new Properties(), "test") + + "The RContext Singleton" should "create an RContext without Spark" in { () => + rcon shouldBe a[RContext] + } + + "The RContext" should "be openable without spark" in { () => + rcon.open(None) + assert(rcon.isOpen) + } + + it should "be able to confirm that stats is available" taggedAs(RTest) in { () => + assertResult(true) { + rcon.testRPackage("stats") + } + } + + it should "be able to confirm that a bogus package is not available" taggedAs(RTest) in { () => + assertResult(false) { + rcon.testRPackage("thisisagarbagepackagename") + } + } + + it should "be able to add 2 + 2" taggedAs(RTest) in { () => + assertResult(4) { + rcon.evalI0("2 + 2") + } + } + it should "be able to return a vector" taggedAs(RTest) in { () => + assertResult(10) { + rcon.evalI1("1:10").length + } + } + it should "be able to return a string" taggedAs(RTest) in { () => + + assertResult("hello world") { + rcon.evalS0("'hello world'") + } + } + it should "be able to return a vector of strings" taggedAs(RTest) in { () => + + assertResult(26) { + rcon.evalS1("LETTERS").length + } + } + + it should "throw an RException if told to evaluate garbage code" taggedAs(RTest) in { () => + + intercept[RException] { + rcon.eval("funkyfunction()") + } + } + +// it should "Throw an exception if we try to initialize SparkR without a SQLContext" in {() => +// +// intercept[RuntimeException] { +// rcon.initializeSparkRTest() +// } +// } + + it should "have rzeppelin available" taggedAs(RTest) in { () => + + assertResult(true) { + rcon.testRPackage("rzeppelin") + } + } + it should "have evaluate available" taggedAs(RTest) in { () => + + assertResult(true) { + rcon.testRPackage("evaluate") + } + } + it should "have repr available" taggedAs(RTest) in { () => + + assertResult(true) { + rcon.testRPackage("repr") + } + } + it should "also close politely" taggedAs(RTest) in { () => + + rcon.close() + assertResult(2) {rcon.isOpen} + } +} diff --git a/r/src/test/scala/org/apache/zeppelin/rinterpreter/RInterpreterTest.scala b/r/src/test/scala/org/apache/zeppelin/rinterpreter/RInterpreterTest.scala new file mode 100644 index 00000000000..4b59b00af5a --- /dev/null +++ b/r/src/test/scala/org/apache/zeppelin/rinterpreter/RInterpreterTest.scala @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rinterpreter + +import java.util.Properties + +import org.apache.zeppelin.RTest +import org.apache.zeppelin.interpreter.{Interpreter, InterpreterContext, InterpreterResult, InterpreterGroup} +import org.scalatest.Matchers._ +import org.scalatest._ +import java.util.ArrayList + +class RInterpreterTest extends FlatSpec { + + RContext.resetRcon() + + class RIntTester extends RInterpreter(new Properties(), startSpark = false) { + + def interpret(s: String, interpreterContext: InterpreterContext): InterpreterResult = { + val result : Array[String] = rContext.evalS1(s) + new InterpreterResult(InterpreterResult.Code.SUCCESS, result.mkString("\n")) + } + } + val rint = new RIntTester() + + "An RInterpreter" should "exist" in { + assert(rint != null) + } + + it should "not complain when we assign it a group" in { + val grp : InterpreterGroup = new InterpreterGroup("test") + val lst : ArrayList[Interpreter] = new ArrayList[Interpreter]() + lst.add(rint) + grp.put(rint.getClassName(), lst) + rint.setInterpreterGroup(grp) + } + + it should "create a fresh rContext when we ask for one" in { + assert(! rint.getrContext.isOpen) + } + + it should "open" taggedAs(RTest) in { + rint.open() + assert(rint.getrContext.isOpen) + } + + it should "have rzeppelin available" taggedAs(RTest) in { + assume(rint.getrContext.isOpen) + assert(rint.getrContext.testRPackage("rzeppelin")) + } + it should "have an rContext able to do simple addition" taggedAs(RTest) in { + assume(rint.getrContext.isOpen) + assert(rint.getrContext.evalI0("2 + 2") == 4) + } + + + + it should "have a functional completion function" taggedAs(RTest) in { + val result = rint.hiddenCompletion("hi", 3) + result should (contain ("hist")) + } + + it should "have a working progress meter" in { + rint.getrContext.setProgress(50) + assertResult(50) { + rint.getrContext.getProgress + } + } + + it should "have persistent properties" in { + val props = new Properties() + props.setProperty("hello", "world") + rint.setProperty(props) + assertResult("world") { + rint.getProperty("hello") + } + } + + var rint2 : RIntTester = null + + it should "Share RContexts if they share the same InterpreterGroup" in { + rint2 = new RIntTester() + val lst : ArrayList[Interpreter] = new ArrayList[Interpreter]() + lst.add(rint2) + val grp = rint.getInterpreterGroup() + grp.put(rint2.getClassName(), lst) + rint2.setInterpreterGroup(grp) + rint2.open() + rint.getrContext should be theSameInstanceAs rint2.getrContext + } + + "Opening the second RInterpreter" should "not have closed the first RContext" in { + assert(rint.getrContext.isOpen) + } + + var rint3 : RIntTester = null + + "An RInterpreter in a different InterpreterGroup" should "have a different R Context" in { + rint3 = new RIntTester() + val grp : InterpreterGroup = new InterpreterGroup("othertest") + val lst : ArrayList[Interpreter] = new ArrayList[Interpreter]() + lst.add(rint3) + grp.put(rint3.getClassName(), lst) + rint3.setInterpreterGroup(grp) + rint3.open() + rint3.getrContext shouldNot be theSameInstanceAs rint2.getrContext + } + + "The first RInterpreter" should "close politely" in { + rint.close() + assert(!rint.getrContext.isOpen) + } + + "and so" should "the other one" in { + rint2.close() + assert(!rint2.getrContext.isOpen) + } + + "and " should "the third one" in { + rint3.close() + assert(!rint2.getrContext.isOpen) + } + +// fixture.sparky.close() + +} diff --git a/r/src/test/scala/org/apache/zeppelin/rinterpreter/WrapperTest.scala b/r/src/test/scala/org/apache/zeppelin/rinterpreter/WrapperTest.scala new file mode 100644 index 00000000000..43fb0d2c65c --- /dev/null +++ b/r/src/test/scala/org/apache/zeppelin/rinterpreter/WrapperTest.scala @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.zeppelin.rinterpreter + +import java.util +import java.util.Properties + +import org.apache.zeppelin.interpreter.{Interpreter, InterpreterGroup, InterpreterResult} +import org.scalatest.FlatSpec +import java.util.List +import org.scalatest.Matchers._ + +class WrapperTest extends FlatSpec { + RContext.resetRcon() + + val repl: RRepl = new RRepl(new Properties(), false) + val group : InterpreterGroup = new InterpreterGroup() + var lst = new util.LinkedList[Interpreter]() + lst.add(repl) + group.put(repl.getClassName(), lst) + repl.setInterpreterGroup(group) + + "The R REPL" should "exist and be of the right class" in { + + repl shouldBe a[RRepl] + } + + it should "Have a RRepl Interpreter inside" in { + repl.getInnerInterpreter shouldBe a[RReplInterpreter] + } + val repi = repl.getInnerInterpreter.asInstanceOf[RReplInterpreter] + + it should "have a fresh rContext" in { + assert(!repi.getrContext.isOpen) + } + + val knitr: KnitR = new KnitR(new Properties(), false) + lst = new util.LinkedList[Interpreter]() + lst.add(knitr) + group.put(knitr.getClassName(), lst) + knitr.setInterpreterGroup(group) + + "The KnitR wrapper" should "exist and be of the right class" in { + knitr shouldBe a[KnitR] + } + it should "have a KnitRInterpreter inside" in { + knitr.getInnerInterpreter shouldBe a [KnitRInterpreter] + } + + it should "share the RContext" in { + knitr.getInnerInterpreter.asInstanceOf[KnitRInterpreter].getrContext should be theSameInstanceAs repi.getrContext + } + + it should "open without error" in { + knitr.open() + assert(knitr.getInnerInterpreter.asInstanceOf[KnitRInterpreter].getrContext.isOpen) + } + + it should "produce HTML in response to a simple query" in { + val result = knitr.interpret( + """ + |```{r} + |2 + 2 + |``` + """.stripMargin, null) + withClue(result.message()) { + result should have ( + 'code (InterpreterResult.Code.SUCCESS), + 'type (InterpreterResult.Type.HTML) + ) + } + } + + it should "close properly" in { + repi.getrContext.close() + assertResult(false) { + repi.getrContext.isOpen + } + } + + "Just in case there are two rContexts, the other one" should "close properly also" in { + val rcon = knitr.getInnerInterpreter.asInstanceOf[KnitRInterpreter].getrContext + rcon.close() + assertResult(false) { + rcon.isOpen + } + } + +} diff --git a/r/src/test/scala/org/apache/zeppelin/rinterpreter/package.scala b/r/src/test/scala/org/apache/zeppelin/rinterpreter/package.scala new file mode 100644 index 00000000000..eceeec5d41d --- /dev/null +++ b/r/src/test/scala/org/apache/zeppelin/rinterpreter/package.scala @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin + +import org.scalatest.Tag + +object RTest extends Tag("RTest") +object SparkTest extends Tag("SparkTest") diff --git a/spark/pom.xml b/spark/pom.xml index a1c28af7832..ece746748c7 100644 --- a/spark/pom.xml +++ b/spark/pom.xml @@ -231,7 +231,6 @@ provided - org.scalatest diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java index eb1c0a2d206..2fa716b449e 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java @@ -72,7 +72,6 @@ public boolean isUnsupportedVersion() { return olderThan(MIN_SUPPORTED_VERSION) || newerThanEquals(UNSUPPORTED_FUTURE_VERSION); } - public static SparkVersion fromVersionString(String versionString) { return new SparkVersion(versionString); } @@ -81,6 +80,10 @@ public boolean isPysparkSupported() { return this.newerThanEquals(SPARK_1_2_0); } + public boolean isSparkRSupported() { + return this.newerThanEquals(SPARK_1_4_0); + } + public boolean hasDataFrame() { return this.newerThanEquals(SPARK_1_4_0); } diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java index 5a489fa2957..cdd1806da7c 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java @@ -41,187 +41,193 @@ * Spark cluster is started by CI server using testing/startSparkCluster.sh */ public class ZeppelinSparkClusterTest extends AbstractTestRestApi { - Gson gson = new Gson(); - - @BeforeClass - public static void init() throws Exception { - AbstractTestRestApi.startUp(); - } - - @AfterClass - public static void destroy() throws Exception { - AbstractTestRestApi.shutDown(); - } - - private void waitForFinish(Paragraph p) { - while (p.getStatus() != Status.FINISHED - && p.getStatus() != Status.ERROR - && p.getStatus() != Status.ABORT) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - LOG.error("Exception in WebDriverManager while getWebDriver ", e); - } + Gson gson = new Gson(); + + @BeforeClass + public static void init() throws Exception { + AbstractTestRestApi.startUp(); } - } - - @Test - public void basicRDDTransformationAndActionTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(); - - // run markdown paragraph, again - Paragraph p = note.addParagraph(); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark print(sc.parallelize(1 to 10).reduce(_ + _))"); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("55", p.getResult().message()); - ZeppelinServer.notebook.removeNote(note.id()); - } - - @Test - public void pySparkTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(); - int sparkVersion = getSparkVersionNumber(note); - - if (isPyspark() && sparkVersion >= 12) { // pyspark supported from 1.2.1 - // run markdown paragraph, again - Paragraph p = note.addParagraph(); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%pyspark print(sc.parallelize(range(1, 11)).reduce(lambda a, b: a + b))"); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("55\n", p.getResult().message()); + + @AfterClass + public static void destroy() throws Exception { + AbstractTestRestApi.shutDown(); } - ZeppelinServer.notebook.removeNote(note.id()); - } - - @Test - public void pySparkAutoConvertOptionTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(); - - int sparkVersion = getSparkVersionNumber(note); - - if (isPyspark() && sparkVersion >= 14) { // auto_convert enabled from spark 1.4 - // run markdown paragraph, again - Paragraph p = note.addParagraph(); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%pyspark\nfrom pyspark.sql.functions import *\n" - + "print(sqlContext.range(0, 10).withColumn('uniform', rand(seed=10) * 3.14).count())"); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - assertEquals("10\n", p.getResult().message()); + + private void waitForFinish(Paragraph p) { + while (p.getStatus() != Status.FINISHED + && p.getStatus() != Status.ERROR + && p.getStatus() != Status.ABORT) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + LOG.error("Exception in WebDriverManager while getWebDriver ", e); + } + } } - ZeppelinServer.notebook.removeNote(note.id()); - } - - @Test - public void zRunTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(); - Paragraph p0 = note.addParagraph(); - Map config0 = p0.getConfig(); - config0.put("enabled", true); - p0.setConfig(config0); - p0.setText("%spark z.run(1)"); - Paragraph p1 = note.addParagraph(); - Map config1 = p1.getConfig(); - config1.put("enabled", true); - p1.setConfig(config1); - p1.setText("%spark val a=10"); - Paragraph p2 = note.addParagraph(); - Map config2 = p2.getConfig(); - config2.put("enabled", true); - p2.setConfig(config2); - p2.setText("%spark print(a)"); - - note.run(p0.getId()); - waitForFinish(p0); - assertEquals(Status.FINISHED, p0.getStatus()); - - note.run(p2.getId()); - waitForFinish(p2); - assertEquals(Status.FINISHED, p2.getStatus()); - assertEquals("10", p2.getResult().message()); - - ZeppelinServer.notebook.removeNote(note.id()); - } - - @Test - public void pySparkDepLoaderTest() throws IOException { - // create new note - Note note = ZeppelinServer.notebook.createNote(); - - if (isPyspark() && getSparkVersionNumber(note) >= 14) { - // restart spark interpreter - List settings = - ZeppelinServer.notebook.getBindedInterpreterSettings(note.id()); - - for (InterpreterSetting setting : settings) { - if (setting.getGroup().equals("spark")) { - ZeppelinServer.notebook.getInterpreterFactory().restart(setting.id()); - break; + + @Test + public void basicRDDTransformationAndActionTest() throws IOException { + // create new note + Note note = ZeppelinServer.notebook.createNote(); + + // run markdown paragraph, again + Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); + p.setText("%spark print(sc.parallelize(1 to 10).reduce(_ + _))"); + note.run(p.getId()); + waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); + assertEquals("55", p.getResult().message()); + ZeppelinServer.notebook.removeNote(note.id()); + } + + @Test + public void pySparkTest() throws IOException { + // create new note + Note note = ZeppelinServer.notebook.createNote(); + note.setName("note"); + int sparkVersion = getSparkVersionNumber(note); + + if (isPyspark() && sparkVersion >= 12) { // pyspark supported from 1.2.1 + // run markdown paragraph, again + Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); + p.setText("%pyspark print(sc.parallelize(range(1, 11)).reduce(lambda a, b: a + b))"); +// p.getRepl("org.apache.zeppelin.spark.SparkInterpreter").open(); + note.run(p.getId()); + waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); + assertEquals("55\n", p.getResult().message()); } - } - - // load dep - Paragraph p0 = note.addParagraph(); - Map config = p0.getConfig(); - config.put("enabled", true); - p0.setConfig(config); - p0.setText("%dep z.load(\"com.databricks:spark-csv_2.11:1.2.0\")"); - note.run(p0.getId()); - waitForFinish(p0); - assertEquals(Status.FINISHED, p0.getStatus()); - - // write test csv file - File tmpFile = File.createTempFile("test", "csv"); - FileUtils.write(tmpFile, "a,b\n1,2"); - - // load data using libraries from dep loader - Paragraph p1 = note.addParagraph(); - p1.setConfig(config); - p1.setText("%pyspark\n" + - "from pyspark.sql import SQLContext\n" + - "print(sqlContext.read.format('com.databricks.spark.csv')" + - ".load('"+ tmpFile.getAbsolutePath() +"').count())"); - note.run(p1.getId()); - - waitForFinish(p1); - assertEquals(Status.FINISHED, p1.getStatus()); - assertEquals("2\n", p1.getResult().message()); + ZeppelinServer.notebook.removeNote(note.id()); + } + + @Test + public void pySparkAutoConvertOptionTest() throws IOException { + // create new note + Note note = ZeppelinServer.notebook.createNote(); + note.setName("note"); + + int sparkVersion = getSparkVersionNumber(note); + + if (isPyspark() && sparkVersion >= 14) { // auto_convert enabled from spark 1.4 + // run markdown paragraph, again + Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); + p.setText("%pyspark\nfrom pyspark.sql.functions import *\n" + + "print(sqlContext.range(0, 10).withColumn('uniform', rand(seed=10) * 3.14).count())"); +// p.getRepl("org.apache.zeppelin.spark.SparkInterpreter").open(); + note.run(p.getId()); + waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); + assertEquals("10\n", p.getResult().message()); + } + ZeppelinServer.notebook.removeNote(note.id()); + } + + @Test + public void zRunTest() throws IOException { + // create new note + Note note = ZeppelinServer.notebook.createNote(); + Paragraph p0 = note.addParagraph(); + Map config0 = p0.getConfig(); + config0.put("enabled", true); + p0.setConfig(config0); + p0.setText("%spark z.run(1)"); + Paragraph p1 = note.addParagraph(); + Map config1 = p1.getConfig(); + config1.put("enabled", true); + p1.setConfig(config1); + p1.setText("%spark val a=10"); + Paragraph p2 = note.addParagraph(); + Map config2 = p2.getConfig(); + config2.put("enabled", true); + p2.setConfig(config2); + p2.setText("%spark print(a)"); + + note.run(p0.getId()); + waitForFinish(p0); + assertEquals(Status.FINISHED, p0.getStatus()); + + note.run(p2.getId()); + waitForFinish(p2); + assertEquals(Status.FINISHED, p2.getStatus()); + assertEquals("10", p2.getResult().message()); + + ZeppelinServer.notebook.removeNote(note.id()); + } + + @Test + public void pySparkDepLoaderTest() throws IOException { + // create new note + Note note = ZeppelinServer.notebook.createNote(); + + if (isPyspark() && getSparkVersionNumber(note) >= 14) { + // restart spark interpreter + List settings = + ZeppelinServer.notebook.getBindedInterpreterSettings(note.id()); + + for (InterpreterSetting setting : settings) { + if (setting.getGroup().equals("spark")) { + ZeppelinServer.notebook.getInterpreterFactory().restart(setting.id()); + break; + } + } + + // load dep + Paragraph p0 = note.addParagraph(); + Map config = p0.getConfig(); + config.put("enabled", true); + p0.setConfig(config); + p0.setText("%dep z.load(\"com.databricks:spark-csv_2.11:1.2.0\")"); + note.run(p0.getId()); + waitForFinish(p0); + assertEquals(Status.FINISHED, p0.getStatus()); + + // write test csv file + File tmpFile = File.createTempFile("test", "csv"); + FileUtils.write(tmpFile, "a,b\n1,2"); + + // load data using libraries from dep loader + Paragraph p1 = note.addParagraph(); + p1.setConfig(config); + p1.setText("%pyspark\n" + + "from pyspark.sql import SQLContext\n" + + "print(sqlContext.read.format('com.databricks.spark.csv')" + + ".load('"+ tmpFile.getAbsolutePath() +"').count())"); + note.run(p1.getId()); + + waitForFinish(p1); + assertEquals(Status.FINISHED, p1.getStatus()); + assertEquals("2\n", p1.getResult().message()); + } + } + + /** + * Get spark version number as a numerical value. + * eg. 1.1.x => 11, 1.2.x => 12, 1.3.x => 13 ... + */ + private int getSparkVersionNumber(Note note) { + Paragraph p = note.addParagraph(); + note.setName("note"); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); + p.setText("%spark print(sc.version)"); +// p.getRepl("org.apache.zeppelin.spark.SparkInterpreter").open(); + note.run(p.getId()); + waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); + String sparkVersion = p.getResult().message(); + System.out.println("Spark version detected " + sparkVersion); + String[] split = sparkVersion.split("\\."); + int version = Integer.parseInt(split[0]) * 10 + Integer.parseInt(split[1]); + return version; } - } - - /** - * Get spark version number as a numerical value. - * eg. 1.1.x => 11, 1.2.x => 12, 1.3.x => 13 ... - */ - private int getSparkVersionNumber(Note note) { - Paragraph p = note.addParagraph(); - Map config = p.getConfig(); - config.put("enabled", true); - p.setConfig(config); - p.setText("%spark print(sc.version)"); - note.run(p.getId()); - waitForFinish(p); - assertEquals(Status.FINISHED, p.getStatus()); - String sparkVersion = p.getResult().message(); - System.out.println("Spark version detected " + sparkVersion); - String[] split = sparkVersion.split("\\."); - int version = Integer.parseInt(split[0]) * 10 + Integer.parseInt(split[1]); - return version; - } -} +} \ No newline at end of file diff --git a/zeppelin-web/bower.json b/zeppelin-web/bower.json index 330c408085b..c5fc7ab9332 100644 --- a/zeppelin-web/bower.json +++ b/zeppelin-web/bower.json @@ -47,6 +47,7 @@ "src-noconflict/mode-sql.js", "src-noconflict/mode-markdown.js", "src-noconflict/mode-sh.js", + "src-noconflict/mode-r.js", "src-noconflict/keybinding-emacs.js", "src-noconflict/ext-language_tools.js", "src-noconflict/theme-chrome.js" diff --git a/zeppelin-web/pom.xml b/zeppelin-web/pom.xml index 8878e9a8cdb..6fa62ae2d9b 100644 --- a/zeppelin-web/pom.xml +++ b/zeppelin-web/pom.xml @@ -124,6 +124,7 @@ build + --force diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html index bd0dbae7fe7..5c3a8ada71b 100644 --- a/zeppelin-web/src/index.html +++ b/zeppelin-web/src/index.html @@ -108,6 +108,7 @@ + diff --git a/zeppelin-web/test/karma.conf.js b/zeppelin-web/test/karma.conf.js index f6f9969bff6..320492f10ec 100644 --- a/zeppelin-web/test/karma.conf.js +++ b/zeppelin-web/test/karma.conf.js @@ -37,6 +37,7 @@ module.exports = function(config) { 'bower_components/ace-builds/src-noconflict/mode-sql.js', 'bower_components/ace-builds/src-noconflict/mode-markdown.js', 'bower_components/ace-builds/src-noconflict/mode-sh.js', + 'bower_components/ace-builds/src-noconflict/mode-r.js', 'bower_components/ace-builds/src-noconflict/keybinding-emacs.js', 'bower_components/ace-builds/src-noconflict/ext-language_tools.js', 'bower_components/ace-builds/src-noconflict/theme-chrome.js', diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java index b33391a7d02..fc11a41c8a8 100755 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java @@ -472,7 +472,9 @@ public static enum ConfVars { + "org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter," + "org.apache.zeppelin.scalding.ScaldingInterpreter," + "org.apache.zeppelin.jdbc.JDBCInterpreter," - + "org.apache.zeppelin.hbase.HbaseInterpreter"), + + "org.apache.zeppelin.hbase.HbaseInterpreter," + + "org.apache.zeppelin.rinterpreter.RRepl," + + "org.apache.zeppelin.rinterpreter.KnitR"), ZEPPELIN_INTERPRETER_DIR("zeppelin.interpreter.dir", "interpreter"), ZEPPELIN_INTERPRETER_LOCALREPO("zeppelin.interpreter.localRepo", "local-repo"), ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT("zeppelin.interpreter.connect.timeout", 30000), From ffc1a2541034f8eaf11beac7ffa2bd634613dd46 Mon Sep 17 00:00:00 2001 From: Amos Elb Date: Mon, 4 Apr 2016 13:29:41 -0400 Subject: [PATCH 2/2] Fix rat issue --- pom.xml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1cc2698c2ff..76f4a310898 100755 --- a/pom.xml +++ b/pom.xml @@ -513,6 +513,7 @@ docs/Rakefile docs/rss.xml docs/sitemap.txt + **/dependency-reduced-pom.xml docs/assets/themes/zeppelin/css/syntax.css @@ -521,8 +522,22 @@ docs/_site/** docs/Gemfile.lock - - R/lib/** + + R/lib/** + + + r/R/rzeppelin/R/globals.R + r/R/rzeppelin/R/common.R + r/R/rzeppelin/R/protocol.R + r/R/rzeppelin/R/rServer.R + r/R/rzeppelin/R/scalaInterpreter.R + r/R/rzeppelin/R/zzz.R + r/src/main/scala/scala/Console.scala + r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/Package.scala + r/src/main/scala/org/apache/zeppelin/rinterpreter/rscala/RClient.scala + + r/R/rzeppelin/DESCRIPTION + r/R/rzeppelin/NAMESPACE